0

この古いチュートリアルに従って、レモンパーサーにEOLトークンの解析を自動的に終了させようとしています。パーサーの関連部分は次のようになります。

start ::= in .
in ::= .
in ::= in commandList EOL .
{
    printf("start ::= commandList .\n");
    printf("> ");
}

Flex によってスキャンされたトークンを使用してパーサーを実行する方法は次のとおりです。

int lexCode;
do {
    lexCode = yylex(scanner);
    Parse(shellParser, lexCode, yyget_text(scanner));
    // XXX This line should not be necessary; EOL should automatically
    // terminate parsing. :-(
    if (lexCode == EOL) Parse(shellParser, 0, NULL);
} while (lexCode > 0);

EOLここでトークンをチェックする必要をなくし、いつ完了したかをパーサーに判断させたいと思います。それ、どうやったら出来るの?

ありがとう!

4

1 に答える 1

1

EBNF用語では、あなたの定義in

in ::= (commandList EOL)*

これにより、複数の EOL が可能になります。あなたが欲しいのは

in ::= commandList* EOL

どちらがうまくいくはずです

start ::= in EOL .
in ::= .
in ::= in commandList .

これは、完全に空の入力 (EOL でさえも) を許可しないことに注意してください。これが問題である場合は、必要に応じて微調整できます。

于 2013-01-30T16:46:47.253 に答える