我正在编写一个词法分析器(re2c)和一个解析器(Lemon),用于稍微复杂的数据格式:类似CSV,但在特定位置具有特定的字符串类型(仅包含字母数字字符、字母数字字符和减号、除引号和逗号外的任何字符但带有平衡的大括号等),大括号内的字符串和看起来像函数调用的字符串,其中开放和关闭的括号可以包含参数。
我的第一次尝试是使用多个状态的词法分析器,每个状态都满足特定的字符串格式。但是,在词法分析器中遇到许多无用的“意外输入”消息(词法分析器变得非常庞大)后,我意识到它可能试图做解析器的工作。我放弃了第一次尝试,使用了只有一个状态、许多字符令牌和一个将令牌组合成不同字符串类型的解析器。这个方法工作得更好,如果出现问题,解析器会提供更有用的语法错误信息,但仍然感觉不太对。我考虑增加一个或两个状态到词法分析器,但是从解析器中初始化状态,解析器能够更好地了解在给定情况下需要哪种字符串类型。总体来说,我感觉有点愚蠢:(
我没有正式的计算机科学背景,对数学理论有点害羞。但也许有教程或书籍可以解释词法分析器应该做什么(和不应该做什么),以及解析器应该做哪些工作。如何构建好的标记模式,何时使用词法分析器状态,何时以及如何使用递归规则(与LALR解析器一起),如何避免歧义规则。一个教授基础知识的实用菜谱。 “Lex and YACC primer/HOWTO” 不错,但不够好。由于我只想解析数据格式,编译程序构建的书籍(如红龙书)对我来说似乎有点过大了。
或者也许有人能在这里给我一些简单的规则。
我的第一次尝试是使用多个状态的词法分析器,每个状态都满足特定的字符串格式。但是,在词法分析器中遇到许多无用的“意外输入”消息(词法分析器变得非常庞大)后,我意识到它可能试图做解析器的工作。我放弃了第一次尝试,使用了只有一个状态、许多字符令牌和一个将令牌组合成不同字符串类型的解析器。这个方法工作得更好,如果出现问题,解析器会提供更有用的语法错误信息,但仍然感觉不太对。我考虑增加一个或两个状态到词法分析器,但是从解析器中初始化状态,解析器能够更好地了解在给定情况下需要哪种字符串类型。总体来说,我感觉有点愚蠢:(
我没有正式的计算机科学背景,对数学理论有点害羞。但也许有教程或书籍可以解释词法分析器应该做什么(和不应该做什么),以及解析器应该做哪些工作。如何构建好的标记模式,何时使用词法分析器状态,何时以及如何使用递归规则(与LALR解析器一起),如何避免歧义规则。一个教授基础知识的实用菜谱。 “Lex and YACC primer/HOWTO” 不错,但不够好。由于我只想解析数据格式,编译程序构建的书籍(如红龙书)对我来说似乎有点过大了。
或者也许有人能在这里给我一些简单的规则。