1

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

4

2 に答える 2

0

問題は、ID(xxx) がステートメントと式の両方のコンテキストに表示される可能性があることです。

他の答えが言うように、もっと因数分解する必要があります。それほど難しくありません。文法を次のように書きます。

Stmt = Id  ( '=' Expr ';' |
             RestOfExpression );

 RestOfExpression = '(' Expr ')' |
                     ϵ );
 Expr =  Id  RestOfExpression;

コードは明白であるべきです。

于 2013-09-26T18:58:12.413 に答える