zoukankan      html  css  js  c++  java
  • VSX开发之语言服务系列(2)——从一个经典的例子开始

    准备工作

    我打算在这篇中介绍一个完整的例子:ManagedMyC,这个例子包含在SDK中,在调试前请先安装SDK。在Microsoft Visual Studio 2008 SDK的Samples中,找到这个例子,然后在Visual Studio中打开:

    clip_image002

    调试

    打开后,你可以编译调试。这是个集成模式的例子,默认在实验室环境下加载这个语言服务包,所以你将看到这样的结果:

    clip_image004

    事实上此时,我们的包还没有加载,语言服务的包只有当特定后缀的文件在VS中打开的时候才会加载。这个例子注册的后缀为”.myc”,这是个C语言的半成品语言服务。

    打开一个.myc的文件,你可以选择一个示例文件,这个文件放在类似这样的路径下,...\Local\VSSDK_9.0_1.1\Example.ManagedMyC_F3D35F91\testfiles 你可以在工程中找到这个路径和两个测试文件。然后打开他们,现在我打开其中一个:

    clip_image006

    打开后将是这样:

    clip_image008

    我们看到,这是一段C代码,IDE为我们高亮了一些关键字,对于注释也有特定的颜色,另外你如果尝试编写一些个代码,还会发现,它还支持括号匹配、甚至还有错误提示。

    这个例子已经很好的展示了语言服务的强大之处,上面所提到的功能都是语言服务所实现的。

    初窥代码

    宿主包

    任何一个或多个服务都可以通过包的形式集成到VS中,语言服务也不例外,事实上语言服务必需依照这种扩展方式来扩展。在工程中找到UserSupplied文件夹下的Package.cs,这是个非常简单的类,代码如下:

        [Microsoft.VisualStudio.Shell.PackageRegistration(UseManagedResourcesOnly=true)]
        [Microsoft.VisualStudio.Shell.DefaultRegistryRoot(@"Software\Microsoft\VisualStudio\9.0Exp")]
        [Microsoft.VisualStudio.Shell.ProvideService(typeof(Babel.LanguageService))]
        [Microsoft.VisualStudio.Shell.ProvideLanguageExtension(typeof(Babel.LanguageService), Configuration.Extension)]
        [Microsoft.VisualStudio.Shell.ProvideLanguageService(typeof(Babel.LanguageService), Configuration.Name,0,
            CodeSense = true,
            EnableCommenting = true,
            MatchBraces = true,
            ShowCompletion = true,
            ShowMatchingBrace = true,
            AutoOutlining = true,
            EnableAsyncCompletion = true,
            CodeSenseDelay = 0)]
        [Guid("7b98c6da-ca1b-4ff4-8638-b0ba4473c68e")]
        class Package : BabelPackage
        {
        }
     

    下面介绍一下类的关键属性,省略了几个属性,如有疑问请做功课,呵呵:

    属性

    说明

    ProvideService

    说明这个包提供服务的类是什么

    ProvideLanguageExtension

    说明这个包是个语言服务,并说明是哪个类,是什么后缀

    ProvideLanguageService

    说明这个包是个语言服务,并说明是哪个类,语言服务的名称,这个语言服务提供了哪些功能,这里有注释、括号匹配等。

    我们知道Package的这些属性大多是设置一些注册信息,以集成到VS中,这里的几个属性也是如此。值得注意的还有一点,这个类完全没有任何实现,只是继承自一个叫做BabelPackage的类,这个类是ManagedBabel中的类,你可以在工程的ManagedBabel文件夹下的Package.cs中找到,这个类实现了Microsoft.VisualStudio.Shell.Package大多数必需的重写。

    语言服务类

    看完包,来看看最重要的语言服务类在哪里,定位到UserSupplied文件夹下的LanguageService.cs,这个便是我们注册的语言服务,但是好像代码简单的出奇!但又继承了一个叫BabelLanguageService的类,于是我们刨根问底,再来看看BabelLanguageService,这个类在ManagedBabel文件夹下的LanguageService.cs中,继承自LanguageService。你是不是开始困扰哪来这么多Babel啊?实际上,为了让开发人员更方便的开发语言服务,微软在SDK中设计了基于Managed Package FrameworkManaged Babel 。它是一系列cs文件,你在ManagedBabel文件夹下看到的就是Managed Babel的文件。微软并不推荐我们修改它们,但我的经验是,为了做出我们特有的功能,必须要修改其中的代码,但建议在修改时请保留原来的文件,只在工程中修改它们的拷贝就行了。

    言归正传,这个BabelLanguageService的代码不算少,我并不打算现在就解释它。但到目前为止,我们必须要明确的问题是:语言服务需要一个包来承载,包需要继承于Microsoft.VisualStudio.Shell.Package;语言服务需要一个类,这个类继承于Microsoft.VisualStudio.Package.LanguageService;微软为了让我们更方便的编写语言服务,提供了一个称作Managed Babel的文件集,在开发语言服务的时候可以利用它们。

    语言核心

    还有两个文件你也许早就注意到了:在Generated文件夹下的lexer.lex和parser.y。没错!两个十分奇怪的文件,这不光体现在它的后缀,当你看到其中的代码时,你将几乎看不懂(除非你从事过编译器或解析器工作)。不过不用担心,在以后的章节中我将结合微软的文档,详细介绍这两个文件的编写,因为在实际的开发中,在这两个文件上花的时间将占到整个开发的80%以上!唯一遗憾的是,微软没有为这两个文件实现语言服务!呵呵!

    小结

    在本节中我们成功调试了ManagedMyC,并且了解了语言服务的基本组成,还知道了Managed Babel是一系列的文件,方便我们集成语言服务,另外初窥了.lex和.y文件。

  • 相关阅读:
    leetcode5 Longest Palindromic Substring
    leetcode17 Letter Combinations of a Phone Number
    leetcode13 Roman to Integer
    leetcode14 Longest Common Prefix
    leetcode20 Valid Parentheses
    leetcode392 Is Subsequence
    leetcode121 Best Time to Buy and Sell Stock
    leetcode198 House Robber
    leetcode746 Min Cost Climbing Stairs
    tomcat下使用druid配置jnid数据源
  • 原文地址:https://www.cnblogs.com/P_Chou/p/1737487.html
Copyright © 2011-2022 走看看