我在编写自上而下的解析器时遇到了这个答案:是否有可用于 8 位嵌入式系统的 flex/bison 替代方案?但我对几点感到困惑。
说我有这个语法:
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) 吗?