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 '}' ';'