我有一个简单的语法:
R --> R and R | R or R | atom
我们唯一的终端是 atom 。 这是一个递归语法,因为每个R都可以由嵌套的R组成。 我面临的问题是:
你会如何用Java类表示这个语法?
答案 0 :(得分:1)
最简单的方法是将所有规则标准化为单个选项,然后将它们表示为数组数组。
首先,我们为每个"原子"分配一个唯一的代码。 (令牌)在语法中。
然后,规则应该全部归一化为
LHS --> RHS1 RHS2 ... RHSn
例如,from:a - >的规则b | c应该归一化为两个规则,a - > b和a - > C 。如果你有其他花哨的符号EBNF设备,如kleene start或plus,你也可以将它们标准化。
现在你有K规则;你可以定义一个带有K个插槽的阵列,每个插槽都有一个规则。规则槽包含一对:LHS,以及该规则的大小为n的数组。 (更简单:规则槽包含一个大小为n + 1的数组,最左边的元素索引0保存LHS,索引1保存RHS1等。)
现在你有了用Java表示的语法。
[递归是语法的语义属性,而不是它的表示。]
另一种选择:如果你为BNF构建一个经典的解析器(毕竟,(E)BNF也有一个语法),你可以使用解析器解析你的BNF,并为此构建一个树。这显然也是一种表现形式。它不像处理数组的数组那样方便。