翻译计划:
expr -> {print("+")} expr + term
| {print("-")} expr - term
| term
term -> {print("*")} term * factor
| {print("/")} term / factor
| factor
factor -> digit {print(digit)}
| (expr)
上面的语法将以前缀形式打印表达式。对于这种语法,不可能编写解析器。 我们怎么能编写lex和yacc程序来将中缀转换为前缀。 我遵循这个lex and yacc program to convert infix to prefix但没有得到正确的输出。知道如何编写解析器。
答案 0 :(得分:0)
由于你不能输出操作符令,直到用它们减少规则(识别它们)之后,你需要在操作符之前保存表达式的字符串(而不是像你看到的那样输出它) )因此可以在运算符之后发出。这意味着您的规则需要使用转换构建字符串,并且仅在解析完整表达式后才输出字符串。
有多种方法可以用C语言构建字符串。您可以使用asprintf
或malloc
+ strcpy
/ strcat
/ sprintf
,然后担心什么时候适当地释放东西。或者您可以使用某种字符串池来跟踪内存,并可以处理清理。