2016-08-31 17 views
1

私は自分自身のパーサーコンビネータライブラリをHaskellに書こうとしています。識別子の解析方法には苦労しています。 私はASTの一部となる次のように定義されたデータ型を持っています。Haskell Parser Combinators - identifiers

data Expr = Var String | .... deriving (Show) 

この式の目的は、変数の名前を解析することです。パーサは次のように定義されています:

identifiers :: Parser Expr 
identifiers = do 
    first <- string "_" <|> alphanum 
    rest <- many alphanum 
    guard $ notElem (first:rest) keywords 
    return $ Var (first:rest) 

私は構文解析のどこで識別子がバインドされているかを考慮しているのだろうかと思っていました。たとえば、number_of_results = 5があった場合、パーサは識別子の名前を解析しますが、識別子の値がどのようなものであるかをどのように参照していますか?私は当初、次のようにデータ型を再定義検討していた

data Expr = Var String Value | .... deriving (Show) 

、その後、私は値に到達するまで、構文解析の段階では、構文解析を続けます。

しかし、私はこのようにするべきかどうかは確信していません...誰かがこの問題の解決策を提案できますか?

答えて

3

式の値がで、それはインタプリタの仕事であることを理解するのはパーサーの仕事ではありません。パーサの仕事は、通訳者が作業するためにテキストのくさびを何かに変えることに過ぎない。この場合

、あなたはおそらく、あなたがまたはフロー制御をします(ただ結果を生成)表現(区別したくない場合があり

data Expr = Assign String Value | Var String | ... 

ような何かをしたいです等々)。それはあなたが解析しようとしている言語がいかに複雑であるかによって異なります。

あなたが構築されたらあなたは(おそらく?)、変数に5

のようなだけではなく、一定の任意表現の結果を割り当てることができますので、あなたはまた、Assign String Exprにこれを変更することもできますテキストをこの構造体に変換し、別の独立したタスクとしてプログラムを "実行"するインタプリタを書くパーサです。

+0

ああ、ありがとうございます。 Quick qs、私はExprデータ型の定義で、Var値のコンストラクタを持っていて、なぜそれが役立つのだろうと思っていたのですか?私は、x = 5のようなステートメントがあれば、パーサはそれを(Assign x(Int 5))のようなものに変換するという印象を受けました。最初はバインディングを持たない変数宣言(例:x)のvarケースです。 ? – Zubair

+1

@Zubair「5 + x」は何を解析するのですか? – MathematicalOrchid

+1

ah私は、関連するデータ型が定義されていると仮定して、BinApp Add(Lit Int 5)(Var x)というソートを想定しています。 – Zubair