parent
e64b4c84ed
commit
2dd14e2f37
|
@ -179,6 +179,7 @@ class Application(object):
|
||||||
'awk', 'shell', 'shellmini', 'fstab', 'yacc', 'pipe', 'mbox',
|
'awk', 'shell', 'shellmini', 'fstab', 'yacc', 'pipe', 'mbox',
|
||||||
'error', 'lua', 'lily', 'forth', 'ebnf', 'colortest', 'go',
|
'error', 'lua', 'lily', 'forth', 'ebnf', 'colortest', 'go',
|
||||||
'inform6', 'scala', 'markdown', 'roy', 'twine', 'idris', 'rust',
|
'inform6', 'scala', 'markdown', 'roy', 'twine', 'idris', 'rust',
|
||||||
|
'bosatsu',
|
||||||
)
|
)
|
||||||
for name in names:
|
for name in names:
|
||||||
exec("import mode.%s; mode.%s.install(self)" % (name, name))
|
exec("import mode.%s; mode.%s.install(self)" % (name, name))
|
||||||
|
|
|
@ -0,0 +1,120 @@
|
||||||
|
import commands, os.path, re, string, sys, traceback
|
||||||
|
import color, completer, context, default, mode, method, regex, tab
|
||||||
|
from lex import Grammar, PatternRule, RegionRule, OverridePatternRule
|
||||||
|
|
||||||
|
from mode.python import StringGrammar1, StringGrammar2
|
||||||
|
|
||||||
|
class PackageGrammar(Grammar):
|
||||||
|
rules = [
|
||||||
|
PatternRule('whitespace', r'(?: |\t)+'),
|
||||||
|
PatternRule('name', r'[a-zA-Z_][a-zA-Z0-9]*'),
|
||||||
|
PatternRule('sep', r'/'),
|
||||||
|
]
|
||||||
|
|
||||||
|
class BosatsuGrammar(Grammar):
|
||||||
|
rules = [
|
||||||
|
# whitespace
|
||||||
|
PatternRule('whitespace', r'(?: |\t)+'),
|
||||||
|
PatternRule('eol', r'\n$'),
|
||||||
|
|
||||||
|
# basic
|
||||||
|
PatternRule('bosatsu.comment', r'#.*$'),
|
||||||
|
#PatternRule('bosatsu.integer', r'(?<![\.0-9a-zA-Z_])(?:0|-?[1-9][0-9]*)(?![\.0-9a-zA-Z_])'),
|
||||||
|
PatternRule('bosatsu.integer', r'(?:0|-?[1-9][0-9]*)(?![\.0-9a-zA-Z_])'),
|
||||||
|
|
||||||
|
# match keywords early
|
||||||
|
PatternRule('bosatsu.keyword', '(?:struct|recur|package|operator|match|import|if|forall|for|external|export|enum|else|def|_)(?![a-zA-Z0-9_])'),
|
||||||
|
|
||||||
|
# use look-behind assertion to detect package/def/operator
|
||||||
|
RegionRule('bosatsu.package', '(?<=(?<![a-zA-Z0-9_])package )', PackageGrammar, '\n$'),
|
||||||
|
PatternRule('bosatsu.def', '(?<=(?<![a-zA-Z0-9_])operator )[^:( ]+'),
|
||||||
|
PatternRule('bosatsu.def', '(?<=(?<![a-zA-Z0-9_])def )[a-zA-Z_][a-zA-Z0-9_]*'),
|
||||||
|
|
||||||
|
# detect a bunch of different syntax-y stuff + predef methods
|
||||||
|
PatternRule('bosatsu.builtin', r'(?:->|:|=|\.)(?![/%\*\-+<>!$&^|?~=:])'),
|
||||||
|
PatternRule('bosatsu.predef', r'(?:uncurry3|uncurry2|trace|times|string_Order|string_Order_fn|sub|reverse_concat|reverse|remove_key|range_fold|range|mod_Int|map_List|items|int_loop|get_key|gcd_Int|foldLeft|flat_map_List|eq_Int|empty_Dict|clear_Dict|div|concat|cmp_Int|add_key|add)(?![a-zA-Z0-9_])'),
|
||||||
|
PatternRule('bosatsu.delimiter', r'\(|\)|\[|\]|,'),
|
||||||
|
PatternRule('bosatsu.operator', r'[/%\*\-+<>!$&^|?~]+|=[/%\*\-+<>!$&^|?~=]+'),
|
||||||
|
|
||||||
|
# user-defined types and names
|
||||||
|
PatternRule('bosatsu.type', r'[A-Z][a-zA-Z_]*'),
|
||||||
|
PatternRule('bosatsu.bareword', r'[a-z_][a-zA-Z_]*'),
|
||||||
|
|
||||||
|
# python style strings
|
||||||
|
RegionRule('bosatsu.string', r'"', StringGrammar2, r'"'),
|
||||||
|
RegionRule('bosatsu.string', r"'", StringGrammar1, r"'"),
|
||||||
|
|
||||||
|
# we want to highlight everything, so show any unmatched
|
||||||
|
# characters as a syntax error
|
||||||
|
PatternRule('bosatsu.unknown', r'.'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# white is for delimiters, operators, numbers
|
||||||
|
default = ('default', 'default')
|
||||||
|
|
||||||
|
# magenta is for reserved words
|
||||||
|
lo_magenta = ('magenta202', 'default')
|
||||||
|
hi_magenta = ('magenta505', 'default')
|
||||||
|
|
||||||
|
# red is for comments
|
||||||
|
lo_red = ('red300', 'default')
|
||||||
|
hi_red = ('red511', 'default')
|
||||||
|
|
||||||
|
# orange is unused
|
||||||
|
hi_orange = ('yellow531', 'default')
|
||||||
|
lo_orange = ('yellow520', 'default')
|
||||||
|
|
||||||
|
# yellow is for class names
|
||||||
|
hi_yellow = ('yellow551', 'default')
|
||||||
|
lo_yellow = ('yellow330', 'default')
|
||||||
|
|
||||||
|
# green is for strings
|
||||||
|
lo_green = ('green030', 'default')
|
||||||
|
hi_green = ('green050', 'default')
|
||||||
|
|
||||||
|
# cyan is for keywords and some operators
|
||||||
|
lo_cyan = ('cyan033', 'default')
|
||||||
|
hi_cyan = ('cyan155', 'default')
|
||||||
|
|
||||||
|
# blue is for functions and methods
|
||||||
|
lo_blue = ('blue113', 'default')
|
||||||
|
hi_blue = ('blue225', 'default')
|
||||||
|
|
||||||
|
class Bosatsu(mode.Fundamental):
|
||||||
|
description = '''
|
||||||
|
Mode for Oscar Boykin's language Bosatsu.
|
||||||
|
'''
|
||||||
|
name = 'Bosatsu'
|
||||||
|
extensions = ['.bosatsu']
|
||||||
|
grammar = BosatsuGrammar
|
||||||
|
opentokens = ('bosatsu.delimiter',)
|
||||||
|
opentags = {'(': ')', '[': ']'}
|
||||||
|
closetokens = ('bosatsu.delimiter',)
|
||||||
|
closetags = {')': '(', ']': '['}
|
||||||
|
commentc = '#'
|
||||||
|
colors = {
|
||||||
|
'bosatsu.comment': hi_red,
|
||||||
|
'bosatsu.package.name': hi_orange,
|
||||||
|
'bosatsu.package.sep': lo_orange,
|
||||||
|
'bosatsu.def': hi_cyan,
|
||||||
|
'bosatsu.integer': lo_orange,
|
||||||
|
'bosatsu.keyword': lo_blue,
|
||||||
|
'bosatsu.operator': hi_green,
|
||||||
|
'bosatsu.delimiter': default,
|
||||||
|
'bosatsu.builtin': lo_blue,
|
||||||
|
'bosatsu.predef': hi_magenta,
|
||||||
|
'bosatsu.type': hi_orange,
|
||||||
|
'bosatsu.string.start': lo_orange,
|
||||||
|
'bosatsu.string.data': hi_orange,
|
||||||
|
'bosatsu.string.end': lo_orange,
|
||||||
|
'bosatsu.unknown': ('default', 'magenta202'),
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, w):
|
||||||
|
mode.Fundamental.__init__(self, w)
|
||||||
|
self.add_bindings('close-paren', (')',))
|
||||||
|
self.add_bindings('close-brace', ('}',))
|
||||||
|
self.add_bindings('close-bracket', (']',))
|
||||||
|
|
||||||
|
install = Bosatsu.install
|
Loading…
Reference in New Issue