文法、レクサー、パーサーに関する説明


8

背景情報5月スキップ):提供されているDSLの文法を設計する必要があるuniで設定されたタスクに取り組んでいます。文法はBNFまたはEBNFでなければなりません。他にも、文法の語彙ルールと構文解析ルールについて評価されています。たとえば、ルールが言語サブセットに適しているかどうか、これらのルールがどれほど包括的であるか、ルールがどれほど明確であるかなどです。

私が理解していないのは、これらのルールがBNFで定義された文法でカバーされているかどうかです(これは私たちにとって新しいトピックです)。

質問:BNFまたはEBNFのいずれかで定義されている特定の言語の文法には、字句解析 または構文解析、あるいはその両方のルールが含まれていますか?(またはこれらは他の場所で指定する必要がありますか?

また、何が字句規則と考えられますか?そして、何が解析ルールと考えられますか?


1
BNFは、正規表現が正規の言語を完全に記述するのと同じように、文法を完全に記述する構文です
ラチェットフリーク

4
はい、レクシングと解析の両方を1つのBNFのような記述で定義できます-たとえば、PEGを参照してください。字句解析と構文解析の違いはかなり恣意的で時代遅れです。
SKロジック

回答:


8

はい、BNF文法には字句解析と構文解析に必要なすべてのルールが含まれています。2つの違いは少しあいまいです。EBNFの字句規則の良い例は次のとおりです。

number = [ "-" ], digit, { digit } ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;

通常、レクサーは比較的単純なコードを使用して実装できます。文字列で次のスペースを検索し、結果がオプションの「-」で始まり、その後に少なくとも1桁が含まれ、その後に数字のみが含まれるかどうかを確認できます。レクサーはほとんどの場合別のステップでしたが、最近ではパーサーと一緒にまとめられています。したがって、あいまいさ。

パーサールールが使用するであろうnumber次の加算の式のように、大きな何かを作るために非ターミナルを。

add = number, "+", number

同じファイルで混同されていても、教授は「レクサー」ルールと「パーサー」ルールの明確な区別を見たいと思うでしょう。たとえば、これを行わないでください。

add = {"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" }, "+",
      {"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" }

エラーが発生しやすいだけでなく、読み取りや実装が困難です。


ありがとう、「レクサー」ルールと「パーサー」ルールを明確に区別することに関するセクションは、評価対象を理解するのに本当に役立ちました。
The_Neo 2014年

4

字句解析の文法は通常、正規表現を使用して指定されます(特に大学タイプのプロジェクトの場合)。通常の言語を受け入れます。

パーサーは通常、BNFを介して指定できるコンテキストフリー言語を受け入れます

パーサーとスキャナー(または字句アナライザー)の違いはやや不自然ですが、パーサーの作成が簡単になります。

http://en.wikipedia.org/wiki/Chomsky_hierarchyを参照してください


大学のプロジェクトが異なることがよくある点について、良い点を挙げます。正確な要件を教授と明確にすることは彼に必要です。
Karl Bielefeldt

2

あなたの質問への答えは確かにあります。解析ルールと字句解析ルールの両方を、EBNF(実際にはBNFのよりコンパクトな形式です)を使用して指定できます。ただし、プロダクション品質のコンパイラでは、答えの次の部分は異なります。

ほとんどの言語には、文脈に依存しない文法があり、先読みとバックトラッキングに関する一連のルールに準拠しています。最も一般的な文法はLL(1)とLR(1)です。LR(1)は通常YACCなどのパーサージェネレーターを意味しますが、LL(1)文法は、多くの場合、手作業でコード化された単純な再帰降下文法を許可します。文法のこの部分は、トークン(端末)まで続きますが、それより低くはありません。

シンボルは通常、演算子文法などのさらに単純な文法を使用して個別に定義されます。[ここで説明するよりも適切な定義については、これらの用語を調べることができます。]これらのシンボルを読み取るレクサーは、通常、コンパイラーのパフォーマンスの大部分に関与するため、私の経験では、常に手動でコーディングされています。LEXは不格好で(Cのみ)、正規表現が遅すぎます。

重要なのは、構文解析ルールがパーサーに必要なテクノロジーを駆動し、字句化ルールが字句解析プログラムに対応することを理解することです。それらの間の明確な違いは、それらがトークン(端末)の使用に適用されるか、それらの構築に適用されるかです。

これはあなたの学問の進歩を助けることはできませんが、おもちゃのプロジェクトを超えて行く場合は重要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.