import regex from mode import Fundamental from tab import StackTabber from lex import Grammar, PatternRule, RegionRule from mode.python import StringGrammar2 class LispGrammar(Grammar): rules = [ PatternRule(r'comment', r';.*$'), PatternRule(r'delimiter', r'[()]'), PatternRule(r'keyword', r'(?:or|not|list|let\*|let|lambda|if|cons|c[ad]+r|apply|and)(?![^\"\' \t()])'), PatternRule(r'lisp_word', r"[^\"' \t()]+"), RegionRule(r'string', r'"', StringGrammar2, r'"'), PatternRule(r'spaces', r' +'), PatternRule(r'eol', r'\n'), ] class LispTabber(StackTabber): wsre = regex.whitespace wst = ('spaces', 'null', 'eol',) sre = regex.space st = ('spaces', 'null',) def _handle_open_token(self, currlvl, y, i): token = self.get_token(y, i) rtoken = self.get_next_right_token(y, i) if rtoken is None: level = self.get_curr_level() + self.mode.tabwidth elif rtoken.string not in ('(', 'define', 'lambda'): rtoken = self.get_next_right_token(y, i + 1) if rtoken is None or rtoken.string != '(': level = self.get_curr_level() + self.mode.tabwidth else: level = rtoken.x else: level = self.get_curr_level() + self.mode.tabwidth self._append(token.string, level) return currlvl class Lisp(Fundamental): name = 'Lisp' tabwidth = 2 tabbercls = LispTabber grammar = LispGrammar commentc = ';' opentokens = ('delimiter',) opentags = {'(': ')'} closetokens = ('delimiter',) closetags = {')': '('} _bindings = { 'close-paren': (')',), 'close-brace': ('}',), 'close-bracket': (']',), } commentc = ';' install = Lisp.install