Yacc解析嵌入C代码片段的实现原理及同类自定义解析器的实现方案咨询
Yacc解析嵌入C代码片段的实现原理及同类自定义解析器的实现方案咨询
我正在用Yacc写一个类似Yacc本身的解析器,我的输入语言里会穿插C代码片段。
先看Yacc里典型的产生式写法:
something: some thing { $$ = makesomething($1, $2); } ;
这里的语法其实是Yacc语法和C语法的混合:
something: some thing { ... } ;
这部分全是Yacc语法,但大括号中间的内容:
... $$ = makesomething($1, $2);
基本是C代码,只是会对$$、$1、$2做类似预处理器的替换。
我一直在想Yacc本身是怎么解析这种混合语法的,目前想到两种可能:
- 内置了完整的C语言语法规则
- 直接抓取大括号
{ }之间的所有内容
我非常怀疑它是第一种实现方式,但第二种实现起来也有难度——毕竟C代码片段里可能嵌套自己的大括号。所以要准确抓取外层大括号之间的C片段,Yacc的解析器或者词法分析器必须能匹配内层的大括号,同时还要忽略字符串常量、字符常量和注释里的大括号。
现在我自己的代码也遇到了完全一样的问题,我要写的产生式比如:
transition: TRANSITION TO ID ON '(' condition ')' ;
还有:
action: ACTION '{' actions '}' ;
其中condition是任意C表达式,actions是几乎任意的C代码。
有没有人知道怎么实现比较好?或者Yacc/Bison是怎么做的?
补充说明:Johnson的Yacc相关论文附录B里有这样的伪产生式:
act : '{' {Copy action, translate $$, etc.} '}'
看来答案基本就是我想到的第二种方式了(可能需要用到Lex的一些高级钩子,直接读取输入的原始文本,同时不破坏Lex的预读机制)。
备注:内容来源于stack exchange,提问作者Steve Summit
相关产品推荐
相关产品推荐

