Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 解析器和词法分析器的设计指南?_String_Parsing_Character_Lexer_Dataformat - Fatal编程技术网

String 解析器和词法分析器的设计指南?

String 解析器和词法分析器的设计指南?,string,parsing,character,lexer,dataformat,String,Parsing,Character,Lexer,Dataformat,我正在为稍微复杂的数据格式编写一个lexer(带re2c)和一个解析器(带Lemon):类似CSV,但在特定位置有特定的字符串类型(仅限字母数字字符、字母数字字符和减号、除引号和逗号外的任何字符,但带有平衡大括号,等等),大括号内的字符串和看起来像函数调用的字符串,大括号的开头和结尾可以包含参数 我的第一次尝试是一个有很多州的lexer,每个州都适合特定的字符串格式。但是在lexer发出了许多无用的“意外输入”消息(变得非常大)之后,我意识到它可能是在试图完成解析器的工作。我放弃了第一次尝试,使

我正在为稍微复杂的数据格式编写一个lexer(带re2c)和一个解析器(带Lemon):类似CSV,但在特定位置有特定的字符串类型(仅限字母数字字符、字母数字字符和减号、除引号和逗号外的任何字符,但带有平衡大括号,等等),大括号内的字符串和看起来像函数调用的字符串,大括号的开头和结尾可以包含参数

我的第一次尝试是一个有很多州的lexer,每个州都适合特定的字符串格式。但是在lexer发出了许多无用的“意外输入”消息(变得非常大)之后,我意识到它可能是在试图完成解析器的工作。我放弃了第一次尝试,使用了一个只有一个状态的lexer、许多字符标记和一个将标记组合成不同字符串类型的解析器。这样做效果更好,当某些东西关闭时,我从解析器中获得了更多有用的语法错误,但它仍然感觉不太正确。我正在考虑向lexer添加一个或两个状态,但从解析器启动这些状态,解析器可以更好地“概述”给定实例中需要的字符串类型。总的来说,我觉得有点愚蠢:(

我没有正式的CS背景,也不太懂数学理论。但也许有一本教程或书解释了词法分析器应该(和不应该)做什么,以及解析器应该做什么。如何构造好的标记模式,何时使用词法分析器状态,何时以及如何使用递归规则(使用LALR解析器),如何避免模棱两可的规则。这是一本实用的烹饪书,教授基础知识。“Lex和YACC primer/HOWTO”不错,但还不够。因为我只想解析数据格式,所以编译器构建方面的书(如红龙书)对我来说有点太大了


或者有人可以在这里给我一些简单的规则。

你真正应该做的是为你的语言写一个语法。一旦你做到了,界限就很简单了:

  • lexer负责接收您的输入,并告诉您拥有哪个终端
  • 解析器负责重复地将一系列终端和非终端与生产规则匹配,直到出现解析树或解析失败
lexer不负责输入验证,除非拒绝不可能的字符和其他非常基本的位


看一看。这是一个关于解析的介绍性CS课程页面。

一个很好的试金石测试,用来决定解析器或词法分析器应该做什么,就是问自己一个问题:

语法是否有任何递归、嵌套、自相似的元素?
(例如嵌套括号、大括号、标记、子表达式、子内容等)

如果没有,普通正则表达式就足够了,它可以由lexer完成。
如果是,它应该由解析器进行分析,因为它至少是一种上下文无关的语法。

Lexer通常用于查找语言中的“单词”,并对其进行分类(是名词、动词、形容词等)。

解析器用于查找正确的“句子”,如果它们是给定语言中正确的句子,则将它们结构化为一个查找。

谢谢,这很有帮助。我总是想为我的终端创建聪明的正则表达式。因此,将来,我将在解析器中使用更多的产生式规则。