我正在编写扫描程序作为编译器的一部分。
我正在努力编写这一部分时遇到了一个令人头痛的问题:
我需要能够解析一个令牌流并将它们逐个推入一个向量中,忽略空格并标记特殊符号(简单的情况下,让我们考虑括号和括号)
实施例:
int main(){ }
应解析为6个不同的标记:
你会如何解决这个问题?我是用C ++编写的,但是java / C#解决方案也会受到赞赏。
有些观点:
并且不,我不能使用Boost,我不能保证库会 我可以。 (不要问......)
我不想使用lex或任何其他特殊工具。我从来没有做过 这之前只想尝试一次说我已经完成了。
答案 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)
如果你想从头开始编写,你可以考虑编写有限状态机(枚举中的状态,状态切换的大开关/大小写块)。您必须将状态推送到堆栈,因为所有内容都可以嵌套。
我知道这不是理想的方法;我只是想直接解决这个问题。