0

我在 Ubuntu Saucy 上,我希望有人会在想要的文件中告诉我 c struct dereference operator -> is in..当我

grep -R -> . 

我明白了

 bash: .: Is a directory

当我省略'。我明白了

bash: syntax error near unexpected token `newline' 

我喜欢用另一种语言重现此功能,但谷歌也一无所有。非常感谢任何帮助。

4

4 回答 4

1

您的 grep 编写不正确:

grep -R -> . 

它在做什么?像这样的东西:

grep -R - > . 

现在可能更清楚一点:它将查看“-”(可能是标准输入,我不确定 grep 但许多工具使用 - 表示标准输入)。它会将结果写入“。” 除了那是一个目录(特别是当前目录)。所以它失败了。

如果要搜索 -> 运算符,可以使用:

grep -R -- "->" . 

“--”是一个相当标准的 Unix 事物,意思是“在此之后停止处理选项”,并且将“->”放在引号中应该会阻止 shell 将其解释为两个标记(stdin 加重定向)。

无论如何,这些都不重要,因为您永远找不到运算符 -> 的源代码。它是用语言定义的,实现它的源代码完全在你的编译器中。所以如果你真的想要,去下载你的编译器的源代码并在那里grep ......即使那样,通过grep“->”可能不会很快找到它。

于 2013-11-11T14:59:14.123 回答
0

运算符不是库类或函数,它没有“定义”(除非我们谈论的是重载运算符)。

编译器解析符号并创建适当的代码,但这不仅仅是用某种方法替换“->”。

于 2013-11-11T14:55:08.360 回答
0

-ingrep指定了一个新的命令选项。所以,你需要逃避它。有一个方便的grep语法grep -- "->"将搜索->.

但是,我怀疑您会发现任何东西,因为运算符不是方法。

于 2013-11-11T14:59:18.273 回答
0

bash 报告该错误消息,因为在 中grep -R -> .>看起来像标准输出的重定向,因此 bash 尝试将其.作为文件打开,输出将写入该文件。这会失败,因为.代表当前目录,并且不能以与文件相同的方式打开目录。

您可以通过使用引号来避免 bash 以>这种方式解释,例如grep -R "->" .. 但是,然后 grep 将 解释-为指示命令行选项,而不是作为要搜索的模式。-您可以通过用反斜杠标记来避免这种情况:

grep -R "\->" .

--用于告诉 grep 选项在哪里结束:

grep -R -- "->" .

不幸的是,这只会找到包含字符串“->”的文件;它不会区分实现 C->运算符的文件。并且会有许多包含该字符串的文件与您正在搜索的内容无关。

我希望 C->运算符将实现如下:

  • 涉及词法分析的某些文件中的某些代码将识别字符串“->”,并将通过生成一个标记来响应,该标记可能具有任意名称(由该特定代码的作者选择,不受任何特定标准或规范的强制) 如引用。
  • 语法分析中涉及的某些文件中的某些代码将通过发出执行取消引用操作的代码(可能是编译器自己使用的中间语言)来处理 DEREFERENCE 标记。或者,代码可能会将表达式转换为a->b(*a).b然后为后者发出代码。

发出此代码的过程和代码本身都不一定是单一操作。它可能涉及检查左操作数的类型、计算右操作数的偏移量、将表达式与其上下文中的事物相关联(以支持优化)以及生成实际的中间代码。该中间代码可以通过优化或编译器的其他部分进一步处理,稍后将用于生成最终的机器代码。

总之,没有一个地方->可以实现。它是复杂过程的一部分,并与编译器的其他部分交互。

于 2013-11-11T15:06:10.943 回答