初学者:ANTLR做错了吗?

时间:2018-04-07 11:46:19

标签: antlr4

我有一个非常简单的语法来解析Dice表达式。

grammar Dice;
function : ( dice | binaryOp | DIGIT );
binaryOp: dice OPERATOR function | DIGIT OPERATOR function;
dice : DIGIT DSEPERATOR DIGIT EXPLODING?;
DSEPERATOR : ( 'd' | 'D' | 'w' | 'W' );
EXPLODING : ( '*' );
OPERATOR : ( ADD | SUB );
ADD : '+';
SUB : '-';
DIGIT : ('0'..'9')+;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

它应该解析3D6+2D10之类的东西,但它不会。我得到了no viable alternative at input '2d10'这个部分结果:

(function (binaryOp (dice 3 W 6) + (function 2 d 10)))

我不明白为什么。你能帮我理解一下吗?

1 个答案:

答案 0 :(得分:1)

由于function规则是递归的(最终),您需要为顶级显式添加规则,以便ANTLR可以推断“哦,这个顶级规则应该是隐式接受EOF的规则在输入结束时“,然后从中解析。

我添加了一行:

start : function ;

到你的语法,现在可以解析:

$ echo "3D6+2D10" | java -cp antlr-4.7.1-complete.jar:. org.antlr.v4.gui.TestRig Dice start -tree
(start (function (binaryOp (dice 3 D 6) + (function (dice 2 D 10)))))