我遇到了寫這個自頂向下解析器的答案:Is there an alternative for flex/bison that is usable on 8-bit embedded systems?但我對幾點感到困惑。手寫自頂向下解析器
說我有這個語法:
Expr = Id | Id '(' Expr ')'
Stmt = Id '=' Expr | Expr
我不知道,如果它是絕對必要的,但我想我們可以左鍵因素語法:
Expr = Id ExprRest
ExprRest = ϵ | '(' Expr ')'
Stmt = Id '=' Expr ';' | Expr ';'
究竟是如何將我寫的代碼正確解析foo(x);
作爲Stmt
?如果我們寫像Stmt
解析代碼:
func ParseStmt() {
if ParseId() {
return ParseTerminal('=') && ParseExpr() && ParseTerminal(';');
} else {
return ParseExpr() && ParseTerminal(';');
}
}
我們將看到Id
foo
,假設我們是在第一種情況下,再失敗,因爲我們無法找到=
以下foo
。
這個語法不是LL(1)嗎?