如何解析像stackoverflow / intellisense / etc这样的实际代码?

时间:2010-08-18 23:54:09

标签: parsing xsd code-structure

我想知道stackoverflow如何解析各种不同的代码并识别关键字,特殊字符,空白格式等等。对于我认为的大多数代码都这样做,而且我注意到它甚至足以理解一切之间的关系。它解析,像这样:

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

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

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

2 个答案:

答案 0 :(得分:3)

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

i+++++i; 

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

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

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

答案 1 :(得分:2)

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

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