Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C++;扫描器(字符串fu!)_C#_Java_C++_String - Fatal编程技术网

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个不同的标记:

  • int
  • 主要
  • )
  • {
  • }
  • 你将如何着手解决这个问题?我在C++中写这个,但是java/C语言的解决方案也会被理解。 有几点:

  • 不,我不能使用Boost,我不能保证这些库会 我有空。(不要问…)

  • 我不想使用莱克斯或任何其他特殊工具。我从来没有这样做过 这是我以前做过的,我只想试一下,说我已经做过了


  • 买一本(龙书)。你试图写的是一个词汇,而不是一个“扫描器”。

    < P> Stroustrup的书,C++编程语言,在构建一个简单的计算器程序的Listor/解析器方面有很好的例子。它应该成为学习如何做自己想做的事情的良好起点

    为什么要自己写——看看莱克斯

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


    问题本身并不难。如果你不能解决它,你一定会筋疲力尽,你只需要休息一下。早上再看一遍。

    嗯。。我会用迭代器做一个while循环,测试每个字符的类型,如果字符串是非空的,则只进行alpha到非alpha的更改。如果它是一个非alpha非空格字符,我就把它推到令牌堆栈上,这真的是一个简单的解析任务。哎呀,我一直想学习lexx/yacc,但是你想要的解析级别真的很容易。我曾经写过一个html标记器,比这个更复杂。。我的意思是,你只是在寻找名字、空格和单个非字母数字字符。。就这么做。

    如果你真的想从这个练习中学到一些东西,就开始编码吧。它不需要太多的代码,因此您可以重复失败,而不需要花费超过一个下午的时间

    在这一点上,你会对这个问题有很好的感觉


    然后查看任意一本随机编译器的书,看看“常用”方法是什么,然后你会立即摸索。

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


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

    这是一本非常深入的书,学习如何对字符串进行lex运算。公平地说,这是一本很棒的书。尽管比这项任务所需的更深入……他说他是作为编译器的一部分编写的。我想他可能想知道编译器的其他部分通常是如何工作的。“问题本身并不难。”::耸耸肩::人们在第一次看到这个问题时做愚蠢的事情并不罕见当然,我发现做了几次错事很有启发性,这是一个足够小的问题,很快就会发生……德姆奇,如果我能投你一票,我会的。我对这些“哦,这是个小问题”式的回答有点厌倦了…@eviljack:不要对Arkadiy太苛刻,词法真的不难。有一些高效的解决方案可以很容易地找到。但是大多数和我交谈过的人都不得不先尝试一些错误的方法!我想我真的是睡眠不足。如果@eviljack正在写一个编译器,词法分析对他来说真的不难。我猜他只是大脑冻结了。