Haskell Parser Combinators - 标识符

时间:2016-08-31 11:03:20

标签: parsing haskell parser-combinators

我正在尝试在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)

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

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

1 个答案:

答案 0 :(得分:3)

解析器的工作不在于弄清楚表达式的值是什么 - 这是解释器的工作。解析器的工作仅仅是将一段文本转换成更容易让翻译工作的东西。

在这种情况下,您可能会执行类似

的操作
data Expr = Assign String Value | Var String | ...

您可能想要也可能不想区分表达式(只产生结果)和语句(做流量控制等)。这取决于您尝试解析的语言有多复杂。

您可能还想将此更改为Assign String Expr,因为您可以(大概?)将任意表达式的结果分配给变量,而不仅仅是像5这样的常量。< / p>

一旦你构建了一个将文本转换为这个结构的解析器,然后编写一个解释器,将该程序“执行”为另一个独立的任务。

相关问题