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

LEX -YACC parser for infix-to-prefix translation

翻译方案:

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

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

在 C 中有多种构建字符串的方法。您可以使用 asprintfmalloc + strcpy/strcat/sprintf,然后担心什么时候才能正确释放东西。或者您可以使用某种字符串池来为您跟踪内存并处理清理。