我(可能(有一个非常简单的问题。我正在编写一个ANTLR语法来评估骰子表达式。有了这个,我想解析类似 4d6
以及4d6d2
.第一个意思是"掷4个六面骰子",第二个意思是"掷4个六面骰子,掉落2个最低"。我目前的语法是:
grammar Dice;
start : dice ;
dice : NUMBER? DSEPERATOR NUMBER ( KEEP | DROP NUMBER )?;
KEEP : 'k';
DROP : 'd';
DSEPERATOR : [dD];
NUMBER : [0-9]+;
WS : [ trn]+ -> skip ; // skip spaces, tabs, newlines
我似乎对KEEP
和DSEPERATOR
的定义有问题,因为它们都使用字母d
。分析器在dice
表达式中的第一个NUMBER
后停止。这里有什么工作?我的语法需要改变什么?
正在解析的隐式结构是
e - number of executions
d - type of object
s - number of object sides
o - op to apply*
a - number of op applications*
因此,匹配规则是:
decode : e d s ( o a )? ;
合并数字和扩展:
decode : e=NUM type s=NUM ( op a=NUM )? ; // label for convenience
type : dice | .... ;
op : drop | .... ;
dice : D ;
drop : D ;
NUM : [0-9]+ ;
D : 'd' ;