2016-08-03 2 views
0

特定の種類の文章のキーワードのみであるhelloのようなキーワードを持つ言語があります。他のタイプの文章では、これらの単語は、例えば、IDとして照合されるべきである。ANTLR4で通常のキーワードとしてキーワードを解析する方法

grammar Hello; 

file : (sentence)* ; 
sentence : 'hello' ID PERIOD 
     | INT ID PERIOD; 

ID : [a-z]+ ; 
INT : [0-9]+ ; 
WS : [ \t\r\n]+ -> skip ; 
PERIOD : '.' ; 

私はこの文章が有効になりたい::ここで物語スーパーシンプルな文法だ

hello fred. 
31 cheeseburgers. 
6 hello. 

はなく、その最後の文は、この文法では動作しません。単語helloは、タイプhelloのトークンであり、タイプIDではありません。それはレクサーがすべてのhellosをつかんで、そのタイプのトークンに変えるようです。ここで

は私が欲しいものを説明するために、それを行うにはクレイジーな方法です:

sentence : 'hello' ID PERIOD 
     | INT crazyID PERIOD; 

crazyID : ID | 'hello' ; 

が、私の本当の言語で、ええ、そこに対処するためのハローのようなキーワードがたくさんあるので、そのように思えますクレイジー。

これを処理する、合理的でコンパクトなターゲット言語に依存しない方法がありますか?

+0

ANTLRはこのシナリオを具体的にサポートしていますが、そうでなければ 'sentence:ID ID PERIOD'のようなことをして意味解析中に最初のIDが' hello'に等しいことを確認できませんでしたか? –

+0

コメントありがとうございます。これは文法を書くことが簡単になりますが、私の全体的な仕事は、以下の答えよりも少し難しくなります。 – Stacky

+0

心配しないで、私はGRosenbergがANTLRの居住者だと信じています。私は毎日何か他のものを使用しています。 –

答えて

2

キーワードを処理する標準的な方法:KEYWORDIDルール間

file  : (sentence)* EOF ; 
sentence : key=(KEYWORD | INT) id=(KEYWORD | ID) PERIOD ; 

KEYWORD : 'hello' | 'goodbye' ; // list others as alts 
PERIOD : '.' ; 
ID  : [a-z]+ ; 
INT  : [0-9]+ ; 
WS  : [ \t\r\n]+ -> skip ; 

見せかけの曖昧さはIDルールの前にリストされKEYWORDルールに基づいて解決されます。

パーサーのSentenceContextでは、TerminalNode変数keyidが生成され、解析時に一致したトークンが効果的に保持され、簡単に位置を特定できます。

+0

ありがとう!これは動作し、それは私の質問に答える。 – Stacky

関連する問題