在C中使用递归下降解析接受等号

在C中使用递归下降解析接受等号,c,parsing,recursion,grammar,recursive-descent,C,Parsing,Recursion,Grammar,Recursive Descent,我目前正在尝试构建一个递归下降解析器,用于解析赋值语句,如a=4+b。语法如下 <stmt> → id = <expr> <expr> → <term> {(+ | -) <term>} <term> → <factor> {(* | /) <factor>} <factor> → id | int_constant | ( <expr> ) 此代码在front.in文件中的

我目前正在尝试构建一个递归下降解析器,用于解析赋值语句,如a=4+b。语法如下

<stmt> → id = <expr>
<expr> → <term> {(+ | -) <term>}
<term> → <factor> {(* | /) <factor>}
<factor> → id | int_constant | ( <expr> )
此代码在front.in文件中的输入为:

myVar = 5
我得到的结果是:

[FROM main()] before lex() 0 
Next token is: 11, Next lexeme is myVar
[FROM main()] 11 

Enter <stmt>

[FROM stmt()] found identifier. 
[FROM stmt()] before lex() 32 
[FROM lex()] =
[FROM lookup()] found the = 
Next token is: -1, Next lexeme is ==
[FROM stmt()] after lex() -1
预期输出应显示语法中每个非终结符的所有语句,如Enter和Exit等

我看到的主要问题是,它将下一个词素定义为“==”而不是“=”,因此解析器无法识别它


关于为什么会发生这种情况有什么想法吗?

lookupchar ch中开关的case=没有中断。您可以尝试添加一个。

语句nextToken=ASSIGN\u OP;之后会发生什么;?使用调试器来确定。顺便说一句,问题是-1,它不是正确的令牌id。==而不是==是一种症状,但这并不重要,因为您没有在任何地方使用特定的令牌字符串。@rici您是什么意思?1是从哪里来的?如何调试这段C代码?它在调试输出中说:下一个标记是:-1,如果您在Windows上使用linux或os x或某些linux子系统,您应该使用gdb调试器。在指定行设置断点。走几行。它能满足你的期望吗?谢谢!这是正确的答案。我花了一段时间才找到它。
[FROM main()] before lex() 0 
Next token is: 11, Next lexeme is myVar
[FROM main()] 11 

Enter <stmt>

[FROM stmt()] found identifier. 
[FROM stmt()] before lex() 32 
[FROM lex()] =
[FROM lookup()] found the = 
Next token is: -1, Next lexeme is ==
[FROM stmt()] after lex() -1