【发布时间】:2019-01-29 22:40:12
【问题描述】:
我想用Parsec 解析几个缩进或格式化为数组的命令列表。例如,我的列表格式如下:
Command1 arg1 arg2 Command1 arg1 arg2 Command1 arg1 arg2
Command2 arg1 Command3 arg1 arg2 arg3
Command3 arg1 arg2 arg3
Command4
Command3 arg1 arg2 arg3 Command2 arg1
Command4
Command4
Command5 arg1 Command2 arg1
这些命令应该在解析器中随着状态变化逐列解析。
我的想法是将命令收集到单独的字符串列表中,并将这些字符串解析为子解析器(在主解析器内执行)。
我检查了 Parsec 库的 API,但没有找到执行此操作的函数。
我考虑过使用runParser,但这个函数只提取解析器的结果而不是它的状态。
我也考虑过制作一个受runParsecT 和mkPT 启发的函数来制作我自己的解析器,但是构造函数ParsecT 或initialPos 不可用(不由库导出)
是否可以使用Parsec 在解析器中运行子解析器?
如果不行,像megaparsec 这样的库能解决我的问题吗?
【问题讨论】:
-
你可以只
getState并将状态包含在解析器的结果中。 -
我有这个想法,但我希望在子解析器失败时返回解析器的状态(将错误消息推送到主解析器)。
-
megaparsec确实有返回状态的runParser'。 -
@JeanJouX 如果您只关心简单的错误消息,也许 ParserError 就足够了吗?解析器用户状态旨在回溯失败。如果您想要一些状态/输出来收集不回溯的状态/数据,那么您可能应该将其保留在 Parsec 之外(例如,在 WriterT 上堆叠 ParserT)。
标签: parsing haskell parsec megaparsec