2016-09-25 3 views
0

Я работаю на Parser с использованием Bison, и я пытаюсь разобрать что-то вродеBison ошибки синтаксического анализа

void Example() {} 

При работе с отладкой, выход:

Starting parse 
Entering state 0 
Reading a token: void A() 
Next token is token VOID() 
Shifting token VOID() 
Entering state 1 
Reducing stack by rule 98 (line 146): 
    $1 = token VOID() 
-> $$ = nterm return_options() 
Stack now 0 
Entering state 32 
Reading a token: Next token is token IDENTIFIER() 
Error detected on line 1. 
Last token read: 'Example' 

Error: popping nterm return_options() 
Stack now 0 
Cleanup: discarding lookahead token IDENTIFIER() 
Stack now 0 

Это важная часть грамматических производств:

program     :   function END_OF_FILE {return 0;} 
function    :   return_options identifier formal_parameters block 
return_options   :   identifier | VOID 
identifier    :   letter list_E_letters 
list_E_letters   :   list_E_letters algarism | 
algarism    :   letter | digit 
letter     :   'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' 
digit     :   '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' 

Можете ли вы помочь мне по причине ошибки? Я не понимаю, почему.

Спасибо!

ответ

0

Ваш дамп отладки показывает, что лексер возвратил один токен с именем IDENTIFIER.

Ваши правила грамматики, как представляется, создают элемент identifier из токенов для отдельных букв, по одному символу за раз, вместо одного токена IDENTIFIER.

+0

Я вижу, поэтому в идентификаторе я должен просто поставить IDENTIFIER по правой руке. Позвольте мне попробовать, что – luisforque

+0

Вы правы, это сработало, спасибо! – luisforque

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