如何为角色扮演游戏创建上下文无关的语法

时间:2020-07-10 07:19:29

标签: java grammar interpreter context-free-grammar

我正在尝试创建一个可以计算骰子掷骰字符串的程序(使用 n d n 格式,因此2d8将掷出两个8面骰子,总结一下)。我正在Java中工作,但这对这个问题无关紧要。我对上下文无关的语法没有太多的经验,并且我对如何创建语法有一些疑问。

我知道我需要的元素(标记)是

  • 数字
  • 加法运算符(+,-)
  • 乘法运算符(*,/)
  • “骰子”运算符(d)
  • 侧倾修饰符(kh,kl,dh,dl)

侧倾修饰符是:

  • kh:保持最高的 n 骰子。 4d6kh1将保持最高的掷骰,4d6kh2将保持两个最高的掷骰,依此类推。
  • kl:保持最高的 n 骰子
  • dh:掉落最高的 n 骰子
  • dl:掷出最低的 n 骰子

这些修饰符分别是两个字符,其后是骰子运算符序列(数字d),然后是数字(要保留的掷骰数)。

可能的输入可能是:

  • 4d4
  • 3d6 + 2d4
  • 2 *(1d6 + 8)
  • 4 * 1d20 + 2
  • 2d20dl1
  • 4d20kh2 + 3d8

我尝试创建语法(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>是任意数字

我对此有一些疑问:

  1. 以某种可能的方式完成/订购了吗?
  2. 如何指定dicemod中的数字必须小于或等于diceop术语中的第一个数字?我只是在代码中这样做吗?
  3. 我是否需要高于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令牌(作为令牌的子代)。

我是语法和口译人员的新手,因此非常感谢您的帮助。

0 个答案:

没有答案