yacc可以用来为Java1生成三个地址代码吗?
我已经读到yacc为LALR(1)语法生成自底向上的解析器。我有一个Java1语法,可以用于生成三个地址代码,严格来说是LALR(1),但我使用的翻译方案使其具有L属性。现在我已经读到,L属性的LR语法在自底向上解析期间无法翻译。那么,这里是否可以使用yacc?如果是的话,yacc是如何解决这个问题的?除非你提出一个具体、详细的问题,否则你不会得到一个好的答案。这里是一个方法的模糊草图 合成属性对于自底向上的解析器来说显然不是问题,因为它们是在对应终端的最终简化操作中计算的。所以问题归结为“自下而上的解析器如何计算继承的属性?” 因为语法是L属性的,所以我们知道任何继承的属性都是从其左同胞的属性计算出来的。Yacc/bison允许在右侧的任何位置插入操作,并且 在遇到时执行。MRA可以精确地使用它的左同胞,因此这就是计算继承属性所需的全部内容 但是,这并没有说明属性实际上是如何被继承的。在某些规则中,在语法符号之前插入的MRA当然可以用于部分计算该符号的继承属性,但继承属性也可以使用子级的合成属性 要做到这一点,我们需要做两件事:yacc可以用来为Java1生成三个地址代码吗?,java,compiler-construction,yacc,lalr,intermediate-code,Java,Compiler Construction,Yacc,Lalr,Intermediate Code,我已经读到yacc为LALR(1)语法生成自底向上的解析器。我有一个Java1语法,可以用于生成三个地址代码,严格来说是LALR(1),但我使用的翻译方案使其具有L属性。现在我已经读到,L属性的LR语法在自底向上解析期间无法翻译。那么,这里是否可以使用yacc?如果是的话,yacc是如何解决这个问题的?除非你提出一个具体、详细的问题,否则你不会得到一个好的答案。这里是一个方法的模糊草图 合成属性对于自底向上的解析器来说显然不是问题,因为它们是在对应终端的最终简化操作中计算的。所以问题归结为“自下
$0
指的是父产品中非终端前面的符号(我在上面称之为叔叔)。当然,要实现这一点,您必须确保在非终端出现的每个产品中,叔叔都是相同的非终端(或者至少具有相同的语义类型)。这可能需要添加一些标记
说到语义值,您可以满足自己的要求,即给定非终结符的所有叔叔都是相同的,或者至少具有相同的类型。但是bison不做这种分析,所以如果你弄错了,它不能警告你。小心!另一个结果是,你必须告诉bison类型是什么,所以你不能只写$0
:你需要$0