C ++扫描器(string-fu!)

时间:2009-01-29 15:36:44

标签: c# java c++ string

我正在编写扫描程序作为编译器的一部分。

我正在努力编写这一部分时遇到了一个令人头痛的问题:

我需要能够解析一个令牌流并将它们逐个推入一个向量中,忽略空格并标记特殊符号(简单的情况下,让我们考虑括号和括号)

实施例:     int main(){ }

应解析为6个不同的标记:

  1. int
  2. main
  3. {
  4. }
  5. 你会如何解决这个问题?我是用C ++编写的,但是java / C#解决方案也会受到赞赏。

    有些观点:

    1. 并且不,我不能使用Boost,我不能保证库会 我可以。 (不要问......)

    2. 我不想使用lex或任何其他特殊工具。我从来没有做过 这之前只想尝试一次说我已经完成了。

6 个答案:

答案 0 :(得分:6)

Stroustrup的书 C ++编程语言,有一个很好的例子,可以为简单的计算器程序构建词法分析器/解析器。它应该是学习如何做你想做的事情的良好起点。

答案 1 :(得分:3)

购买Compilers: Principles, Techniques, and Tools(龙书)的副本。你试图写的是词法分析器,而不是“扫描仪”。

答案 2 :(得分:3)

为什么要写自己的 - 看看Lex。

如果你必须拥有自己的,你只需按字符阅读输入字符并保持一些最小状态以累积标识符。

问题本身并不难。如果你无法解决它,你必须被烧掉,你只需要休息一下。早上再看一遍。

答案 3 :(得分:2)

如果您真的想从本练习中学到一些东西,那就开始编码吧。它不需要很多代码,所以你可以反复失败而不会超过一个下午。

此时你会对这个问题有一个很好的感觉。

然后查看任何随机编译器书籍,看看“通常”的方法是什么,然后你马上就会知道。

答案 4 :(得分:1)

嗯..我只是做一个while循环,迭代器测试每个字符的类型,只有alpha到非alpha变化,如果它是非空的,则转储字符串。如果它是一个非alpha非空格字符,我只是将它推到令牌堆栈上,这实际上是一个简单的解析任务。拍摄,我一直想学习lexx / yacc,但你想要的解析水平真的很容易。我曾经写过一个html tokenizer,这个更复杂。我的意思是你只是在寻找名字,空格和单个非字母数字字符..就这么做。

答案 5 :(得分:1)

如果你想从头开始编写,你可以考虑编写有限状态机(枚举中的状态,状态切换的大开关/大小写块)。您必须将状态推送到堆栈,因为所有内容都可以嵌套。

我知道这不是理想的方法;我只是想直接解决这个问题。