【发布时间】:2011-11-28 16:45:54
【问题描述】:
我正在使用 ANTLR 解析数学表达式字符串并使用 MathML 标记它们。
现在我有下面的语法。现在我有三个问题:
- 语法允许像
2*(3+4)这样的完整表达式。我想 它还允许不完整的表达式,例如2*(3+。成为一个 ANTLR 的完整新手我不知道如何做到这一点。 请指出正确的文件或举个例子。 - 平方根规则
sqrt在原子中的位置似乎 工作,但我很确定它应该在exponent的某个地方 规则?还是应该? - 如果我想扩展此语法以实际执行 计算,我可以以某种方式重复使用它还是必须复制和粘贴?
对于我的语法的任何其他 cmets 或建议也很感激,因为我现在使用 ANTLR 的总经验大约是四个小时。
grammar Expr;
parse returns [String value]
: stat+ {$value = $stat.value;}
;
stat returns [String value]
: exponent NEWLINE {$value = "<math>" + $exponent.value + "</math>";}
| NEWLINE
;
exponent returns [String value]
: e=expr {$value = $e.value;}
( '^' e=expr {$value = "<msup><mrow>" + $value + "</mrow><mrow>" + $e.value + "</mrow></msup>";}
)*
;
expr returns [String value]
: e=multExpr {$value = $e.value;}
( '+' e=multExpr {$value += "<mo>+</mo>" + $e.value;}
| '-' e=multExpr {$value += "<mo>-</mo>" + $e.value;}
)*
;
multExpr returns [String value]
: e=atom {$value = $e.value;}
( '*' e=atom {$value += "<mo>*</mo>" + $e.value;}
| '/' e=atom {$value += "<mo>/</mo>" + $e.value;}
)*
;
atom returns [String value]
: INT {$value = "<mn>" + $INT.text + "</mn>";}
| '-' e=atom {$value = "<mo>-</mo>" + $e.value;}
| 'sqrt[' exponent ']' {$value = "<msqrt><mrow>" + $exponent.value + "</mrow></msqrt>";}
| '(' exponent ')' {$value = "<mo>(</mo>" + $exponent.value + "<mo>)</mo>";}
;
INT : '0'..'9'+ ;
NEWLINE:'\r'? '\n' ;
WS : (' '|'\t')+ {skip();} ;
【问题讨论】:
-
定义“不完整”会很困难,尤其是当您允许缺少操作数、运算符或 ( ) 时。根据定义,解析器生成器接受您要解析的 语言的 BNF,而不是“不完整版本”。因此,您要么修改语法以包含您认为不完整的内容(我怀疑这将是失败,因为您的用户会认为您做错了),或者您找到了一种方法来扭曲解析器生成器(在这种情况下为 ANTLR ) 接受格式错误的输入。这可能很难做到。
-
@BartKiers 不完整的表达式总是最后一个。 MathML 允许不完整的表达式,因此结果将只是可以评估的部分。优先级不是故意的,谢谢您的注意。 :)