Parsing 野牛可以';不能区分变量声明和赋值

Parsing 野牛可以';不能区分变量声明和赋值,parsing,bison,Parsing,Bison,所以我有语法规则 Method : METHODNAME Params ')' ':' Types '{' VarsDecs Statements RETURN Returns '}' ';' ; ; VarsDecs : VarDec VarsDecs | ; VarDec : VARNAME ':' Types ';' ; Statements : State

所以我有语法规则

Method     : METHODNAME Params ')' ':' Types '{' VarsDecs Statements RETURN Returns '}' ';'
           ;
           ;
VarsDecs   : VarDec VarsDecs 
           | 
           ;
VarDec     : VARNAME ':' Types ';'
           ;
Statements : Statement Statements
           |
           ;
Statement  : Assignment
           | Print
           | If
           ;                            
Assignment : VARNAME '=' Expression ';'
           ;
当赋值是找到的第一条语句时,我的解析器无法判断变量声明何时停止,语句何时开始,因为赋值也以VARNAME开始


我该如何解决这个问题呢?

语法不全在这里,因此很难直接测试,但使用正确的递归而不是语法可能是其中的一部分

Statements : Statement Statements
VarsDecs   : VarDec VarsDecs 
试着让它左递归

Statements : Statements Statement
VarsDecs   : VarsDecs VarDec 

基本问题是,它需要先减少一个空规则,然后才能开始解析语句,但当它将
VARNAME
视为前瞻时,它无法判断它是否位于变量delcaration的末尾,因为它需要更多的前瞻来区分
VarDec
语句

您可以通过将其设置为左递归而不是右递归来稍微改进,但这并不能完全解决问题。要真正解决此问题,您需要消除空语句规则:

Statements : Statements Statement
           | Statement
然后将
方法
规则更改为两个版本,一个有语句,一个没有:

Method     : METHODNAME Params ')' ':' Types '{' VarsDecs Statements RETURN Returns '}' ';'
           | METHODNAME Params ')' ':' Types '{' VarsDecs RETURN Returns '}' ';'