2

私が設計していない単純な言語を解析する必要があるため、言語を変更することはできません。C# で結果が必要なので、使いやすく、パーサーを実行するために外部ライブラリを必要としないので、TinyPGを使用しています。

言語でこの構造に出くわすまで、物事はかなりうまくいっていました。(これは単純化されたバージョンですが、問題を示しています):

EOF               -> @"^\s*$";
[Skip] WHITESPACE -> @"\s+";
LIST              -> "LIST";
END               -> "END";
IDENTIFIER        -> @"[a-zA-Z_][a-zA-Z0-9_]*";
Expr              -> LIST IDENTIFIER+ END;
Start             -> (Expr)+ EOF;

結果のパーサーはこれを解析できません:

LIST foo BAR Baz END

END をキーワードIDENTIFIERとして適切にではなく、貪欲に lexes するためです。END

だから、ここに私の質問があります:

  1. この文法は LL(1) 解析に対してあいまいですか、それとも間違っていますか? それともTinyPGのバグですか?

  2. TinyPG例の行を適切に解析するように文法を再設計する方法はありますか?

  3. C#コードを出力し、追加のライブラリを必要としない単純なパーサーに関する他の提案はありますか? LLLPGとを見てきましたがANTLR4、 よりもはるかに面倒TinyPGでした。

4

1 に答える 1

0

私がGitHubで回答したものと同じように見えるので、あなたは同じ人かもしれませんが、ここでも、この問題をグーグルで調べている人向けです。

これは、Simple-CIL-compiler プロジェクトの例です。識別子は、リストされているものを除く単一の単語をキャッチする必要があります。つまり、識別子に例外トークンを含める必要があります。

IDENTIFIER-> @"[a-zA-Z_][a-zA-Z0-9_]*(?<!(^)(end|else|do|while|for|true|false|return|to|incby|global|or|and|not|write|readnum|readstr|call))(?!\w)";

それが役立つことを願っています。

(元の投稿へのリンク)

于 2016-08-16T15:39:15.027 に答える