ICSI311作业3——启动解析器这个作业非常重要——(几乎)这个作业之后的每个作业都使用这个作业!如果你在这个作业中有错误或缺失的功能,你需要先修复它们,然后才能继续新的作业。这在校外软件开发中很典型。你必须提交.java文件。任何其他文件类型都将被忽略。特别是“.class”文件。您不得压缩或以其他方式压缩您的作业。Blackboard将允许您提交多个文件。您必须提交可构建的.java文件以获得学分。此作业还必须有五个新的源文件(Parser.java、Node.java、IntegerNode.java、FloatNode.java、MathOpNode.java)作为您的前三个源文件(Basic.java、Token.java、Lexer.java)。解析器将从词法分析器中获取标记集合,并将它们构建到AST节点树中。要开始这个过程,创建一个抽象的Node类。添加抽象ToString覆盖。现在创建一个从Node派生的IntegerNode类。它必须在私有成员中保存一个整数并具有只读访问器。为浮点数创建一个名为FloatNode.java的类似类。这两个类都应该有适当的构造函数和ToString()重写。创建一个名为MathOpNode的新类,它也派生自Node。MathOpNode必须有一个枚举,指示该类代表的数学运算(加、减、乘、除)。枚举必须是只读的。该类必须有两个对表示操作数的节点的引用(左和右)。这些引用也必须是只读的,并且必须创建适当的构造函数和ToString()。阅读所有这些,您可能认为我们可以将标记转换为这些节点。这在某种程度上可行,但操作顺序不正确。考虑35+2。令牌将是整数倍整数加整数。那窝会给我们MathNode(,3,MathNode(+,5,2)),它会产生21,而不是17。创建一个Parser类(不派生自任何东西)。它必须有一个构造函数来接受您的令牌集合。创建一个公共解析方法(无参数,返回“Node”)。Parse必须调用表达式(稍后会做更多)。您必须创建一些辅助方法,如讲座中所述的matchAndRemove()。数学表达式(处理运算顺序)的经典语法如下:这些(表达式、术语、因子)的一部分转化为Parser的方法。使用matchAndRemove测试令牌是否存在。这些方法中的每一个都应该返回一个派生自Node的类。Factor将返回FloatNode或IntegerNode或EXPRESSION的返回值。注意因子中的一元减号——这对绑定n很重要负号比减号运算更紧密。另请注意,花括号是“0次或多次”。想想这些规则应该如何处理345。提示——使用递归和辅助方法。还要仔细考虑如何处理“数字”,因为我们有两个不同的可能节点(FloatNode或IntegerNode)。根据你如何实现你的词法分析器,factor可能需要也可能不需要处理否定数字。确保测试您的代码。将您的main更改为在解析器上调用解析。现在,它只会处理一行。使用您创建的“ToString”打印您的AST。使用几个不同的数学表达式,并确保遵守运算顺序。您的词法分析器可以创建您的解析器尚无法处理的标记。那没问题。RubricPoorOKGoodGreatComments无/过多(0)“什么”而不是“为什么”,很少(5)一些“什么”评论或遗漏一些(7)任何不明显的s有推理(10)变量/函数命名到处都是单个字母(0)很多缩写(5)大多数时候都是完整的单词(8)完整的单词,描述性的(10)创建AST类无(0)类缺失(5)所有类都存在,缺少一些方法(10)所有类和方法(20)Parser类无(0)构造函数或私有成员(5)构造函数和私有成员(10)HelperMethod(s)无(0)至少1(5)FactorMethodNone(0)SignificantlyAttempted(10)Correct(15)ExpressionMethodNone(0)SignificantlyAttempted(10)Correct(15)TermMethodNone(0)SignificantlyAttempted(10)Correct(15)WX:代码帮助
