【发布时间】:2010-08-21 23:16:23
【问题描述】:
我在我的 Bison 文件中尝试过类似的操作...
ReturnS: RETURN expression {printf(";")}
...但是分号在下一个标记之后打印,超过了这个规则,而不是在表达式之后。制定此规则是因为我们需要将输入文件转换为类似 c 的形式,并且原始语言在 return 语句中的表达式后不需要分号,但 C 需要,所以我想我会添加它使用 printf 手动输出。这似乎不起作用,因为添加了分号,但由于某种原因,它是在解析下一个标记之后(在 ReturnS 规则之外)而不是在表达式规则返回 ReturnS 时添加的。
这条规则也会导致同样的结果:
loop_for: FOR var_name COLONEQUALS expression TO {printf("%s<=", $<chartype>2);} expression STEP {printf("%s+=", $<chartype>2);} expression {printf(")\n");} Code ENDFOR
除了前两个 printf 不能正常工作(我将发布另一个关于此的问题)之外,最后一个 printf 实际上是在解析“代码”规则的第一个标记/文字之后调用的,结果如下:
for (i=0; i<=5; i+=1
a)
=a+1;
而不是
for (i=0; i<=5; i+=1)
a=a+1;
任何想法我做错了什么?
【问题讨论】:
标签: action printf bison flex-lexer