From 75d354c2f586d4e541a65595d5d081d6d40fbc52 Mon Sep 17 00:00:00 2001 From: Erik Osheim Date: Wed, 11 Nov 2009 17:54:12 -0500 Subject: [PATCH] basic mode for google's go language --HG-- branch : pmacs2 --- application.py | 2 +- mode/go.py | 153 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 mode/go.py diff --git a/application.py b/application.py index 3751d45..488f686 100755 --- a/application.py +++ b/application.py @@ -175,7 +175,7 @@ class Application(object): 'xml', 'cheetah', 'colortext', 'latex', 'insertmini', 'conf', 'haskell', 'erlang', 'iperl', 'iperlmini', 'ipython', 'ipythonmini', 'awk', 'shell', 'shellmini', 'fstab', 'yacc', 'pipe', 'mbox', - 'error', 'lua', 'lily', 'forth', 'ebnf', 'colortest', + 'error', 'lua', 'lily', 'forth', 'ebnf', 'colortest', 'go', ) for name in names: exec("import mode.%s; mode.%s.install(self)" % (name, name)) diff --git a/mode/go.py b/mode/go.py new file mode 100644 index 0000000..4bfee0d --- /dev/null +++ b/mode/go.py @@ -0,0 +1,153 @@ +import os.path +from subprocess import Popen, PIPE, STDOUT +from method.shell import Exec +from mode import Fundamental +import tab +from lex import Grammar, PatternRule, RegionRule, PatternMatchRule, OverridePatternRule +from mode.python import StringGrammar2 + +from mode.c import CommentGrammar + +# TODO: actually handle unicode correctly +# In The Unicode Standard 5.1, Section 4.5 General Category-Normative defines a +# set of character categories. Go treats those characters in category Lu, Ll, +# Lt, Lm, or Lo as Unicode letters, and those in category Nd as Unicode digits. +chr1 = '[a-zA-Z_]' +chr2 = '[a-zA-Z0-9_]' +word = chr1 + chr2 + '*' + +class StringGrammar(Grammar): + rules = [ + PatternRule('escaped', r'\\[abfnrtv\\\'"]'), + PatternRule('octal', r'\\[0-7]{3}'), + PatternRule('hex', r'\\x[a-fA-F0-9]{2}'), + PatternRule('unicode', r'\\u[a-fA-F0-9]{4}'), + PatternRule('unicode', r'\\U[a-fA-F0-9]{8}'), + PatternRule('illegal', r'\\.*'), + PatternRule('data', r'[^\\"]+'), + ] + +class RawStringGrammar(Grammar): + rules = [ + PatternRule('data', '[^`]+'), + ] + +class GoGrammar(Grammar): + rules = [ + PatternRule('spaces', r' +'), + + PatternRule('go.comment', '//.*$'), + RegionRule('go.comment', r'/\*', CommentGrammar, r'\*/'), + + PatternRule("delimiter", r"(?:\(|\)|\[|\]|\{|\}|,|;|:=|:|!=|!|&\^=|&\^|\.\.\.|\.|>>=|>>|<<=|<<|%=|%|--|-=|-|\+\+|\+=|\+|==|=|\&\&|\&=|\&|\|\||\|=|\||<-|<=|<|>=|>|\^=|\^|\*=|\*|/=|/)"), + PatternRule('eol', r"\n$"), + + PatternMatchRule('', '(func)( +)(' + word + ')', 'go.keyword', 'spaces', 'go.function'), + PatternMatchRule('', '(package)( +)(' + word + ')', 'go.keyword', 'spaces', 'go.package'), + + PatternRule('go.keyword', r"(?:var|type|switch|struct|select|return|range|package|map|interface|import|if|goto|go|func|for|fallthrough|else|defer|default|continue|const|chan|case|break)(?!" + chr2 + ")"), + + PatternRule('go.predeclared', r'(?:uint64|uint32|uint16|uint8|uintptr|uint|true|string|println|print|panicln|panic|nil|new|make|len|iota|int64|int32|int16|int8|int|float64|float32|float|false|closed|close|cap|byte|bool)(?!' + chr2 + ")"), + + PatternRule('go.integer', r'(?:[1-9][0-9]*|0[0-9]*|0[xX][a-fA-F0-9]+)'), + + RegionRule('go.char', "'", StringGrammar, "'"), + RegionRule('go.string', '"', StringGrammar, '"'), + RegionRule('go.string', '`', RawStringGrammar, '`'), + ] + +# white is for delimiters, operators, numbers +default = ('default', 'default') + +# magenta is for keywords/builtins +lo_magenta = ('magenta202', 'default') +hi_magenta = ('magenta505', 'default') + +# red is for comments +lo_red = ('red300', 'default') +hi_red = ('red511', 'default') + +# orange is for macro definitions, headers and constants +hi_orange = ('yellow531', 'default') +lo_orange = ('yellow520', 'default') + +# yellow is for parts of macros +hi_yellow = ('yellow551', 'default') +lo_yellow = ('yellow330', 'default') + +# green is for strings and characters +lo_green = ('green030', 'default') +hi_green = ('green050', 'default') + +# cyan is for types +lo_cyan = ('cyan033', 'default') +hi_cyan = ('cyan155', 'default') + +# blue is definitions, functions and some macros +lo_blue = ('blue113', 'default') +hi_blue = ('blue225', 'default') + +class Go(Fundamental): + name = 'Go' + grammar = GoGrammar + opentokens = ('delimiter',) + opentags = {'(': ')', '[': ']', '{': '}'} + closetokens = ('delimiter',) + closetags = {')': '(', ']': '[', '}': '{'} + #actions = [CCheckSyntax, CMake] + format = "%(flag)s %(bname)s (%(mname)s) %(indent)s %(cursor)s %(perc)s [%(func)s]" + commentc = '//' + + colors = { + 'go.comment': hi_red, + 'go.comment.start': hi_red, + 'go.comment.data': hi_red, + 'go.comment.end': hi_red, + + 'go.char.start': lo_green, + 'go.char.end': lo_green, + 'go.char.data': hi_green, + 'go.char.escaped': hi_magenta, + 'go.char.octal': hi_magenta, + 'go.char.unicode': hi_magenta, + 'go.char.hex': hi_magenta, + + 'go.string.start': lo_green, + 'go.string.end': lo_green, + 'go.string.data': hi_green, + 'go.string.escaped': hi_magenta, + 'go.string.octal': hi_magenta, + 'go.string.unicode': hi_magenta, + 'go.string.hex': hi_magenta, + + 'go.package': hi_magenta, + 'go.predeclared': hi_magenta, + 'go.keyword': hi_cyan, + } + #config = { + # 'go.syntax-cmd': "gcc -x c -fsyntax-only %(path)s", + # 'go.syntax-rel-dir': False, + # 'go.make-cmd': "make", + # 'go.make-rel-dir': True, + #} + #lconfig = { + # 'ignore_suffix': ['.o'], + #} + #_bindings = { + # 'close-paren': (')',), + # 'close-brace': ('}',), + # 'close-bracket': (']',), + # 'c-check-syntax': ('C-c s',), + # 'c-make': ('C-c C-c',), + #} + # + #def get_functions(self): return {} + #def get_function_names(self): return [] + #def get_line_function(self, y): return None + #def get_status_names(self): + # names = Fundamental.get_status_names(self) + # c = self.window.logical_cursor() + # names['func'] = self.get_line_function(c.y) + # return names + +install = Go.install