2017-11-07 1 views
0

私は、この質問が何度も尋ねられたことを知っています。私はANTLRを使って文法を作ろうとしています。ANTLR文法が相互に反復帰ってきた

Predicate   : LOWERCASE | Predicate VarChars ; 

VarChars   : LOWERCASE | UPPERCASE; 

fragment LOWERCASE : [a-z] ; 

fragment UPPERCASE : [A-Z] ; 

私は、次のエラーを取得しています:「ルールの以下のセットは、相互に左再帰されている[述語]」

これが固定されているかを私に示してくださいが。私のantlr文法で相互左反復を削除する方法。

+0

あなたは何を達成しようとしていますか?述語は常に小文字で始める必要がありますか?有効な/無効なトークンの例を挙げることができますか?エラーメッセージの技術的な理由はもちろん、Predicateは独自のルールの代替として発生します。 – dlatikay

+0

これはDatalog文法の一部です。 pAが有効になります PAが無効になる 多くの場合、相互に左の再帰的なエラーが発生しました。エラーを修正するにはどうすればよいですか?どのようにしてプレディケートを独自のルールの代替方法で使うことができますか –

+0

大文字で始まるルールはレクサールールです。混乱を避けるために、すべての大文字の名前を付けることが慣習です。おそらくあなたが望むのは、 'PREDICATE :LOWERCASE(小文字大文字)*;'です。そして、 'PA'のような入力のための別のルールを提供しなければなりません。そうしないと、トークン認識エラーが発生します。 – BernardK

答えて

0

「述語」の再帰的な出現をすべて取り除きます。 VarCharsだけでも、小文字または大文字で十分です。 「1つまたは複数のインスタンスを」示すために+サフィックスを使用します。

あなたの例に適用される
fragment LOWERCASE : [a-z]; 
fragment UPPERCASE : [A-Z]; 

VARCHARS : LOWERCASE | UPPERCASE; 
PREDICATE : LOWERCASE VARCHARS+; 

、これは「P」と述語として「PA」を失格、および「PA」を修飾します。

PREDICATEVARCHARSは、語彙がどのように構成されているかを記述しているので、(文法規則とは対照的に)依然としてレクサー規則であることに注意してください。したがって、すべて大文字の命名規則に従います(Antlrは気にしませんが、読みやすさが向上します)。