Lemon構文解析器で再帰的定義

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

Lemon構文解析器で再帰的定義

#1

投稿記事 by MoNoQLoREATOR » 10年前

Lemon構文解析器のお話です。

gram.y

コード:

list ::= Element.
という文法規則ファイルは正常に解析、変換してくれるのですが、

gram.y

コード:

list ::= Element.
list ::= list Element.
という文法規則ファイルを解析させようとすると

コード:

The start symbol "list" occurs on the right-hand side of a rule. This will result in a parser which does not work properly.
Assertion failed: apx->type==SH_RESOLVED || apx->type==RD_RESOLVED || apx->type==SSCONFLICT || apx->type==SRCONFLICT || apx->type==RRCONFLICT || apy->type==SH_RESOLVED || apy->type==RD_RESOLVED || apy->type==SSCONFLICT || apy->type==SRCONFLICT || apy->type==RRCONFLICT, file lemon.c, line 1215
と出力されてプログラムが強制終了します。

おそらく"list ::= list Element."のような再帰的(?)文法規則が定義されているとこの現象が発生するものと思われますが確証はありません。


追記:
~質問内容~
・何故 強制終了するようなエラーが起きるのか
・どのように改善したらエラーを起こさずLemonを実行完了させられるのか



環境:
OS windows8 64bit
lemonのバイナリを得る際にVisualStudio2013Expressを使用してビルド


よろしくお願いいたします。
最後に編集したユーザー MoNoQLoREATOR on 2014年2月19日(水) 13:54 [ 編集 1 回目 ]

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: Lemon構文解析器で再帰的定義

#2

投稿記事 by beatle » 10年前

質問は何でしょうか?

僕はLemon構文解析器は知らないので正確ではありませんが、左再帰は構文解析器泣かせの構文規則として知られています。
http://ja.wikipedia.org/wiki/%E5%B7%A6% ... D%E5%B8%B0

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

Re: Lemon構文解析器で再帰的定義

#3

投稿記事 by MoNoQLoREATOR » 10年前

失礼致しました。
質問は
・何故 強制終了するようなエラーが起きるのか
・どのように改善したらエラーを起こさずLemonを実行完了させられるのか
です。

Poco
記事: 161
登録日時: 13年前

Re: Lemon構文解析器で再帰的定義

#4

投稿記事 by Poco » 10年前

ここにエラーメッセージの原因っぽいことが書かれています。
http://www.geocities.jp/beruponu/memo/l ... ented.html
どうやら一番頭となる解析ルールは1つしか認められていないようで。
新ルールとしてhoge::= listを頭に追加したら解決するんじゃないでしょうか。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

Re: Lemon構文解析器で再帰的定義

#5

投稿記事 by MoNoQLoREATOR » 10年前

返信ありがとうございます。

仰るように、

コード:

program ::= list.
list ::= Element.
list ::= list Element.
とするとエラーを起こさずLemonさんがコンパイルを完了させてくれました。

こんな隠されたルールがあったのですね。

解決しました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る