对于这种语法,我如何在不使用parsec或任何库的情况下创建递归体面的解析器? 如果字符串不属于此语法,则输出应该是错误消息? parse :: String-> AST
Re-> Sq | Sq + Re
平方-> Ba | Ba Sq
Ba-> El |钡*
El->低位数字| (重新)
小写或小写字母都是小写字母或数字
答案 0 :(得分:2)
首先,您需要定义抽象语法树,可能是一些声明的数据类型。然后,您想定义基本的解析动作。例如,
type ParseResult = Either String AST
type ParseState = (ParseResult, String)
您的解析动作很简单:
re, sq, ba, el :: ParseState -> ParseState
其中re
是顶级解析器操作。
具体的解析步骤可能如下所示:
el (_, ('(':restOfInput)) = case re (Right restOfInput) of
err@(Left error, s) -> err
(result, ')':s) -> (El result, s)
(_, s) -> (Left "no closing parens", s)
el (_, input@(c:restOfInput)) = if lowerOrDigit c
then (El c, restOfInput)
else (Left "bad character", "")
解析库为您提供很多帮助的地方在于处理所有解析状态并在调用堆栈中传播错误。