3

我想知道 stackoverflow 如何解析各种不同的代码并识别关键字、特殊字符、空格格式等。它对我相信的大多数代码都执行此操作,而且我注意到它甚至足够复杂,可以理解它解析的所有内容之间的关系,像这样:

String mystring1 = "inquotes"; //incomment
String mystring2 = "inquotes//incomment";
String mystring3 = //incomment"inquotes";

许多 IDE 也这样做。这是怎么做到的?

编辑:进一步解释 - 我不是在询问文本的解析,我的问题是,一旦我过了那部分......是否有类似通用 XML 方案或描述哪些字符串是关键字的交叉代码格式层次结构,哪些字符表示注释、文本字符串、逻辑运算符等。或者我必须成为我希望准确解析的任何语言的语法专家吗?

4

2 回答 2

3

要真正让您的 IDE/编译器/解释器“理解”并为代码着色,您需要解析它并提取不同的句法部分。对此的经典参考是《龙书》,《编译器:原理、技术和工具》。您可以看到像这样的构造中的一些困难

i+++++i; 

或者

list<list<hash<list<int>,hash<int,<list>>>>>;
//or just matching parens 

正确地做到这一点是一个难题 。一些语言,比如 java,比其他语言更容易,比如 C 和 C++(它们都有标准)或 ruby​​(它们甚至没有规范并且依赖于作为规范的实现)。但是,如果您只想做一些突出显示,您可以跳过大部分语法并更轻松地获得 80% 的解决方案。我怀疑 SO 引擎知道字符串和一些不同类型的注释,这对于它们的目的来说已经足够好了。

80% 和 100% 之间的困难是大多数 IDE 具有 C++ 语法突出显示但 Visual C++ 仍然没有 C++ 重构支持的原因之一。突出一些错误可能是可以的。在重构时,您需要真正了解不同命名空间中的变量范围以及各种指针内容。

于 2010-08-19T00:48:14.137 回答
2

为了正确突出一种语言,您必须构建一个解析树。这需要首先对字符串进行标记,然后执行自上而下或自下而上的解析。之后,某些东西会遍历树并突出显示原始字符串中与某种类型的节点相对应的部分。

要真正理解这一点,您将不得不阅读一本关于编译器设计/编程语言基础的书。相关主题是分器、解析语法

于 2010-08-18T23:56:19.557 回答