我(可能)有一个非常简单的问题。我正在编写一个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 : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
我似乎对KEEP
和DSEPERATOR
的定义有疑问,因为他们都使用字母d
。解析器在NUMBER
表达式中的第一个dice
之后停止。这里的工作是什么?我的语法有什么变化?
答案 0 :(得分:0)
正在解析的隐式结构是
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' ;