编写一个tokenizer,从哪里开始?

时间:2011-05-07 01:12:57

标签: c++ css tokenize

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

我看过Boost.Tokenizer,看起来很不错,但它对我没有任何帮助。它肯定是一个很好的包装器包装器,但问题在于使用Boost术语编写令牌分离器,TokenizerFunction。

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

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

2 个答案:

答案 0 :(得分:4)

编写一个“正确的”词法分析器和/或解析器比你想象的要困难得多。当你开始处理奇怪的角落案件时,它会变得丑陋。

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

我是OldFart®,我使用lex / yacc(或使用相同语法的东西)进行此类项目。我第一次学会在80年代早期使用它们,并且已经多次重复学习它们。

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

答案 1 :(得分:0)

BoostSpiritQi将是我的首选。

  

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

Qi教程甚至通过为XMLish语言实现解析器来完成;为CSS编写语法应该要容易得多。