【问题标题】:Writing a tokenizer, where to begin?编写分词器,从哪里开始?
【发布时间】:2011-05-07 01:12:56
【问题描述】:

我正在尝试用 C++ 为 CSS 编写分词器,但我不知道如何编写分词器。我知道它应该是贪婪的,为每个令牌读取尽可能多的输入,理论上我知道如何将其放入代码中。

我查看了 Boost.Tokenizer,它看起来不错,但对我没有任何帮助。它确实是一个很好的分词器包装器,但问题在于编写分词器,即 Boost 术语中的 TokenizerFunction。

我不知道如何编写这个标记器,是否有任何“简洁”的方法,比如与 the syntax itself 非常相似的东西?

请注意,我不是在寻找解析器!我的应用程序不需要能够理解 CSS,只需将 CSS 文件读取为通用的内部标记化格式,处理一些事情并再次输出。

【问题讨论】:

  • 请注意,文件结尾规则使得使用现成的标记器对 CSS 进行标记......很有趣。假设这是可能的。

标签: c++ css tokenize


【解决方案1】:

编写“正确”的词法分析器和/或解析器比您想象的要困难得多。当你开始处理奇怪的极端情况时,它会变得很丑。

我最好的建议是花一些时间来学习一个合适的词法分析器/解析器系统。 CSS 应该是一种相当容易实现的语言,然后您将获得一个非常强大的工具,您可以将其用于各种未来的项目。

我是一个 Old Dart®,我在这类项目中使用 lex/yacc(或使用相同语法的东西)。我第一次学会使用它们是在 80 年代初,它已经返回了学习它们很多很多次的努力。

顺便说一句,如果你有任何接近 BNF 语言的东西,lex/yacc 可以很容易使用。

【讨论】:

  • Lex 和 Yacc 仍然是最简单的方法。
  • 我对 Lex&Yacc 不熟悉,它是一个库、一种语言还是?
  • @nightcracker Google Google Google!
  • @Henry:我是,但我真的很困惑。维基百科页面上有一段 sn-p 代码,但它似乎是 C 混合了一些应该是 lex 的东西。
  • @nightcracker - 来自您提到的维基百科页面:“Lex 读取指定词法分析器的输入流并输出以 C 编程语言实现词法分析器的源代码。”看起来很清楚...
【解决方案2】:

Boost.Spirit.Qi 将是我的首选。

Spirit.Qi 被设计成一个实用的解析工具。从 C++ 中内联的正式 EBNF 规范生成完整工作解析器的能力显着减少了开发时间。程序员通常使用诸如 scanf 等原始工具的 ad hoc hack 来进行解析。当我们需要编写更精细的解析器时,即使是正则表达式库(例如 boost regex)或扫描器(例如 Boost tokenizer)也不能很好地扩展。尝试使用这些工具编写一个中等复杂的解析器会导致代码难以理解和维护。

Qi 教程甚至以实现 XMLish 语言的解析器结束;为 CSS 编写语法应该会容易得多。

【讨论】:

  • 一个谨慎的世界:让编译器屈服!您希望解析器适当地位于单个翻译单元中,并且是独立的,以便尽可能少地重新编译它。更好的是:能够切成几块,每块都在他们的 TU 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多