トップダウン パーサーを作成するためのこの回答に出くわしました: Is there an alternative for flex/bison that is used 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) ではありませんか?