Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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#_Parsing - Fatal编程技术网

代码解析C#

代码解析C#,c#,parsing,C#,Parsing,我正在研究解析代码文件的方法、工具和技术,以便在用c#编写的编辑器中支持语法突出显示和智能化 有人对此有什么想法/模式和实践/工具/技术吗 编辑:对任何感兴趣的人来说都是一个很好的信息来源: 超越上下文无关语法的解析 ISBN 978-3-642-14845-3我最喜欢的C#语法分析器是讽刺的:-我已经使用了好几次,并取得了巨大的成功 这里有一个维基百科页面,列出了更多内容:有两个基本的方法: 1) 解析整个解决方案及其引用的所有内容,以便了解代码中涉及的所有类型 2) 本地解析并尽最大努力猜测

我正在研究解析代码文件的方法、工具和技术,以便在用c#编写的编辑器中支持语法突出显示和智能化

有人对此有什么想法/模式和实践/工具/技术吗

编辑:对任何感兴趣的人来说都是一个很好的信息来源:

超越上下文无关语法的解析 ISBN 978-3-642-14845-3

我最喜欢的C#语法分析器是讽刺的:-我已经使用了好几次,并取得了巨大的成功


这里有一个维基百科页面,列出了更多内容:

有两个基本的方法:
1) 解析整个解决方案及其引用的所有内容,以便了解代码中涉及的所有类型
2) 本地解析并尽最大努力猜测什么类型等

(2)的问题在于,您必须猜测,在某些情况下,您无法从代码片段中准确地分辨出所有内容。但是,如果您对(例如)Stack Overflow上显示的sort-oif语法高亮显示感到满意,那么这种方法很简单,也很有效

要做(1),你需要做(按难度递减顺序)之一:

  • 解析所有源代码。如果引用第三方程序集,则不可能
  • 在编译代码上使用反射来收集解析源代码时可以使用的类型信息
  • 使用主机IDE(如果可用-因此不适用于您的情况!)代码元素接口来提供您需要的信息

    • 你可以看看它是怎么做到的。他们写了一本这样的书,甚至有一章叫做

      实现一个解析器来提供语法 高亮显示和自动完成为 用户类型


      你是想解析C#还是用C#编写解析器?@Gabe,两者都是。我正在尝试用c语言编写一个解析器,它将解析xml,c希望还有其他东西:)如果你想解析多种语言,你看过ANTLR吗?这取决于你希望它有多复杂。如果您想要完整的VisualStudio体验,您需要一个完整的解析器,但是如果您只需要简单的关键字/字符串高亮显示(如StackOverflow提供的),那么您就不需要解析器。您所需要的只是一个简单的标记器,它可以区分字符串和标识符,以及一个关键字列表。@sTodorov:无论如何,我想说的是,您需要一种灵活的解析器,它知道如何以最少的努力回溯。大多数解析器,如yacc等,都可以针对这种行为进行修改,尽管效率不同。Irony支持多语言解析吗?Irony是用于创建解析器的,所以是的-它解析任何可以构建语法的东西,forOP想要解析多语言。有一个“小”问题,就是要为您想要处理的语言获取工作语法。遗留语言很难做到这一点,因为标准委员会一直在用goo装饰它们;查看IBMEnterpriseCobol或Fortran 2005。现代语言稍微容易一点,但即使是他们也有压力添加东西;尝试解析现代VB.net。我已经花了15年时间为各种语言(包括我提到的那些语言)使用Unified instructure构建解析器,但我还没有完成:-{@Ira:OP并没有明确说明需要什么语言,但我的大部分答案对任何语言都同样适用。但你是对的,这是一个非常重要的问题。Visual Studio Intellisense已经由一个经验丰富的团队开发了很多年,并且只在.net语言中运行良好-除了基本语法突出显示之外,support在大多数其他语言中都非常糟糕,这很好地说明了OP试图解决的问题的难度。@Ira您试图完成的壮举听起来非常严肃。我祝您在这方面取得成功。然而,我正在研究的主要是对C#、Ruby、Python、VB.net、java的支持。我只能想象其中的区别解析遗留问题所涉及的困难languages@Jason,我想现在我将集中研究解析C#和python,因为它们的结构不同,例如花括号和indentation@sTodorov:除了Ruby,我已经完成了你提到的所有语言,而且还在进行中。如果你想完全解析这些语言你几乎需要我用过的各种形式的机器。如果你想要的只是语法高亮显示,你只需要正则表达式匹配就足够了,因为语法高亮显示不一定总是正确的才有用。