用于中缀到前缀转换的LEX -YACC解析器

时间:2017-02-04 16:51:51

标签: bison yacc lex

翻译计划:

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但没有得到正确的输出。知道如何编写解析器。

1 个答案:

答案 0 :(得分:0)

由于你不能输出操作符令,直到用它们减少规则(识别它们)之后,你需要在操作符之前保存表达式的字符串(而不是像你看到的那样输出它) )因此可以在运算符之后发出。这意味着您的规则需要使用转换构建字符串,并且仅在解析完整表达式后才输出字符串。

有多种方法可以用C语言构建字符串。您可以使用asprintfmalloc + strcpy / strcat / sprintf,然后担心什么时候适当地释放东西。或者您可以使用某种字符串池来跟踪内存,并可以处理清理。