如何将这种简单的(递归)语法转换为Java?
C --> a | not C | C and C | C or C ;
这个问题并不意味着我必须使用哪种工具来解析语法(例如Javacc或Antlr),而是使用面向对象范例对这种简单语法进行建模的方法。
我认为没有一种方法可以使用OOP进行建模,并且可以使用许多同样有效的方法来实现这一目标。以下是一种合理的策略,用于考虑代码中的内容。
通常,在解析表达式时,您的目标是为输入重建抽象语法树。该树结构根据可能的不同生成具有不同类型的节点,在Java中,您可能用某种多态类型来表示它们。例如,你可能有一个基类,ASTNode
有孩子ANode
,NotNode
,AndNode
,和OrNode
。最后三种类型将存储指向组成复合表达式的子表达式的指针。
一旦拥有了这些类型,就需要将某种解析器(可能还有扫描器)放在一起,以获取输入并从中构造适当的树。由于您要查看的语法由具有不同优先级的不同运算符组成,因此可以使用简单的优先级解析器(例如Dijkstra的shunting-yard算法)进行解析。该算法相对容易实现。
那时,它实际上取决于您要对AST进行的处理。例如,如果要根据提供的输入来评估表达式,则可以evaluate
向该ASTNode
类型添加一个抽象方法,然后让每个派生类型提供一个执行适当操作的实现。您还可以考虑使用访问者模式来构建沿AST走并在每个步骤执行适当操作的访问者。
我不确定这是否会有所帮助,但是不久前,我写了一些与您正在寻找的东西非常相似的东西,以便为我经常教的一门课程的命题逻辑生成真值表。该工具本身在此处可用,并且注释良好的源文件在此处可用。它是用JavaScript而不是Java编写的,但是它展示了上述所有内容-AST节点类型,用于解析的shunting-yard算法以及用于评估不同表达式的重写方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句