我有一个简单的语法:如何在Java中表示一种上下文无关文法?
R --> R and R | R or R | atom
我们唯一的终端是原子。 这是一个递归语法,因为每个R可以被嵌套R. 由我所面临的问题是:
- 如何处理递归?
- 如何构建一个可以通过3条规则之一解决的java类R?
您如何用Java类表示这种语法?
我有一个简单的语法:如何在Java中表示一种上下文无关文法?
R --> R and R | R or R | atom
我们唯一的终端是原子。 这是一个递归语法,因为每个R可以被嵌套R. 由我所面临的问题是:
您如何用Java类表示这种语法?
最简单的方法是将所有规则标准化为单个选项,然后将它们表示为数组数组。
首先,我们为语法中的每个“原子”(标记)分配一个唯一的代码。
然后,规则都应该被归为
LHS --> RHS1 RHS2 ... RHSn
e.g,规则由:甲 - >乙| c应该被规范化为两个规则,a - > b和a - > c。如果您有其他奇特的符号EBNF设备,例如kleene start或plus,您也可以对它们进行标准化。
现在你有K规则;你可以定义一个有K个插槽的阵列,每个插槽都有一个规则。规则槽包含一对:LHS和该规则的大小为n的数组。 (更简单一点:规则插槽包含大小为n + 1的数组,最左边的元素索引0保存LHS,索引1保存RHS1等)。
现在,您已经有了用Java表示的语法。
[递归语法的语义特性,而不是它的代表性。]
另:如果你建立一个经典的解析器BNF(毕竟,(E)BNF有一个语法,太),你可以使用解析器解析您的BNF,并为此构建一棵树。这显然也是一种表现形式。作为要处理的数组数组并不方便。
目前还不清楚你在问什么。如何编写解析器? –
我已经有了这个语法的解析器。我的目标是为这个语法编写API,所以我需要用OOP来表示每个规则。 – user840718
API是'parse()',或者可能是一组解析树节点。不清楚你在问什么。 – EJP