【发布时间】:2013-08-13 16:17:26
【问题描述】:
我正在使用uu-parsinglib,但我认为以下问题是解析器组合器泛型。
让我们考虑以下示例:
我有一个带有组合器pLex 的词法分析器,它产生一个标记列表(类型为MyToken)。我现在想编写一个解析器,它将使用令牌并构建一个AST。
连接词法分析器和解析器的最佳方式是什么?现在我有一个lex 函数:
lex s = parse ( (,) <$> pLex <*> pEnd) (createStr (LineColPos 0 0 0) s)
我应该创建一个函数parse p = ...吗?如果是,我如何构造它来跟踪来自词法分析器的列和行?或者我应该创建一个parserCombinator,它会以某种方式使用pLex 组合器?
【问题讨论】:
-
在我的手机上,所以我现在只指出:在 BasicInstances 模块中有 Str 类型和 createStr 可用于创建令牌流。
-
其他解析组合库有时也包含词法分析。为此,请参阅 Parsec 或解析器中的令牌解析模块。通常,这就是您使用解析器组合器的方向。但是您始终可以将杠杆的输出(例如 [MyToken])作为输入提供给令牌解析器。
-
@J.Abrahamson:我有相当大的语法,所以我不知道包含词法分析器和解析器是否是个好主意(但也许使用解析器组合器这是要走的路?)我'我遇到了这个问题,因为例如我的组合器“pString”返回一个标记的 list (因为在我的语言中,stirngs cna 有像
"test: $name"这样的变量。所以通常我写了一些“结束" 组合器,这会产生令牌列表,然后我将它们加在一起。这是一个不好的方法吗? -
@J.Abrahamson:如果你能告诉我如果你有一些组合器,你将如何设计解析器,我将非常感激,它们必须返回一个令牌列表(如上面的字符串或 pNewline,它应该返回
Newline和Indent Int(新行缩进)标记)。令牌流可能有效,但也许有更好的方法? -
您可以在主解析期间生成的每个令牌流上触发子解析器。因此,如果
tokenizeSegment :: P String [MyToken]和parseSegment :: P [MyToken] SegmentAST则执行parse parseSegment <$> tokenizeSegment :: P String (Either ParseError SegmentAST)之类的操作。您还可以通过解构Either并将ParseError传递给主解析器来处理该错误。
标签: parsing haskell parser-combinators uu-parsinglib