我正在尝试在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)
然后,在解析阶段,继续解析,直到我得到一个值。
但是,我不太确定我是否应该这样做......有人可以建议解决这个问题吗?
答案 0 :(得分:3)
解析器的工作不在于弄清楚表达式的值是什么 - 这是解释器的工作。解析器的工作仅仅是将一段文本转换成更容易让翻译工作的东西。
在这种情况下,您可能会执行类似
的操作data Expr = Assign String Value | Var String | ...
您可能想要也可能不想区分表达式(只产生结果)和语句(做流量控制等)。这取决于您尝试解析的语言有多复杂。
您可能还想将此更改为Assign String Expr
,因为您可以(大概?)将任意表达式的结果分配给变量,而不仅仅是像5这样的常量。< / p>
一旦你构建了一个将文本转换为这个结构的解析器,然后编写一个解释器,将该程序“执行”为另一个独立的任务。