C# C++;扫描器(字符串fu!)
我正在编写一个扫描仪作为编译器的一部分 我在写这一部分时非常头疼:C# C++;扫描器(字符串fu!),c#,java,c++,string,C#,Java,C++,String,我正在编写一个扫描仪作为编译器的一部分 我在写这一部分时非常头疼: 我需要能够解析一个令牌流并逐个将它们推到向量中,忽略空白和标记特殊符号(简单的情况,让我们只考虑括号和括号) 例如: int main(){} 应解析为6个不同的标记: int 主要 ( ) { } 你将如何着手解决这个问题?我在C++中写这个,但是java/C语言的解决方案也会被理解。 有几点: 不,我不能使用Boost,我不能保证这些库会 我有空。(不要问…) 我不想使用莱克斯或任何其他特殊工具。我从来没有这样做过 这是我以
我需要能够解析一个令牌流并逐个将它们推到向量中,忽略空白和标记特殊符号(简单的情况,让我们只考虑括号和括号)
例如:int main(){}
应解析为6个不同的标记:
买一本(龙书)。你试图写的是一个词汇,而不是一个“扫描器”。 < P> Stroustrup的书,C++编程语言,在构建一个简单的计算器程序的Listor/解析器方面有很好的例子。它应该成为学习如何做自己想做的事情的良好起点 为什么要自己写——看看莱克斯 如果必须有自己的,只需逐字读取输入,并保持一些最小状态以累积标识符
问题本身并不难。如果你不能解决它,你一定会筋疲力尽,你只需要休息一下。早上再看一遍。嗯。。我会用迭代器做一个while循环,测试每个字符的类型,如果字符串是非空的,则只进行alpha到非alpha的更改。如果它是一个非alpha非空格字符,我就把它推到令牌堆栈上,这真的是一个简单的解析任务。哎呀,我一直想学习lexx/yacc,但是你想要的解析级别真的很容易。我曾经写过一个html标记器,比这个更复杂。。我的意思是,你只是在寻找名字、空格和单个非字母数字字符。。就这么做。如果你真的想从这个练习中学到一些东西,就开始编码吧。它不需要太多的代码,因此您可以重复失败,而不需要花费超过一个下午的时间 在这一点上,你会对这个问题有很好的感觉
然后查看任意一本随机编译器的书,看看“常用”方法是什么,然后你会立即摸索。如果你想从头开始写这个,你可以研究编写一个有限状态机(枚举中的状态,一个用于状态切换的大开关/大小写块)。您必须将状态推送到堆栈中,因为所有内容都可以嵌套
我知道这不是理想的方法;我只是想直接回答这个问题。这是一本非常深入的书,学习如何对字符串进行lex运算。公平地说,这是一本很棒的书。尽管比这项任务所需的更深入……他说他是作为编译器的一部分编写的。我想他可能想知道编译器的其他部分通常是如何工作的。“问题本身并不难。”::耸耸肩::人们在第一次看到这个问题时做愚蠢的事情并不罕见当然,我发现做了几次错事很有启发性,这是一个足够小的问题,很快就会发生……德姆奇,如果我能投你一票,我会的。我对这些“哦,这是个小问题”式的回答有点厌倦了…@eviljack:不要对Arkadiy太苛刻,词法真的不难。有一些高效的解决方案可以很容易地找到。但是大多数和我交谈过的人都不得不先尝试一些错误的方法!我想我真的是睡眠不足。如果@eviljack正在写一个编译器,词法分析对他来说真的不难。我猜他只是大脑冻结了。