爲什麼不能簡單地做:
expr : orExpr;
orExpr : andExpr ('or' andExpr)*;
andExpr : relExpr ('and' relExpr)*;
relExpr : addExpr (relop addExpr)?;
relop : '<' | '<=' | '>' | '>=' | '==' | '!=';
addExpr : multExpr (('+' | '-') multExpr)*;
multExpr : unaryExpr (('*' | '/') unaryExpr)*;
unaryExpr : 'not'? atom;
atom : INT | FLOAT | ID | 'true' | 'false' | '(' expr ')';
單數not
通常比您現在要做的要高。
這將允許使用像42 > true
這樣的表達式,但在走AST /樹時檢查這樣的語義會出現。
編輯
輸入"not(a+b >= 2 * foo/3.14159) == false"
現在將解析像這樣(忽略空格):
如果你設置輸出到AST和一些樹改寫運營商混合( ^
和!
):
options {
output=AST;
}
// ...
expr : orExpr;
orExpr : andExpr ('or'^ andExpr)*;
andExpr : relExpr ('and'^ relExpr)*;
relExpr : addExpr (relop^ addExpr)?;
relop : '<' | '<=' | '>' | '>=' | '==' | '!=';
addExpr : multExpr (('+' | '-')^ multExpr)*;
multExpr : unaryExpr (('*' | '/')^ unaryExpr)*;
unaryExpr : 'not'^ atom | atom;
atom : INT | FLOAT | ID | 'true' | 'false' | '('! expr ')'!;
你會得到:
什麼是超級腳本'2'在'boolean'做什麼? – 2012-02-15 20:21:44