Что означает $$ = $ 1 + $ 3 для yacc? - PullRequest
0 голосов
/ 15 октября 2018

Lex часть:

%%
[0-9]+ { yyval = atoi (yytext); return num; }
%%

Yacc часть:

%token num 
%%
exp:num '+' num ; {$$ = $1 + $3;}
%%
  1. В этой части кода, что стоят $$, $1 и $2за?
  2. Как мне теперь напечатать $$?
  3. И если я отправлю 5+9 в качестве входных данных для этой программы, 5 и 9 определяются программой lex, но как насчет+?Символ + отправляется в lex или нет?

Ответы [ 3 ]

0 голосов
/ 15 октября 2018
  1. $$ обозначает результат текущего правила.$1 и $3 означают результаты первого и третьего компонентов соответственно.Таким образом, в этом случае $1 будет содержать значение левого num токена и $3 правого.$2 будет содержать значение '+' токена (при условии, что он есть), но на самом деле он не используется в коде.

  2. Добавляя printf("%d\n", $$); вконец действия или добавление другого правила, которое использует exp и печатает его значение следующим образом:

    main: exp { printf("%d\n", $1); } ;
    
  3. Если все, что у вас есть, - это опубликованный вами код, то +будет напечатан на стандартный вывод и в противном случае игнорируется.Следовательно, правило num '+' num никогда не будет совпадать, потому что лексер не генерирует токен '+', поэтому парсер не видит его.

0 голосов
/ 16 октября 2018

В качестве дополнения к другим ответам вы, вероятно, захотите добавить правила lex:

[ \t\r\n]    ;
.          { return *yytext; }  /* should be the LAST rule */

Первое правило здесь будет игнорировать любые пробелы во входных данных и отбрасывать их.Второе правило (которое должно быть после всех других правил) будет соответствовать любому другому символу во входных данных и возвращать его синтаксическому анализатору, чтобы его можно было сопоставить непосредственно как символ в кавычках (как вы делаете с '+')

0 голосов
/ 15 октября 2018
exp:num ‘+’ num ; {$$ = $1 + $3;} 

те $$ , $ 1 , $ 3 являются семантическими значениями для символов и токенов, используемых в правиле, в том порядке, в котором онипоявляются.Семантическое значение - это значение, которое вы получаете в yylval, когда сканер получает новый токен.

$ 1 имеет семантическое значение первого числа.

$ 3 имеет семантическое значение второго числа

$ 2 не используется, так как это токен '+'.Лексический анализатор отправляет этот токен парсеру.Также у него есть семантическое значение '0'.

$$ определяет семантическое значение 'exp' (целое группирование по этому правилу).

Пробовали ли вычто-то вроде:

exp:num ‘+’ num ; {$$ = $1 + $3;printf("%d", $$);}

Также проверьте: почему $ 1 в yacc / bison имеет значение 0

...