2017-02-04 3 views
-1

схемы перевода:LEX -YACC анализатор для инфикса-к-приставки перевода

expr -> {print("+")} expr + term 
     | {print("-")} expr - term 
     | term 
term -> {print("*")} term * factor 
     | {print("/")} term/factor 
     | factor 
factor -> digit {print(digit)} 
     | (expr) 

Над грамматики напечатает выражение в виде префикса. Для этой грамматики писать парсер невозможно. Как мы можем написать программу lex и yacc для преобразования infix в префикс. Я следую за этим lex and yacc program to convert infix to prefix, но не получаю надлежащего вывода. Любая идея, как написать парсер.

+0

[bison manual] (https://www.gnu.org/software/bison/manual/bison.html#Infix-Calc) включает в себя нежное введение в инструмент yacc/bison с примерами простых калькуляторов калькулятора , – rici

+0

Кроме того, я предлагаю вам использовать настоящий рабочий код в качестве модели, а не начинать с вопроса SO о коде, который, безусловно, не работает. (Если бы это сработало, вопрос не был бы задан.) – rici

+0

«Не получить правильную выходную информацию» - это не то же самое, что «невозможно написать парсер», что бессмысленно. – EJP

ответ

0

Поскольку вы не можете выводить токены оператора до тех пор, пока вы не уменьшите правила с ними (узнайте их), вам нужно сохранить строку для выражения перед оператором (а не выводить ее, как вы ее видите), чтобы она может быть испущен после оператора. Это означает, что ваши правила должны строить строки с переводом и выводить только строку только после разбора полного выражения.

Есть несколько способов построения строк в C. Вы можете использовать asprintf или malloc + strcpy/strcat/sprintf, а затем беспокоиться о том, когда правильно ХАЛЯВА впоследствии. Или вы можете использовать какой-то пул строк, который отслеживает память для вас и может заниматься очисткой.

Смежные вопросы