c - 解析器中的 Bison 错误

标签 c parsing bison yacc

我正在使用 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'

您能帮我解释一下发生错误的原因吗?我不明白为什么。

谢谢!

最佳答案

您的调试转储显示词法分析器返回了一个名为 IDENTIFIER 的 token 。

您的语法规则似乎是根据各个字母的标记(一次一个字符)构造 identifier 元素,而不是单个 IDENTIFIER 标记。

关于c - 解析器中的 Bison 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39688284/

相关文章:

ruby - 解析来自 API 的字符串

c++ - 如何解决while/while解析中的shift/reduce冲突

c - 用 GDB 检查 Bison 的 $$ 变量

c - 无法弄清楚 C 中 while/if 循环的逻辑

c++ - 抛出(或相应地)NULL 函数参数还是让它全部爆炸?

java - 尝试使用 DateTimeFormatter 解析时间

Java IndexOf 找不到正确的数据

bison - 我应该如何处理 Flex 词法分析器中的词法错误?

c - 为什么 [0-9A-Z^%] 后不应该有 s 或 c 之类的类型说明符?

c - 在 C 语言、UNIX 中。 mysql相关错误信息