3

我正在努力突出一种小型脚本语言(它不是任何内置语言的派生语言),并且我为不同的语法关键字等设置了自定义 XML 文件。

我真的很想使用 AvalonEdit 中存在的 XSHD 系统来加载自定义关键字,但我需要在其中包含自定义属性。

所以基本上,在大量搜索源代码之后,我无法真正确定读取并指定关键字和规则集的文件。

这里有谁知道我可以在哪里编辑所需的类来读取一些自定义属性并存储它们?

我在 AvalonEdit 中的所有 XSHD 和突出显示的东西都已关闭并正常工作,所以问题不是使用它,也就是说,更多的是在 XSHD 文件的关键字集合中使用自定义属性的问题。

例如:

<Keywords>
   <Word defaultValue="hello" requiresShader="shadertype1, shadertype2" someCustomAttr="value">wordname</word>
</Keyword>

因此,我需要为 XSHD 文件的解析器设置一些自定义属性,以加载这些自定义属性并将它们存储在我创建的自定义类中,该类处理一些对我正在尝试做的事情至关重要的逻辑组件。

我已经有一个可以工作的解析器来解析我所有的关键字及其属性的 XML 文件(但我将它写到 ScintillaNET,但后来发现 AvalonEdit,它与 WPF 等配合得更好)。

我将使用此信息编辑原始帖子,对于可能的错误信息,我深表歉意。

谢谢

4

1 回答 1

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>
于 2012-06-28T20:38:55.490 回答