101 lines
3.3 KiB
Python
101 lines
3.3 KiB
Python
|
import os.path
|
||
|
#from method.shell import Interact
|
||
|
from mode import Fundamental
|
||
|
from lex import Grammar, PatternRule, RegionRule, PatternMatchRule
|
||
|
from tab import Tabber
|
||
|
|
||
|
class CommentGrammar(Grammar): pass
|
||
|
CommentGrammar.rules = [
|
||
|
RegionRule(r'comment', r'{-', CommentGrammar, r'-}'), #nested
|
||
|
PatternRule(r'data', r'(?:[^{-]|{(?!-)|-(?!}))+'),
|
||
|
]
|
||
|
|
||
|
class StringGrammar(Grammar):
|
||
|
rules = [
|
||
|
PatternRule(r'escaped', r'\\.'),
|
||
|
PatternRule(r'data', r'[^\\"]+'),
|
||
|
]
|
||
|
|
||
|
class IdrisGrammar(Grammar):
|
||
|
rules = [
|
||
|
PatternRule(r'comment', r'--.*$'),
|
||
|
RegionRule(r'comment', r'{-', CommentGrammar, r'-}'),
|
||
|
|
||
|
# %access and such
|
||
|
PatternMatchRule('x', r'(%[a-z]+)( +)([^ \t\n]+)', 'idris.keyword', 'spaces', 'idris.directive'),
|
||
|
|
||
|
# probably too simple
|
||
|
PatternRule(r'integer', r'-?[0-9]+'),
|
||
|
PatternRule(r'float', r'-?[0-9]+\.[0-9]+(?:[eE][+-]?[0-9]+)?|-?[0-9]+[eE][+-]?[0-9]+'),
|
||
|
PatternRule(r'char', r"'[^'\\]'"),
|
||
|
|
||
|
PatternRule(r'spaces', r'[ \t]+'),
|
||
|
PatternRule(r'eol', r'\n'),
|
||
|
PatternRule(r'delimiter', r'[\[\](){},;]'),
|
||
|
PatternRule(r'idris.xyz', r'(?:=>|->|<-|=|:)(?![-!#$%&\*\+./<=>\?@\\^|~:])'),
|
||
|
|
||
|
PatternMatchRule('x', r"(module)( +)([a-zA-Z0-9_']+)", "idris.keyword", "spaces", "idris.module"),
|
||
|
#PatternMatchRule('x', r"(record|data|codata|class)( +)([a-zA-Z0-9_']+)", "idris.keyword", "spaces", "idris.def"),
|
||
|
|
||
|
# maybe wrong?
|
||
|
PatternRule(r'idris.operator', r"[-!#$%&\*\+./<=>\?@\\^|~:]+"),
|
||
|
|
||
|
RegionRule(r'string', r'"', StringGrammar, r'"'),
|
||
|
PatternRule(r'idris.keyword', r"(?:with|where|using|try|trivial|total|then|term|syntax|solve|rewrite|refine|record|public|private|prefix|pattern|partial|parameters|of|namespace|mutual|module|let|intros|instance|infixr|infixl|infix|in|import|if|focus|exact|else|dsl|do|data|compute|codata|class|case|attack|abstract)(?![a-zA-Z0-9_'])"),
|
||
|
|
||
|
PatternRule(r'idris.name', r"['_]?[A-Z][a-zA-Z0-9_']+"),
|
||
|
PatternRule(r'idris.word', r"[a-zA-Z0-9_']+"),
|
||
|
]
|
||
|
|
||
|
class IdrisTabber(Tabber):
|
||
|
pass
|
||
|
|
||
|
c_default = ('default', 'default')
|
||
|
|
||
|
lo_magenta = ('magenta202', 'default')
|
||
|
hi_magenta = ('magenta505', 'default')
|
||
|
|
||
|
lo_red = ('red300', 'default')
|
||
|
hi_red = ('red511', 'default')
|
||
|
|
||
|
hi_orange = ('yellow531', 'default')
|
||
|
lo_orange = ('yellow520', 'default')
|
||
|
|
||
|
hi_yellow = ('yellow551', 'default')
|
||
|
lo_yellow = ('yellow330', 'default')
|
||
|
|
||
|
lo_green = ('green030', 'default')
|
||
|
hi_green = ('green050', 'default')
|
||
|
|
||
|
lo_cyan = ('cyan033', 'default')
|
||
|
hi_cyan = ('cyan155', 'default')
|
||
|
|
||
|
lo_blue = ('blue113', 'default')
|
||
|
hi_blue = ('blue225', 'default')
|
||
|
|
||
|
class Idris(Fundamental):
|
||
|
name = 'Idris'
|
||
|
extensions = ['.idr']
|
||
|
tabwidth = 2
|
||
|
commentc = '--'
|
||
|
grammar = IdrisGrammar
|
||
|
opentokens = ('delimiter',)
|
||
|
opentags = {'(': ')', '{': '}', '[': ']'}
|
||
|
closetokens = ('delimiter',)
|
||
|
closetags = {')': '(', '}': '{', ']': '['}
|
||
|
colors = {
|
||
|
'idris.keyword': hi_magenta,
|
||
|
'idris.module': hi_yellow,
|
||
|
'idris.name': hi_green,
|
||
|
'idris.xyz': hi_cyan,
|
||
|
'idris.directive': hi_orange,
|
||
|
}
|
||
|
_bindings = {
|
||
|
'close-paren': (')',),
|
||
|
'close-brace': ('}',),
|
||
|
'close-bracket': (']',),
|
||
|
}
|
||
|
#actions = [HugsStart, HugsLoadFile]
|
||
|
|
||
|
install = Idris.install
|