`
RednaxelaFX
  • 浏览: 3019121 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

随便玩了下Intellipad,贴张图

阅读更多
拿Oslo来玩了会儿。主要还是玩Intellipad和MGrammar。编辑器的使用体验还挺不错的。
把之前一个学弟问我帮忙写的parser要处理的语言拿来用了下:
module QueryGrammar {
    language QueryLanguage {
        syntax Main = q:Query => q;
        
        syntax Query =
            q:AtomicQuery => q
            | q:BooleanQuery => q
            ;
        
        syntax AtomicQuery = w:word => Atom { w }
            | f:word ':' w:word => Field { f, w }
            | f:word ':' '[' start:word '-' end:word ']' => Field { f, ClosedRange { start, end } }
            | f:word ':' '(' start:word '-' end:word ')' => Field { f, OpenRange { start, end } }
            ;
        
        syntax BooleanQueryOperand =
            q:AtomicQuery => q
            | '(' q:BooleanQuery ')' => q
            ;
        
        syntax BooleanQuery = 
            a:BooleanQueryOperand 'AND' b:BooleanQueryOperand => And { a, b }
            | a:BooleanQueryOperand 'OR' b:BooleanQueryOperand => Or { a, b }
            | 'NOT' o:BooleanQueryOperand => Not { o }
            ;
        
        token word = ( 'a'..'z' | 'A'..'Z' | '0'..'9' )+;
        
        @{Classification["Keyword"]}
        final token AND = 'AND';
        @{Classification["Keyword"]}
        final token OR = 'OR';
        @{Classification["Keyword"]}
        final token NOT = 'NOT';
        
        @{Classification["Comment"]}
        token lineComment = '//' commentContent*;
        token commentContent = ^( '\r' | '\n' );
        interleave Comment = lineComment;
        
        interleave WhiteSpace = ' ' | '\t' | '\r' | '\n';
    }
}

M用的parse算法是GLR,内部主要是LALR(1)。语法文件的语法与YACC或ANTLR还是比较相似的;与ANTLR特别相似的地方是,语法规则和词法规则都使用同样的EBNF方式来表示。也有人诟病这种方式不符合一般写正则表达式的习惯。

在Intellipad的MGrammar三面板模式下,显示如下(点击放大):


三个面板中,左边是样本输入,中间是语法,右边是输出。解析是动态完成的,如果左边的输入不符合中间的语法,编辑器就会提示有错误;并且语法文件中指定的语法高亮也能够在左边的面板中体现出来。可以看到上面的图里,输入为:
// query comments
NOT (fileName:(alpha-beta123) AND fileSize:[50-100])

输出为一个MGraph:
Not{
  And{
    Field{
      "fileName",
      OpenRange{
        "alpha",
        "beta123"
      }
    },
    Field{
      "fileSize",
      ClosedRange{
        "50",
        "100"
      }
    }
  }
}

这个MGraph可以被保存在数据库里,可以转换成XML(XAML),也可以直接通过.NET程序来使用。以后有空再试试直接从C#里使用这个parser是怎么样的。

默认的关键字高亮是黑色,#FF000000。要改变这个颜色很容易,只要在下面的配置文件里修改Foreground值就行:
/Bin/Intellipad/Settings/ClassificationFormats.xcml:
  <act:Export Name='{}{Microsoft.Intellipad}ClassificationFormat'>
    <ls:ClassificationFormat Name='Keyword' 
                             FontFamily='Consolas' 
                             FontWeight='Bold'
                             Foreground='#FF000000' />

  <act:Export Name='{}{Microsoft.Intellipad}ClassificationFormat'>
    <ls:ClassificationFormat Name='Keyword' 
                             FontFamily='Consolas'
                             Foreground='#FF0000FF' />

上面的截图里,除了关键字的颜色换了之外,注释的颜色和样式也稍微改了改(#FF808080 -> #FF008000)。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics