prog
ANTLRWorksの開始ルールとして指定しなかった可能性があります。そうすれば、それはすべて大丈夫です。
ただし、実際には、のように式に一致するレクサールールを作成するべきではありませんADDNUM
。これはパーサールールである必要があります。
grammar Example;
prog : addExpr EOF;
addExpr : INT PLUS INT;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
INT : '0'..'9'+;
PLUS : '+';
ANTLRルール
パーサー、レクサー、またはフラグメントのルールを使用する場合の厳密なルールはありませんが、通常は次のように使用されます。
レクサールール
レクサールールは通常、言語の最小部分(文字列、数値、識別子、コメントなど)です。次のような入力からレクサールールを作成しようとすると、1+2
問題が発生します。
- そのトークンから何か意味のあるものを抽出したい場合(たとえば、それを評価する場合)、そのトークンから1つのトークンを作成した後、式全体のテキストが「接着」されるため、そのトークンの内容を分割する必要があります。
- 間に空白があると、問題が発生します
1 + 2
。
式1+2
は3つのトークンです:INT
、PLUS
および別のINT
。
フラグメントルール
フラグメントルールは、「実際の」トークンのためにこのルールを使用したくない場合に使用されます。たとえば、次のレクサールールを使用します。
ID : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
FLOAT : '0'..'9'+ '.' '0'..'9'+;
INT : '0'..'9'+;
上記のルールでは、'0'..'9'
4回使用しているため、別のルールに配置できます
ID : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | DIGIT)*
FLOAT : DIGIT+ '.' DIGIT+;
INT : DIGIT+;
DIGIT : '0'..'9';
DIGIT
ただし、トークンを作成する必要はありませんDIGIT
。他のレクサールールでのみ使用されるようにする必要があります。その場合、fragment
ルールを作成できます。
ID : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | DIGIT)*
FLOAT : DIGIT+ '.' DIGIT+;
INT : DIGIT+;
fragment DIGIT : '0'..'9';
これにより、トークンが存在しないことが保証さDIGIT
れます。したがって、パーサールールでこれを使用することはできません。
パーサールール
パーサールールはトークンを結合します。言語が構文的に有効であることを確認します(別名解析)。強調するために、パーサールールは他のパーサールールまたはレクサールールを使用できますが、フラグメントルールは使用できません。
ANTLR :簡単な例はありますか?