Compiler construction 是否可以切换到其他规则
我的理解是,在Lex/Bison中,词汇分析由Lex完成,句法分析由Bison规则完成,语义分析由Bison的行为完成 那么,是否有可能从语义分析(即动作)回到句法分析 一个例子是:假设我希望能够将pseudo-C检测为“I++”、“I=I+1”、“I=I+2”。但我希望“I=I+1”被简化为“I++”,而“I=I+2”是第二条规则。有没有可能这样做:Compiler construction 是否可以切换到其他规则,compiler-construction,bison,yacc,semantics,Compiler Construction,Bison,Yacc,Semantics,我的理解是,在Lex/Bison中,词汇分析由Lex完成,句法分析由Bison规则完成,语义分析由Bison的行为完成 那么,是否有可能从语义分析(即动作)回到句法分析 一个例子是:假设我希望能够将pseudo-C检测为“I++”、“I=I+1”、“I=I+2”。但我希望“I=I+1”被简化为“I++”,而“I=I+2”是第二条规则。有没有可能这样做: identifier_plusplus: IDENTIFIER '+' '+' add: IDENTIFIER
identifier_plusplus: IDENTIFIER '+' '+'
add: IDENTIFIER '=' IDENTIFIER '+' NUMBER {if($1 == $3 && $5 == 1) REDUCE_IN(identifier_plusplus);}
在这里,它不是很有用,但在另一个规则中使用identifier_plusplus的情况下,它可能非常有用
编辑:一个有用的例子是,如果我有另一个规则来捕捉一个接一个递增的循环。我想键入以下内容:
for_one: FOR '(' IDENTIFIER '=' '0' ';' IDENTIFIER '<' CONST ';' IDENTIFIER PLUSPLUS ')' exprs
for_one:for'('IDENTIFIER'='0';'IDENTIFIER'一般来说,无论是在编译器的实现中还是在语言的设计中,都应该避免将语法与语义混淆
输入的语法分析应该足以从正确的输入构建解析树。语义分析(如问题中建议的转换)可以通过在解析树上连续行走来轻松执行
以这种方式分离语法和语义会生成更清晰、更易于维护的代码,并且更容易引入新的优化或静态分析等附加功能。此外,众所周知,在解析过程中很难生成有用的错误消息;在sem过程中更容易准确地报告检测到的错误antic分析,例如类型不匹配
综上所述,bison提供了生成GLR解析器的可能性,从而为解决解析冲突提供了更灵活的可能性范围。由于同一右侧有两个可能的归约的语法必然具有歧义性,因此可以使用来根据组件的语义值选择归约。bison的GLR生成器还包括一个扩展,该扩展允许使用
这些高级功能可用于语法受语义分析过度制约的语言,包括通常使用某种“词汇反馈”进行解析的语言。(理想情况下,语言的定义方式不依赖于这些技巧,但语言设计并不总是理想的。)在某些情况下,GLR解决方案可以简化这种解析器,但重要的是仔细考虑限制,尤其是延迟执行解析器动作的影响。这里有更大的上下文吗?您是否有另一个规则:<代码> IdistFr.PulsPuls,<代码> Addio>代码>,但您希望允许<代码>。>如果且仅当它的形式为var=var+1
?或者您只是想为var++
和var=var+1
生成相同的AST吗?在后一种情况下,您不必搞乱解析器的状态。AST无论如何都是在操作中构建的。我添加了一个编辑来显示上下文和这个的用法。