我正在尝试创建一个可以计算骰子掷骰字符串的程序(使用 n d n 格式,因此2d8将掷出两个8面骰子,总结一下)。我正在Java中工作,但这对这个问题无关紧要。我对上下文无关的语法没有太多的经验,并且我对如何创建语法有一些疑问。
我知道我需要的元素(标记)是
侧倾修饰符是:
这些修饰符分别是两个字符,其后是骰子运算符序列(数字d),然后是数字(要保留的掷骰数)。
可能的输入可能是:
我尝试创建语法(EBNF):
expr = term (addop factor)*
term = factor (mulop factor)*
diceop = <number> 'd' <number>
dicemod = diceop dmod <number>
factor = <number> | ( expr ) | diceop
dmod = kl | kh | dl | dh
addop = + | -
mulop = * | /
<number>
是任意数字
我对此有一些疑问:
dicemod
中的数字必须小于或等于diceop
术语中的第一个数字?我只是在代码中这样做吗?expr
的规则(意味着任何输入中的第一个标记是expr
类型)还是我需要高于该规则的东西?如果有帮助,这就是我到目前为止如何安排AST包的类的方法:
[abstract class] Node, extended by:
[abstract class] Expr, extended by:
[class] Number (0-9)
[class] BinOp (+, -, *, /)
[class] DiceOp (Number 'd' Number)
[class] DiceMod (dl, dh, kl, kh)
必须在DiceOp
之前加上Number
令牌,然后再加上Number
令牌;并且DiceMod
之前必须有一个DiceOp
令牌,然后是一个Number
令牌,该令牌<= Number
令牌持有的第一个DiceOp
令牌(作为令牌的子代)。
我是语法和口译人员的新手,因此非常感谢您的帮助。