pmacs3/mode/haskell.py

61 lines
2.7 KiB
Python
Raw Normal View History

import commands, os.path, sets, string, sys, traceback
import color, completer, default, mode, method, regex, tab
from point import Point
from lex import Grammar, PatternRule, RegionRule, OverridePatternRule, NocasePatternRule
class CommentGrammar(Grammar):
rules = [
RegionRule(r'comment', r'{-', None, r'-}'),
PatternRule(r'data', r'(?:[^{]|{(?!-))+'),
]
class StringGrammar(Grammar):
rules = [
RegionRule(r'gap', r'\\ *\n$', Grammar, r'^ *[^ \n]'),
NocasePatternRule(r'escaped', r'\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[&abfnrtv\\"\']|\^[a-z]|\d{1,3}|o[0-7]{0,3}|x(?:[0-9a-f]){0,2})'),
PatternRule(r'data', r'[^\\]+'),
]
class HaskellGrammar(Grammar):
rules = [
PatternRule(r'comment', r'--.*$'),
RegionRule(r'comment', r'{-', CommentGrammar, r'-}'),
RegionRule(r'hs_string', r'"', StringGrammar, r'"'),
PatternRule(r'hs_reserved', r"(?:_|where|type|then|of|newtype|module|let|instance|infixr|infixl|infix|in|import|if|else|do|deriving|default|data|class|case)(?![a-zA-Z0-9_'])"),
PatternRule(r'hs_declaration', r"^[a-z_][a-zA-Z0-9_']*"),
PatternRule(r'hs_variable', r"[a-z_][a-zA-Z0-9_']*"),
PatternRule(r'hs_constructor', r"[A-Z][a-zA-Z0-9_']*"),
PatternRule(r'hs_operator', r'@|!|>@>|>>=|>>|=>|::|->|;|<-|\\\\|\.\.|!!|:|\+\+|\||\.|\\|>=|>|/=|==|<=|<|\|\||&&|\^\^|\*\*|\^|/|\*|-|\+|='),
]
class Haskell(mode.Fundamental):
modename = 'Haskell'
extensions = ['.hs']
tabwidth = 4
#tabbercls = mode.lisp.LispTabber
grammar = HaskellGrammar
#opentokens = ('delimiter',)
#opentags = {'(': ')'}
#closetokens = ('delimiter',)
#closetags = {')': '('}
colors = {
'hs_reserved': ('cyan', 'default', 'bold'),
'hs_constructor': ('magenta', 'default', 'bold'),
'hs_declaration': ('blue', 'default', 'bold'),
'hs_operator': ('green', 'default', 'bold'),
'hs_string.start': ('green', 'default', 'bold'),
'hs_string.null': ('green', 'default', 'bold'),
'hs_string.end': ('green', 'default', 'bold'),
'hs_string.escaped': ('magenta', 'default', 'bold'),
'hs_string.gap.start': ('red', 'default', 'bold'),
'hs_string.gap.null': ('red', 'default', 'bold'),
'hs_string.gap.end': ('red', 'default', 'bold'),
}
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 = Haskell.install