Haskell 解析器组合器 - 标识符

Haskell Parser Combinators - identifiers

我正在尝试在 Haskell 中编写自己的解析器组合器库,但我正在为如何解析标识符而苦苦挣扎。 我有一个定义如下的数据类型,它将成为我的 AST 的一部分。

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)

然后在解析阶段,继续解析,直到得到一个值。

但是,我不太确定我是否应该这样做...有人可以建议解决这个问题的方法吗?

找出表达式的值不是解析器的工作——那是解释器的工作。解析器的工作只是将一小段文本转换为更易于解释器处理的内容。

在这种情况下,您可能会这样做

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

您可能想要也可能不想区分 表达式(只产生一个结果)和 语句(进行流量控制和很快)。这取决于您要解析的语言的复杂程度。

您可能还想将其更改为 Assign String Expr,因为您可以(大概?)将任意 表达式 的结果分配给一个变量,而不仅仅是一个变量常数如 5.

一旦你构建了一个将文本转换为这种结构的解析器,然后编写一个解释器,"executes" 程序作为另一个单独的任务。