解析 – 在解析器组合器中组合词法分析器和解析器

我正在使用uu-parsinglib,但我认为以下问题是解析器组合器泛型.

让我们考虑以下示例:

我有一个带有组合子pLex的词法分析器,它产生一个标记列表(MyToken类型).我现在想编写一个解析器,它将使用令牌并构建AST.

连接词法分析器和解析器的最佳方法是什么?现在我有一个lex函数:

lex s = parse ( (,) <$> pLex <*> pEnd) (createStr (LineColPos 0 0 0) s)

我应该创建一个函数解析p = …?如果是,我如何构建它以跟踪词法分析器中的列和行?或者我应该创建一个parserCombinator,它会以某种方式使用pLex组合器?

最佳答案
基于表的解析器需要分离词法分析和解析,因为它们的前瞻能力有限.展望未来,将词法分析与解析器结合起来会爆炸状态空间.

基于组合器的方法通常不会遇到这个问题,因为它们通常进行递归下降解析.除非图书馆作者另有说明,否则将各阶段结合起来并没有什么害处,而将它们分开并没有多大帮助.

虽然uu-parsinglib提供了Str类来抽象不同的类似字符串的输入,但是查看它的定义表明它仍然假设你最终正在读取一个Char序列,无论它们来自String,ByteString,Text等.所以试图让它解析一个MyToken流似乎很难.如果您觉得需要这样做,Parsec可能是更好的选择.

关于你的字符串实现的问题,组合器采用包含语法结构的字符串式输入,并返回相应的语义值(如果匹配).在组合器内部,您可以通过从输入流中获取并通过组合您调用的子组合器的语义值来直接从您解析的内容构建语义值.

因此,您的示例中的“字符串匹配”组合器将在其范围内具有令牌列表,这要归功于它所做的解析.您可以使用Haskell的全部功能将这些令牌组合成单个MyString值,无论以何种方式对您的语言有意义:可能是一个’SplicedString’类型,表示要将哪些值切入其中.

字符串组合器可能由“表达式”组合器调用,它可以将MyString值与其他已解析的值组合成MyExpression值.它的组合器一直在返回语义值!

转载注明原文:解析 – 在解析器组合器中组合词法分析器和解析器 - 代码日志