私はすでにこの質問を見てきましたが、質問のタイトルは同じように見えます。それは私の質問に答えません、少なくとも私が理解できる方法ではありません。
数学の解析
これが私が解析しているものです:
PI -> 3.14.
Number area(Number radius) -> PI * radius^2.
これは、すべての役に立たないルートノードを除いたASTツリーの外観です。
どのように見えるかhttp://vertigrated.com/images/How%20I%20want%20the%20tree%20to%20look.png
これが私の文法の関連する断片であることを願っています:
term : '(' expression ')'
| number -> ^(NUMBER number)
| (function_invocation)=> function_invocation
| ATOM
| ID
;
power : term ('^' term)* -> ^(POWER term (term)* ) ;
unary : ('+'! | '-'^)* power ;
multiply : unary ('*' unary)* -> ^(MULTIPLY unary (unary)* ) ;
divide : multiply ('/' multiply)* -> ^(DIVIDE multiply (multiply)* );
modulo : divide ('%' divide)* -> ^(MODULO divide (divide)*) ;
subtract : modulo ('-' modulo)* -> ^(SUBTRACT modulo (modulo)* ) ;
add : subtract ('+' subtract)* -> ^(ADDITION subtract (subtract)*) ;
relation : add (('=' | '!=' | '<' | '<=' | '>=' | '>') add)* ;
expression : relation (and_or relation)*
| string
| container_access
;
and_or : '&' | '|' ;
優先順位
precedence
次の図に示すように維持したいのですが、可能な限り無駄なノードを排除したいと思います。
ソース:Number a(x) -> 0 - 1 + 2 * 3 / 4 % 5 ^ 6.
削除したいノードは次のとおりです。
優先順位ツリーをどのように表示するかhttp://vertigrated.com/images/example%202%20desired%20result.png
基本的に、バイナリーオプションへの直接の分岐がないノードを排除したいと思います。