Создание нескольких переменных yacc - PullRequest
0 голосов
/ 10 марта 2011

Я создаю компилятор в yacc, но я не могу найти способ позволить пользователю создавать несколько переменных с индивидуальными идентификаторами. В настоящее время они могут присвоить номер слову, но все слова имеют одинаковое значение. Код, который я использую:

...

%{
float var=0;
%}

...

exp: NUMBER 
   | WORD { $$ = var; }
   | exp '/' exp {  $$ = $1 / $3; }
   | ...

Ответы [ 2 ]

0 голосов
/ 12 марта 2011

Ваш код похож на mfcalc образец в руководстве по бизонам .
Возможно mfcalc образец предоставит полезную информацию, даже если он не полностью соответствует вашей цели.
mfcalc имеет таблицу символов для сохранения имен VAR (вероятно, соответствует WORD в вашем коде).
На самом деле mfcalc обеспечивает поиск имени символа в лексическом анализе и присваиваетуказатель на запись символа, на семантическое значение VAR.
В исходном коде бизона семантическое значение можно назвать просто как $1->value.var.
Надеюсь, это поможет

0 голосов
/ 10 марта 2011

$$ присвоит токену exp значение var. Так что это статично.

Если вы хотите проанализировать WORD и получить его значение, вы должны использовать $$ = $1, где $ 1 - значение первого токена вашего правила ( id est токен WORD)

Это то, что вы намеревались сделать? Я не уверен в этом, так как вы сделали это правильно для exp '/' exp?

РЕДАКТИРОВАТЬ: Чтобы хранить каждое слово в переменной, я бы предложил вам использовать таблицу с плавающей точкой. Вам нужно будет использовать счетчик для увеличения индекса таблицы. Но вы должны позаботиться о том, чтобы различные значения слов были сохранены в соответствующем порядке.

EDIT2: (Не знаю, скомпилируется ли он как есть) Я думаю, что это будет выглядеть так:

exp: NUMBER
   | variable AFFECT exp { $$ = $3; var[ctr][0]="$1"; var[ctr][1]=$3; ctr++; }
   | variable { $$ = lookupVar($1); }

И определить lookupVar для поиска строки $ 1 в таблице

...