我正在为稍微复杂的数据格式编写词法分析器(使用 re2c)和解析器(使用 Lemon):类似于 CSV,但在特定位置具有特定的字符串类型(仅限字母数字字符、字母数字字符和减号,除此之外的任何字符引号和逗号,但带有平衡的大括号等),大括号内的字符串和看起来像函数调用的字符串,带有可以包含参数的左大括号和右大括号。
我第一次尝试它是一个有许多状态的词法分析器,每个状态都迎合特定的字符串格式。但是在来自词法分析器的许多无用的“意外输入”消息(变得非常大)之后,我意识到它可能正在尝试完成解析器的工作。我放弃了我的第一次尝试,使用了一个只有一个状态、许多字符标记和一个将标记组合成不同字符串类型的解析器的词法分析器。这效果更好,当某些东西关闭时,我会从解析器中得到更多有用的语法错误,但仍然感觉不太正确。我正在考虑向词法分析器添加一个或两个状态,但从解析器启动状态,它对给定实例中需要哪种字符串类型有更好的“概述”。总的来说我觉得有点傻:(
我没有正式的 CS 背景,并且对数学很重的理论有点回避。但也许某处有一个教程或书籍来解释词法分析器应该(和不应该)做什么以及解析器应该做什么工作。如何构建良好的标记模式,何时使用词法分析器状态,何时以及如何使用递归规则(使用 LALR 解析器),如何避免模棱两可的规则。一本讲授基础知识的实用食谱。“Lex and YACC Primer/HOWTO”很好,但还不够。因为我只是想解析一种数据格式,所以关于编译器构建的书(比如红龙书)对我来说看起来有点过大。
或者也许有人可以在这里给我一些简单的规则。