如何用Java表示无上下文语法?

时间:2016-11-26 22:44:36

标签: java parsing context-free-grammar language-specifications

我有一个简单的语法:

R --> R and R | R or R | atom

我们唯一的终端是 atom 。 这是一个递归语法,因为每个R都可以由嵌套的R组成。 我面临的问题是:

  1. 如何处理递归?
  2. 如何构建一个可以通过3条规则之一解析的java类R?
  3. 你会如何用Java类表示这个语法?

1 个答案:

答案 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,并为此构建一个树。这显然也是一种表现形式。它不像处理数组的数组那样方便。