2016-11-08 6 views
0

論理演算子NOTと演算子PlusおよびMinusが単項演算子または二項演算子となる言語のAntlr4文法を作成中です。Antlr4は単項または二進の演算子を定義します

パーサはそれらを区別できるように、どのように私はAntlr4文法で演算子を定義する必要がありますか?

例:

  • しない1が0(単項演算子)
  • 1 1でない0(二項演算子)である

ここでは私のAntlr4パーサのごく一部です:

expr: expr ('%') expr    #Modulo 
| expr op=('*'|'/') expr   #MulDiv 
| expr op=('+'|'-') expr   #AddSub       
| NOT expr       #NegOp 

私のAntlr4 Lexerの一部です:

01私にとって

expr (MOD) expr       #Modulo 
| op=(ADD|SUB) expr      #UnaryPlusMinus 
| expr op=(ADD|SUB) expr    #AddSub 
| expr op=(AND|OR|XOR|NOT) expr   #LogOp 
| NOT expr        #NegOp 

を私の言語のような構文をサポートしているので、上記の溶液で結構です:私は私のパーサーに次のルールを追加する必要が同時に私の言語のオペレータは単項およびバイナリ作るために

ADD : '+'; 
SUB : '-'; 
NOT : ([nN][oO][tT]|[~]); 

答えて

0

以下次

  • ++ 5 --- 4
  • NOT NOT NOT 1(結果は1である)(結果は0である)
(例えば、マイナス用)演算子は単項または(排他的OR)バイナリー可能性があり、パーサ/レクサルールを作成するために興味深いものになるだろうしかし

が、オペレータは単項または二項演算子として使用され、したがって、されていない場合、パーサーは知っている必要がありますこれはエラーにつながるので、この5 - ++ - 4のようなものを許可しますが、同時にこれはokになります - 5になると-5になります。

関連する問題