我正在将语法从LALR翻译成ANTLR,而我在翻译这一规则,分段表达方面遇到了麻烦。
附件是示例语法:
grammar Test;
options {
language = Java;
output = AST;
}
parse : expression ';'
;
expression : binaryExpression
| piecesExpression
;
binaryExpression : addingExpression (('=='|'!='|'<='|'>='|'>'|'<') addingExpression)*
;
addingExpression : multiplyingExpression (('+'|'-') multiplyingExpression)*
;
multiplyingExpression : unaryExpression
(('*'|'/') unaryExpression)*
;
unaryExpression: ('!'|'-')* primitiveElement;
primitiveElement : literalExpression
| id
| '(' expression ')'
;
literalExpression : INT
;
id : IDENTIFIER
;
piecesExpression : 'piecewise' '{' piece expression '}' ('(' expression ',' expression ')')? expression?
;
piece : expression '->' expression ';' (expression '->' expression ';')*
;
// L E X I C A L R U L E S
INT : DIGITS ;
IDENTIFIER : LETTER (LETTER | DIGIT)*;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
fragment LETTER : ('a'..'z' | 'A'..'Z' | '_') ;
fragment DIGITS: DIGIT+;
fragment DIGIT : '0'..'9';
ANTLR v3.5正在抱怨piecesExpression规则。它有2个致命错误,我宁愿不使用backtrack选项。
预期结果:
piecewise {t -> s; t -> x; 100}
piecewise {t -> s; t -> x; 100} (0, x+1)
piecewise {t -> s; t -> x; 100} (0, x+1) y+5
piecesExpression如何能够捕获上述结果?
提前致谢!
答案 0 :(得分:2)
ANTLR在确定哪些替代方案(至少)2个案例中存在问题:
piece
以expression
开头,但在piecewise{...}
内,它也应该以{{1}} expression
以piecesExpression
结尾,但也有可选的尾随'(' expression ...
(expression
也匹配primitiveElement
没有必要使用全局回溯,但是如果不重写许多规则,您需要添加一些谓词(下面示例中的'(' expression ...
)来修复上面列出的两个问题。
试试这个:
(...)=>