ANTLR4 で代数式を解析しようとしています。私がパーサーで達成しようとした機能の 1 つは、パーセント式の「インテリジェントな」処理です。
編集:目標は、レストランでの割引やチップの計算を簡単にすることです。たとえば、「30% オフ」という広告が表示された場合、「価格 - 30%」と入力すると正しい結果が得られます。または、レストランでは、食事の価格に 15% を加えた金額を入力して、15% のチップを含めて支払わなければならない金額を受け取ることができます。ただし、この解釈は、式が「式 1 (- または +) 式 2」のように見える場合にのみ発生します。その他のすべての場合、パーセント記号は通常どおり解釈されます。Google 検索ボックス計算機はそのように動作します。/編集
100-30%
70を返す必要があります70
100-(20+10)%
も返す必要があります73を返す必要がありますが、 0.05を返す必要があります0.10を返す必要があります
3+(100-(20+10)%)
5%
(5+5)%
私の文法は次のようになります。
expr:
e EOF
;
e:
'-'a=e
| '(' a=e ')'
| a=e op=(ADD|SUB) b=e '%'
| a=e op=(ADD|SUB) b=e
| a=e'%' //**PERCENTRULE**
| FLT
;
ADD : '+' ;
SUB : '-' ;
FLT: [0-9]+(('.'|',')[0-9]+)?;
NEWLINE:'\r'? '\n' ;
WS : [ \t\n]+ -> skip ;
式については、このツリー100-30%
を期待します:
しかし、私はこれを取得します:
どうすれば正しいツリーを取得できますか(PERCENTRULEを削除せずに)?