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

chi*_*org 6 string parsing character dataformat lexer

我正在写一个词法分析器(带有re2c)和一个解析器(带有Lemon),用于稍微复杂的数据格式:类似CSV,但在特定位置使用特定的字符串类型(仅限字母数字字符,字母数字字符和减号,除了引号和逗号但带有平衡括号等),括号和字符串中的字符串看起来像函数调用,可以包含可以包含参数的开括号和右括号.

我的第一个镜头是一个有很多州的词法分析器,每个州都适应特定的字符串格式.但是,在词法分析器的许多无意义的"意外输入"消息(它变得非常大)之后,我意识到它可能正在尝试进行解析器的工作.我取消了我的第一次尝试并且使用只有一个状态的词法分析器,许多字符标记和一个将标记组合成不同字符串类型的解析器.这样做效果更好,当某些东西关闭时,我从解析器中获得更多有用的语法错误,但它仍然感觉不太正确.我正在考虑向词法分析器添加一个或两个状态,但是从解析器启动状态,它具有更好的"概述",在给定的实例中需要哪种字符串类型.总的来说我觉得有点傻:(

我没有正式的CS背景,并且有点偏离数学重的理论.但也许有一个教程或书籍可以解释词法分析者应该(而且不应该)做什么以及解析器应该做哪些工作.如何构造良好的令牌模式,何时使用词法分析器状态,何时以及如何使用递归规则(使用LALR解析器),如何避免使用恶意规则.一本实用的食谱,教授基础知识."Lex和YACC入门/ HOWTO"很不错,但还不够.由于我只想解析一种数据格式,因此关于编译器构建的书籍(如红龙书)对我来说看起来有点过分.

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

Bor*_*lid 7

你真正应该做的是为你的语言写一个语法.一旦你有了,边界很容易:

  • 词法分析员负责接收您的输入并告诉您有哪个终端.
  • 解析器负责将一系列终端终端重复匹配到生产规则,直到您有解析树或解析失败.

词法分析器不负责输入验证,除非拒绝不可能的字符和其他非常基本的位.解析器完成所有这些.

请查看http://www.cs.rochester.edu/~nelson/courses/csc_173/grammars/parsing.html.这是一个关于解析的介绍CS课程页面.


Sas*_*asQ 5

决定是否应该由解析器或词法分析器完成某项操作的一个很好的试金石是问自己一个问题:

语法是否具有任何递归,嵌套,自相似的元素?
(例如嵌套括号,大括号,标签,子表达式,子句等).

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

Lexer通常用于查找您的语言的"单词",并对它们进行分类(它是一个名词吗?一个动词?一个形容词?等等).
解析器用于找到合适的"句子",如果它们是给定语言中的正确句子,则将它们结构化.