C#编辑器的解析文件所需流程:
所涉及的六个主要解决方案:
DhcEc.EC.Dom/
AvalonEdit.AddIn/
CSharpBinding/
NRefactory /
DhcEc.AvalonEdit /
Dhc.EC. Editor
我们按调用流程先后顺序介绍
DhcEc.EC.Dom/初始化解析服务工程服务等
ParserService.InitializeParserService();
Project.ProjectService.InitializeService();
进入DhcEc.EC.Dom解决方案进行动态库的加载,初始化编译单元。
主要类图:
因为Node是按递,归式设计的这就决定了每个表达式或变量会有子成员。每种成员都是一种Node。
通过表达式解析,将类的各种成员作为列表存储起来。每种成员都有一个相应的类与之对应。
也会有相应的方法去访问相应的成员列表。
DhcEc.AvalonEdit /
DhcEc.AvalonEdit方案打造了编辑器的底层框架主要供上层的Addin进行使用他主要实现了编辑,智能提示,高亮,行列,呈现的底层功能接口。通过对它进行继承,扩展可实现自定义的语言编辑器。
XmlDoc类用来加载.net的程序集加载路径。
成员访问的主要功能接口在NodeTrackingAstVisitor类中。
编辑器所需的功能 :
他们完成的最主要功能是反射Dll类库:并将信息存入成员列表。
AvalonEdit.AddIn/ CSharpBinding/作为两个插件使用了编辑器的主框架构造自定义的编辑器。AvalonEdit.AddIn实现了主框架的大部分抽象类及接口,对类进行了具体化,比如文档,智能提示等的具体实现。而Dhc.EC. Editor不仅是现了部分具体功能,有对原框架进行了部分新的定义,扩展,AvalonEdit.AddIn又进一步实现了它的那部分接口。
接下来是实现c编辑器常用功能的一些注意点:
增加注释的功能:
public class StandardHeader 类从头文件模板读入注释信息
如果要增加自定义的模板信息请修改stringParse中的GetValue函数
context.Editor.Document.Replace(context.StartOffset, context.Length, this.Text);
context.EndOffset = context.StartOffset + this.Text.Length;
item.Complete(this.TextArea, new AnchorSegment(this.TextArea.Document, this.StartOffset, this.EndOffset - this.StartOffset), e);
解析.net文件的要点:
在ParserService类中的CreateDefaultProjectContent方法创建类库中的智能提示列表
ParseFile方法用来从编译单元ICompilationUnit中获取信息并且与生成完成的新文件合并
此时产生一个新的编译单元我们需要更改文件使得自动生成一个编译类就在此方法之前
新建文件时两个线程一个用于创建文件另一个去添加库引用
DhcEc.EC.ParserService 给Dom发送消息 parse成员(Resolve)
最后经由 RefactoryService ContextActionsService 进行解析
设置上下文智能提示在 ExpressionFinder.CS的SetDefaultContext方法中
主要是Avalon.Addin 与 Dom的交互编译单元生成后进行表达式解析 CSharpExpressionFinder
通过修改frame类中的SetDefaultContext中的express类型从而使智能提示出现的成员
更改关键字的注意要点:
NRefactory.ParseFactory 中的CreateParser里的后缀改为.C
主要类DhcEc.NRefactory.Ast CompilationUnit
AcceptVisitor
CSharpBinding中 parser.cs文件第87行关键字处理
ICompilationUnit Parse(DhcEc.NRefactory.IParser p, string fileName, IProjectContent projectContent)
识别关键字需要的标记类:
public sealed override object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data) {
this.BeginVisit(typeDeclaration);
lexer.cs中 string ReadIdent(char ch, out bool canBeKeyword)
反射出来的信息的有效形式为
{[TypeDeclaration Name=class Type=Class BaseTypes={} Templates={} BodyStartLocation=(Line 11, Col 7) Attributes={} Modifier=None]}
识别关键字所需的标记类:
DhcEc.NRefactory.Parser.AbstractLexer 关键类 Token (类方法都是以token为表现形式的)
如何构建Unix VI仿真器的介绍
一.
二.