我有以下野牛語法(如更復雜的語法的一部分):去除模糊
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的發電機(比如野牛)會自動爲你做這件事。 –