私は自分自身のパーサーコンビネータライブラリを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)
、その後、私は値に到達するまで、構文解析の段階では、構文解析を続けます。
しかし、私はこのようにするべきかどうかは確信していません...誰かがこの問題の解決策を提案できますか?
ああ、ありがとうございます。 Quick qs、私はExprデータ型の定義で、Var値のコンストラクタを持っていて、なぜそれが役立つのだろうと思っていたのですか?私は、x = 5のようなステートメントがあれば、パーサはそれを(Assign x(Int 5))のようなものに変換するという印象を受けました。最初はバインディングを持たない変数宣言(例:x)のvarケースです。 ? – Zubair
@Zubair「5 + x」は何を解析するのですか? – MathematicalOrchid
ah私は、関連するデータ型が定義されていると仮定して、BinApp Add(Lit Int 5)(Var x)というソートを想定しています。 – Zubair