2016-07-02 7 views
0

を解析に失敗:シンプルな文法は、私は次のような単純なANTLR文法を持っている

grammar Grammar; 

grammarRules : grammarRule+ ; 

grammarRule: 
    lhs '->' WORD+ 
    ; 

lhs: ID ; 

WORD : LETTER+ ; 

ID : LETTER (LETTER|'0'..'9')* ; 

fragment 
LETTER : [a-zA-Z\u0080-\u00FF_] ; 

WS : [ \t] -> skip ; 

私は、文字列「Webページ - > Google検索」を解析しようとすると、私はエラーを取得:

line 1:0 mismatched input 'webpage' expecting ID 

答えて

0

あなたの文法は壊れています。 WORDの定義はwebpageと一致します。これはレクサーが返すものなので、パーサはIDが見えないと不平を言う。

webpage1 -> google searchを解析すると、webpage1WORDではないため、正常に動作するはずです。

文法はLL(*)ではありません。例えば与えられる。 a - > b c d - > e fの場合、パーサーは、lexerに情報を戻すために第2の->を先読みする必要があり、dをと認識し、WORDではありません。 ANTLERはそれをしません。 (複雑になる可能性があり、その結果、レクサーをかなり遅くする可能性があるため、おそらくそれは望ましくないでしょう)

改行やセミコロンのような文ターミネーターを言語に追加することで問題を解決できます。

+0

だから、大きなポイントは、レクサーがパーサのステップとは全く別の層として実行されているように見えるので、レクサーはあいまいさの場合に何をするかを決める責任があります。その点で、私は文ターミネータを追加するとあいまいさの問題を解決するのはなぜか不思議です。 –

+0

@DanielBighamそうです。おそらくそれでは不十分です。あなたは 'lhs - > ID |のような何かをしなければならないでしょう。 WORD'。 ANTLRパーサはLL(*)なので、おそらくラインターミネータは必要ありません。 (もし彼らがLL(1)だったとしたら、 – Gene

+0

これは後で見つかるかもしれない人たちのために、私はAntlrであらゆる種類の奇妙な振る舞いをしていましたが、私は文法をリファクタリングして主要な文法は、異なる記号を持つ多くの規則に分解されるのではなく、単一の規則に含まれます。これは明らかに文法の左回帰をより良く扱うことを可能にする。 Presto、今はうまくいっています。 –

関連する問題