これは、単純なネストされた式の基本構造です...
infix : prefix (INFIX_OP^ prefix)*;
prefix : postfix | (PREFIX_OP postfix) -> ^(PREFIX_OP postfix);
postfix : INT (POSTFIX_OP^)?;
POSTFIX_OP : '!';
INFIX_OP : '+';
PREFIX_OP : '-';
INT : '0'..'9'*;
これらの式のリストを作成したい場合は、次を使用できます...
list: infix (',' infix)*;
ここでは区切り文字として「,」を使用します。
区切り記号なしで式のリストを作成できるようにしたい。
したがって、文字列があれば、それを次の4 5 2+3 1 6
ように解釈できるようにしたいと思います(4) (5) ^(+ 2 3) (1) (6)
問題は、両方が同じ最初のシンボル (INT)4
を2+3
持っているため、競合が発生することです。私はこれをどのように解決できるかを理解しようとしています。
編集
特定の条件に対して正しい書き換えを思いつくのに苦労しているだけで、ほとんど理解できました...
expr: (a=atom -> $a)
(op='+' b=atom-> {$a.text != "+" && $b.text != "+"}? ^($op $expr $b) // infix
-> {$b.text != "+"}? // HAVING TROUBLE COMING UP WITH THIS CORRECT REWRITE!
-> $expr $op $b)*; // simple list
atom: INT | '+';
INT : '0'..'9'+;
これは、私が欲しいものです1+2+3++4+5+
。^(+ ^(+ 1 2) 3) (+) (+) ^(+ 4 5) (+)
++1+2
として解析されるように、書き換えルールを完成させようとしてい(+) (+) ^(+ 1 2)
ます。全体として、トークンのリストが必要で、すべての中置式を見つけて、残りをリストとして残します。