将BNF语法转换为Java

用户名

如何将这种简单的(递归)语法转换为Java?

C --> a | not C | C and C | C or C ;

这个问题并不意味着我必须使用哪种工具来解析语法(例如Javacc或Antlr),而是使用面向对象范例这种简单语法进行建模的方法

templatetypedef

我认为没有一种方法可以使用OOP进行建模,并且可以使用许多同样有效的方法来实现这一目标。以下是一种合理的策略,用于考虑代码中的内容。

通常,在解析表达式时,您的目标是为输入重建抽象语法树。该树结构根据可能的不同生成具有不同类型的节点,在Java中,您可能用某种多态类型来表示它们。例如,你可能有一个基类,ASTNode有孩子ANodeNotNodeAndNode,和OrNode最后三种类型将存储指向组成复合表达式的子表达式的指针。

一旦拥有了这些类型,就需要将某种解析器(可能还有扫描器)放在一起,以获取输入并从中构造适当的树。由于您要查看的语法由具有不同优先级的不同运算符组成,因此可以使用简单的优先级解析器(例如Dijkstra的shunting-yard算法)进行解析。该算法相对容易实现。

那时,它实际上取决于您要对AST进行的处理。例如,如果要根据提供的输入来评估表达式,则可以evaluate向该ASTNode类型添加一个抽象方法,然后让每个派生类型提供一个执行适当操作的实现。您还可以考虑使用访问者模式来构建沿AST走并在每个步骤执行适当操作的访问者。

我不确定这是否会有所帮助,但是不久前,我写了一些与您正在寻找的东西非常相似的东西,以便为我经常教的一门课程的命题逻辑生成真值表。该工具本身在此处可用,并且注释良好的源文件在此处可用它是用JavaScript而不是Java编写的,但是它展示了上述所有内容-AST节点类型,用于解析的shunting-yard算法以及用于评估不同表达式的重写方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将BNF语法转换为pyparsing

来自分类Dev

将扩展 BNF 转换为 Bison 语法,但有移位/减少错误

来自分类Dev

将自上而下的语法规则转换为BNF

来自分类Dev

将Netscaler show show输出转换为BNF进行解析

来自分类Dev

使用特定语法将Java对象转换为JSON

来自分类Dev

将Webpack语法转换为browserify语法

来自分类Dev

将简单的SelectMany转换为查询语法

来自分类Dev

将CoffeeScript问号语法转换为Javascript

来自分类Dev

将MySQL查询转换为CI语法

来自分类Dev

将语法生成转换为Parsec

来自分类Dev

将查询转换为SQL Server语法

来自分类Dev

将MySQL查询转换为CI语法

来自分类Dev

将代码从MATLAB转换为PYTHON的语法

来自分类Dev

将DokuWiki语法转换为MediaWiki的脚本

来自分类Dev

将语法从 cURL 转换为 php cURL

来自分类Dev

是否可以将clojure语法转换为python语法?

来自分类Dev

如何将语法转换为自上而下的可解析语法

来自分类Dev

将旧的Rspec语法转换为新语法

来自分类Dev

将AT&T语法转换为Intel语法(ASM)

来自分类Dev

将data.table语法转换为dplyr语法

来自分类Dev

将do语法转换为>> =语法的简单示例

来自分类Dev

如何将Xpath语法转换为XSL / XSLT语法?

来自分类Dev

PHP 将旧的数组推送语法转换为新的语法

来自分类Dev

从类似BNF的语法到Java或C ++

来自分类Dev

强制转换语法以将总和转换为浮点数

来自分类Dev

将swift转换为Java?

来自分类Dev

将Curl转换为Java

来自分类Dev

将.class转换为.java

来自分类Dev

将swift转换为Java?