Я наткнулся на этот ответ для написания анализатора сверху вниз: 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)?