我有以下野牛语法(如更复杂的语法的一部分):去除模糊
classDeclaration : CLASS ID EXTENDS ID LBRACE variableDeclarationList methodDeclarationList RBRACE
;
variableDeclarationList : variableDeclarationList variableDeclaration
| /* empty */
;
variableDeclaration : type ID SEMICOLON
;
type : NATTYPE | ID
;
methodDeclarationList : methodDeclarationList methodDeclaration
| /* empty */
;
methodDeclaration : type ID LPAREN parameterDeclarationList RPAREN variableExpressionBlock
;
这是为了描述的类声明,其看起来像这样:
class foo extends object
{
nat number;
nat divide(nat aNumber)
{
0;
}
}
或这样的:
class foo extends object
{
nat divide(nat aNumber)
{
0;
}
}
或本:
class foo extends object
{
}
问题是,有歧义其中变量声明端和方法声明开始(2移/减少冲突)。例如,方法声明看起来像一个变量声明,直到它看到括号。
我怎么可以重写此语法来消除这种不确定性?
澄清:类体可以是空的,唯一的限制是,如果有任何变量声明之前方法声明来临。
有趣的理论。尽管如此,野牛仍然有麻烦,仍然有2个转变/减少冲突。 – ladookie
通常,这种左分解仅对基于LL的解析器生成器有用。基于LR的发电机(比如野牛)会自动为你做这件事。 –