解析器生成器的规则和操作,以及

问题描述

我正在努力解决作业问题,因此,我非常感谢在正确方向上的任何帮助(不一定是完整的答案)。我被要求为此解析器编写语法规范。我必须实现的语法规范可以在这里找到:

http://anoopsarkar.github.io/compilers-class/decafspec.html

尽管有文档,但我不了解一些事情,例如如何编写(在我的.y文件中)诸如

{标识符},+

我知道这将表示一个逗号分隔的列表,其中包含1(或更多)个标识符,但是当我这样编写时,编译器会显示无法识别的符号“ +”和“,”,这是一个错误误认为是空格。我尝试使用'{'标识符“},+”,但是我丝毫不知道这是否正确。

我已经写了词法分析器部分(因为它是来自分配的前一段),它相应地返回标记(T_ID,T_PLUS等),但是有一个新的观念,我必须将'yylval'分配为令牌本身的值。据我了解,仅当我需要令牌的实际值时才需要这样做,因此我将需要标识符令牌T_ID的值,但不一定需要T_PLUS的值是“ +”。这是通过在解析器生成文件中创建一个%union来完成的,我已经完成了该工作,并提供了我目前认为需要正确的yyval分配的文字标记值的标记

Here is my lexical analysis code (I Could not get it to format properly,I apologize): https://pastebin.com/XMZwvWCK

Here is my parser file decafast.y: https://pastebin.com/2jvaBFQh

And here is the final piece of code supplied to me,the C++ code to build an abstract Syntax tree at the end: 

https://pastebin.com/ELy53VrW?fbclid=IwAR2cFT_-pGKlVZ2liC-zAe3Fw0BWDlGjrrayqEGV4JuJq1_7nKoe9-TLTlA

要最后确定我的问题,我不知道自己是否正确创建了语法规则。我已尽力遵循上述网站中的规范,但我不禁感到自己在写的东西是完全错误的。我的编译器几乎对每条(如果不是每条)规则吐出“警告:语法中无用的规则”。

如果有人可以帮助我,并为我指出正确的方向,我将高度,高度赞赏。

解决方法

无咖啡因规范以(扩展)Backus Naur形式(EBNF)编写,其中包括许多用于重复,可选和分组的便利运算符。这些不是bison / yacc语法的一部分,bison / yacc语法非常好地局限于BNF。 (Bison / yacc确实允许使用交替运算符CircleStepper,但是由于无法对子模式进行分组,因此只能在顶层使用变更,以将两个产生式组合到同一非终端。)>

本规范开头的简短部分描述EBNF,其中包括针对所使用的EBNF各种特定形式的语法。 (由于该语法本身是用同一EBNF递归编写的,因此需要应用一些归纳推理。)例如,当它说时,

|

并不是说CommaList = "{" Expression "}+," . 是逗号重复运算符的特殊拼写。它的意思是,当您在Decaf语法中看到由"}+,"{包围的时,应将其解释为描述用逗号分隔的列表。

例如,Decaf语法包括:

}+,

这意味着FieldDecl = var { identifier }+,Type ";" . 可以(除其他可能性外)是令牌FieldDecl,然后是逗号分隔的var令牌列表,然后是identifier最后是分号。

正如我所说,bison / yacc并没有实现EBNF运算符,因此您必须自己寻找一个等效项。由于BNF不允许任何形式的分组-并且列表是分组的子表达式-我们需要将生产的子表达式重写为新的非终结符。另外,我想我们需要使用spec中定义的标记(尽管bison允许使用更具可读性的语法)。

因此,为了使该EBNF生产更加安全,我们首先引入新的非终结符并替换令牌名称:

Type

其中保留了FieldDecl: T_VAR IdentifierList Type T_SEMICOLON 的定义。遵循一个非常简单的模型(使用两个结果),BNF中的重复总是通过递归产生的:

  • 基数,它是最简单的重复(通常为空或单个列表项),并且
  • 递归,通过扩展较短的递归来描述较长的可能性。

在这种情况下,列表必须至少包含一项,我们通过添加逗号和另一项进行扩展:

IdentifierList

此练习的目的是发展您的语法思维技能:即,将语言的语法和语义都考虑在内。因此,您应该尝试理解为Decaf和作者的EBNF版本提供的语法,并避免盲目复制代码(包括语法)。祝你好运!