我想修復我的TreeWalker,以便它可以實現不同的字符串模板,具體取決於是否找到括號。字符串模板和句法謂詞
即在下面的公式中:x - (y - z) 使用方括號將會改變公式的值。沒有括號,公式就變成x - y - z這是錯誤的。我正在嘗試使用一個不同的字符串模板來減去和減去一個括號。這些如下:
minus(op1,op2) ::= "$op1$ - $op2$"
minusb(op1,op2) ::= "($op1$ - $op2$)"
和我正在嘗試使用這些TreeWalker部分如下。這只是一個更大的TreeWalker的一部分。
additiveExpr
scope { bool aFlag }
@init {bool aFlag = true; }
: ^(PLUS
{ $additiveExpr::aFlag = false;
$formula::mFlag = false;
}
op1=expression op2=expression)
-> {$additiveExpr::aFlag}?
plusb(op1={$op1.st},op2={$op2.st})
-> plus(op1={$op1.st},op2={$op2.st})
| ^(MINUS
{
$additiveExpr::aFlag = false;
$formula::mFlag = false;
}
op1=expression op2=expression)
-> {$additiveExpr::aFlag}?
minusb(op1={$op1.st},op2={$op2.st})
-> minus(op1={$op1.st},op2={$op2.st})
在上述規則中,aFlag總是返回false,產生沒有括號的模板。我很努力地理解爲什麼它有一個括號時不會返回true。
我可以發佈解析器的其他部分,如果這將有所幫助。
我已經計算出條件部分是由句法謂詞決定的。當additiveExpr之前的標記是括號時,我需要語法謂詞表達式爲真(詞法分析器標記OPEN'(')。是否需要從Parser傳遞給TreeWalker,還是可以從此處解決?是等效解析器代碼
absExpr returns [string ret_type]
: ABS^ OPEN! additiveExpr CLOSE!
{$ret_type = "numeric"; }
| additiveExpr
{$ret_type = $additiveExpr.ret_type; }
;
additiveExpr returns [string ret_type]
: m=multiplicativeExpr ((PLUS|MINUS)^ multiplicativeExpr)*
{$ret_type = $m.ret_type; }
;
編輯:
最新分析器單元:
absExpr returns [string ret_type]
: ABS^ OPEN additiveExpr CLOSE
{$ret_type = $additiveExpr.ret_type; }
| (OPEN additiveExpr CLOSE)=> OPEN additiveExpr CLOSE
{$ret_type = $additiveExpr.ret_type; }
| additiveExpr
{$ret_type = $additiveExpr.ret_type; }
;
提示:'[]'是方括號或只是「括號」,'()'是括號,' {}'是花括號或者只是「大括號」,'<>'是尖括號。 –