我正在努力突出一种小型脚本语言(它不是任何内置的衍生语言),我有一个针对不同语法关键字的自定义XML文件设置等。
我真的想使用AvalonEdit中存在的XSHD系统来加载自定义关键字,但我需要在其中包含自定义属性。
所以基本上,经过大量搜索源代码后,我无法确定读取并指定关键字和规则集的文件。
有没有人知道在哪里可以编辑所需的类来读取一些自定义属性并存储它们?
我已经将AvalonEdit中的所有XSHD和高亮显示的内容都缩小并正常工作,所以它没有使用它就是问题,更确切地说,这是在XSHD文件的关键字集合中使用自定义属性的问题。
例如:
<Keywords>
<Word defaultValue="hello" requiresShader="shadertype1, shadertype2" someCustomAttr="value">wordname</word>
</Keyword>
所以,我需要为XSHD文件的解析器设置一些自定义属性来加载这些自定义属性并将它们存储在我所做的自定义类中,该类处理一些对我正在尝试的内容至关重要的逻辑组件做。
我已经有了一个解析我所有关键字及其属性的XML文件的工作解析器(但是我把它写到了ScintillaNET,但之后找到了AvalonEdit,这对WPF等更好。)
我将使用此信息编辑原始帖子,抱歉可能存在错误信息。
谢谢
答案 0 :(得分:5)
要加载XSHD文件,您需要导入以下库:
using ICSharpCode.AvalonEdit;
using ICSharpCode.AvalonEdit.Highlighting;
using ICSharpCode.AvalonEdit.Highlighting.Xshd;
然后,无论您在何处创建文本编辑器(省略第一行,如果在XAML中创建它,只需引用TextEditor),请使用以下代码加载def.xshd。
// TextEditor is an AvalonEdit.TextEditor
TextEditor edit = new TextEditor();
XmlReader reader = XmlReader.Create("def.xshd");
edit.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
我正在使用的一个好的示例xshd文件用于工作中的语言:
<SyntaxDefinition name="XAPL"
xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008">
<Color name="Comment" foreground="Green" />
<Color name="String" foreground="Pink" />
<Color name="Xml" foreground="Orange" />
<!-- This is the main ruleset. -->
<RuleSet>
<Span color="Comment" begin="//" />
<Span color="Comment" multiline="true"
begin="/\*" end="\*/" />
<Span color="String">
<Begin>"</Begin>
<End>"</End>
<RuleSet>
<!-- nested span for escape sequences -->
<Span begin="\\" end="." />
</RuleSet>
</Span>
<Span color="Xml" multiline="false">
<Begin>spaz</Begin>
<End>spaz</End>
</Span>
<Keywords fontWeight="bold" foreground="Blue">
<Word>dealwith</Word>
<Word>import</Word>
<Word>end</Word>
<Word>var</Word>
<Word>default</Word>
<Word>template</Word>
<Word>sub</Word>
<Word>category</Word>
<Word>if</Word>
<Word>otherwise</Word>
<Word>and</Word>
<Word>xor</Word>
<Word>string</Word>
<Word>int</Word>
<Word>convert</Word>
<Word>to</Word>
<Word>escape</Word>
<Word>native</Word>
<Word>loop</Word>
<Word>is</Word>
<Word>to</Word>
<Word>from</Word>
<Word>by</Word>
</Keywords>
<!-- Digits -->
<Rule foreground="DarkGray">
\b0[xX][0-9a-fA-F]+ # hex number
| \b
( \d+(\.[0-9]+)? #number with optional floating point
| \.[0-9]+ #or just starting with floating point
)
([eE][+-]?[0-9]+)? # optional exponent
</Rule>
</RuleSet>
</SyntaxDefinition>