如何在Java中为给定的中间表示树语法实现解析器?

如何在Java中为给定的中间表示树语法实现解析器?,java,parsing,grammar,abstract-syntax-tree,Java,Parsing,Grammar,Abstract Syntax Tree,我有以下IRTree语法: (N*表示N的0、1或更多重复) 我将如何实现上述语法的解析器。 如何构建AST 这是一个相当大的主题,在实施之前需要进行大量的研究和理解。我建议解决这个问题的方法是使用解析器/词法生成器,如和,用于基础学习。一旦你掌握了这一点,你就可以前进到其他的选项,比如有助于生成数据的选项 首先,让我们谈谈实现一种语言的三个基本步骤——第一个步骤是lexer 这就是JFlex生成lexer的地方——该程序基本上读取输入文件并确定字符序列中的模式,并分配适当的组“标记”或解析器稍

我有以下IRTree语法: (N*表示N的0、1或更多重复)

我将如何实现上述语法的解析器。
如何构建AST

这是一个相当大的主题,在实施之前需要进行大量的研究和理解。我建议解决这个问题的方法是使用解析器/词法生成器,如和,用于基础学习。一旦你掌握了这一点,你就可以前进到其他的选项,比如有助于生成数据的选项

首先,让我们谈谈实现一种语言的三个基本步骤——第一个步骤是lexer

这就是JFlex生成lexer的地方——该程序基本上读取输入文件并确定字符序列中的模式,并分配适当的组“标记”或解析器稍后将使用的一个小标记

第二步是解析器——程序的一部分,它从lexer获取令牌的输入序列,然后对它们进行排序。这就是cup的用武之地——它可以使用JFlex生成的lexer并解析令牌。解析器可以有几个部分,但现在让我们关注语法部分。对于cup,我建议您将您给定的语法翻译成另一种形式——称为or的形式。一旦完成了这一步,就可以进入这个问题的下一步,即抽象语法树

AST是解析器的操作部分;以前,解析器将令牌序列与语法中定义的BNF/EBNF序列相匹配,但没有对其进行任何处理。当您有一个匹配的序列时,您可以选择在CUP中执行操作代码。使用此操作代码,您可以形成一个树-有几个选项可以实现这一点。有些人喜欢使用列表、双链接列表或树形图来列出一些选项。AST的目标是创建一个映射结构,用于绘制语法并将关系应用于语法中称为终端和非终端的部分

我有点头晕,所以简单地解释一下,终端就是它听起来的样子——你语法中的一个终点。在您的示例中,这些将是比较运算符(LT、GT等)。同样,非终结符是语法中可以分解为其他非终结符或终结符组合的点。例如,非终端起点IRSequence是非终端IRTree的父级,它可以有一些终端,但也是非终端IRExp的父级,它可以在终端中结束或包括其他非终端


语言的最后一步是编译。但这似乎超出了您的问题范围,因此我暂时不提,如果有人要求,我会在编辑中对其进行扩展。

如果您对我提到的内容的具体方面有进一步的问题,请随时在评论中提问或直接给我发信息。
IRSequence     IRTree*

IRTree         **MOVE(TEMP** id, IRExp)
               **MOVE(MEM**(IRExp), IRExp)
               **JUMP** id
               **CJUMP(**IRExp, Op, IRExp, id, id**)**
               **OUTPUT(**IRExp**)**
               **LABEL** id
               **SEQ(**IRTree, IRTree**)**

IRExp          **CONST** SIGNED_INT
               **BINOP(**IRExp, Op, IRExp**)**
               **TEMP** id
               **MEM(**IRExp**)**

Op             **LT|LE|EQ|ADD|SUB|MUL|DIV**