2016-07-08 4 views
0

フレックス/ビソンの新機能です。私は、ジェネリック型をサポートする単純なプログラミング言語用のパーサーを作成しようとしています。一般的なタイプのシグネチャのFlex Bison解析。

私はこのような行を解析したいと思います:

fn foo(Vector<Pair<int, Array<T>>) -> void {} 

私はVector<Pair<int, Array<T>>のために手作りのパーサを書く方法を想像することができます。私は遭遇した数字の<を追跡して、型の指定が完了したかどうかを判断するのに遭遇する数と一致させます。

タイプについては、文法仕様は私が信じるようなものでしょうか?

TYPE : ID | ID '<' TYPE '>' 
    ; 

TYPEがFlexまたはBisonによって作成されたトークンであるかどうかはわかりません。

私の理解では、次のとおりです。

  • IDは、パーサ(フレックス)
  • TYPEはバイソンで定義された `用語」(ではないトークン)であるからトークンです。
  • FlexとBisonは、空白とタブを自動的に無視します。

私は正しい方向に向いていますか?

注:このプロジェクトは教育目的のためのものです。宿題などではありません。

答えて

0

あなたは適切な方向にありますが、正しい用語を学ぶことは有益です。この用語を知ることは、より有用な情報を含むテキストブックを理解して使用するのに役立ちます。 TYPE文法非終端シンボルと呼ばれることになるのに対し、ルールTYPE

IDは、端末シンボルとして知られているであろう。 文法は、言語を記述するために使用されるルールのセットです。各文法ルールは、の非終端記号を定義します。最終的に各の非終端記号は、端末記号の配置として、一意的(あいまいではない)配置で説明される。

端末シンボルは、その具体的な表現である何を表すトークンで表されます。具体的な表現は、実際にキーボードに入力されたものです。具体的な表現を構成する文字の並びは、字句として知られています。 トークンを作成する語彙素のマッチングは、字句解析(又はスキャナ)によって実行されるタスクです。文法規則におけるの非終端記号へのトークンのシーケンスの一致は、構文解析として知られています。

Flexは字句解析ツールを生成するツールであり、bisonは解析ツールを生成するツールです。

したがって、TYPEはトークンではなく、非終端記号(そうでなければ文法規則名として知られています)です。それはフレックスやバイソンが "生産"するのではなく、文法の作家によって作られています。バイソンによって生成パーサーはTYPEと呼ば非終端端子非端末配列を減少させます。 トークンまたはターミナルシンボルはCAPSや文字定数のいずれかとして書かれていることを不文律慣習がある

トークン端子非端子ルールの間での混乱を避けるために。例えば:

ID, '<' 

非端末又は構文規則は、前者との混同を避けるため小文字で書かれています。たとえば:

type, expression 

ので、バイソンの経験豊富なユーザーが書き込み可能性があります

type_signature : ID 
    | ID '<' type_signature '>' 
    ; 

それぞれの名前の性質がより明確にされる方法。

ここで空白について説明します。いいえ、フレックスとバイソンは、(自動またはその他の)空白、タブ、改行、キャリッジリターン、および他の見えない文字を無視しませんが、(あなたの質問と同様に)複雑です。

字句解析ツールが扱う具体的な表現には空白文字があり、flexとbisonツールへの言語処理を記述するルールセットには空白文字があります。処理したい言語には、構文上(または意味上)重要な空白文字(極端な例として、WhiteSpaceという言語があります)を含めることができます。 flexとbisonを使ってその言語用のパーサを書くことができるので、入力記述ファイルや入力ランゲージの空白をすべて無視することはできません!あまりにも多くの細部に入るのではなく、ある場所では空白を無視し、他の場所では特に重要であることに注目するだけです。経験豊かになるまでは注意が必要です。空白は、パーサールールファイルよりもレクサールールファイルでより敏感です。

+0

詳細な回答ありがとうございます。優れた開発者のベストプラクティスに関する良い文書がありますか?私が見ているチュートリアルは、アクションブロックから直接ステートメントを出力する方法やインタープリタを実行する方法などです。また、状況依存のアクションコードを作成する方法もあります。そのためのベストプラクティスはありますか?例:関数型宣言のコンテキスト内にある場合は、TypeオブジェクトをArg型のリストに追加します。この型を、関数の戻り型のコンテキスト内にある場合は、関数宣言の戻り型として設定します。 – user855

+0

@ user855 - この回答をお試しください:http://stackoverflow.com/questions/37186​​142/goto-label-in-the-same-loop-in-bison/37208755#37208755 –

関連する問題