2016-04-14 10 views
0

としてNULL解析。解析しようと、今ANTLR:関数名と私は私の文法で<em>パラメータ</em>(値<em>ヌル</em>)と<em>関数名</em>両方として「NULL」を使用できるようにしたいと思いパラメータ

grammar test; 

expr 
    : value # valueExpr 
    | FUNCTION_NAME '(' (expr (',' expr)*)* ')' # functionExpr 
    ; 


value 
    : INT 
    | 'NULL' 
    ; 

FUNCTION_NAME 
    : [a-zA-Z] [a-zA-Z0-9]* 
    ; 


INT: [0-9]+; 

:この減少の例を参照してくださいパースツリーの失敗で

NULL(1) 

結果を、それが価値ではなく、関数名としてNULL解析しているため。

理想的には、私も

これが可能であればあなたは私を伝えることができ、そしてこれを実現するには、yesであれば、どのように... NULL(NULL)を解析することができるはずですか?

答えて

0

あなたの文法で'NULL'文字列が暗黙のトークンタイプを定義すること、それがこの沿って何か追加するのと同じです:レクサールールの開始時に

NULL: 'NULL'; 

を。トークンが複数のレクサールールに一致すると、最初のルールが使用されるため、暗黙のルールが優先され、'NULL'のトークンが取得されます。

function_name: FUNCTION_NAME | 'NULL'; 

してからexprルールでそれを使用します。

簡単な解決策は、関数名のためのパーサー規則を導入し、このような何かすることです。しかし、NULLがあなたの文法でキーワードになることを意図していない場合、それは脆いようです。これには他の解決策がありますが、私はあなたの文法がどのように拡大するのか分からないので、何を助言するべきかについてはあまりよく分かりません。

しかし、別の解決策がNAMEFUNCTION_NAMEの名前を変更することができ、'NAME'トークン型を取り除くと、そのようなexprを書き換えます:

expr 
    : value # valueExpr 
    | NAME '(' (expr (',' expr)*)* ')' # functionExpr 
    | {_input.LT(1).getText().equals("NULL")}? NAME # nullExpr 
    ; 

セマンティック述語は、ここに名前の比較の世話をします。

関連する問題

 関連する問題