Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 是否可以切换到其他规则_Compiler Construction_Bison_Yacc_Semantics - Fatal编程技术网

Compiler construction 是否可以切换到其他规则

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

我的理解是,在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 '+' 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无论如何都是在操作中构建的。我添加了一个编辑来显示上下文和这个的用法。