branch : pmacs2
This commit is contained in:
moculus 2008-10-02 20:06:16 +00:00
parent 05d0f86c93
commit 41a8a5d9a2
2 changed files with 30 additions and 12 deletions

View File

@ -1,7 +1,7 @@
import color, mode, tab
from lex import Grammar, PatternRule, RegionRule
from mode.python import StringGrammar2
from mode.c import CTabber
from mode.c import CTabber2
class JavaGrammar(Grammar):
rules = [
@ -30,7 +30,7 @@ class JavaGrammar(Grammar):
PatternRule(r"eol", r"\n$"),
]
class JavaTabber(CTabber):
class JavaTabber(CTabber2):
def is_base(self, y):
if y == 0:
return True

38
tab.py
View File

@ -233,16 +233,18 @@ class Marker2(object):
#class StackTabber2(tab.StackTabber):
class StackTabber2(Tabber):
open_tokens = {'delimiter': {'{': '}', '(': ')', '[': ']'}}
close_tokens = {'delimiter': {'}': '{', ')': '(', ']': '['}}
scope_tokens = {'delimiter': Set(['{'])}
control_tokens = {'keyword': Set(['if', 'else', 'while', 'do', 'for'])}
end_at_eof = True
end_at_tokens = {}
continue_tokens = {}
nocontinue_tokens = {}
start_free_tokens = {'string.start': 'string.end'}
end_free_tokens = {'string.end': 'string.start'}
open_tokens = {'delimiter': {'{': '}', '(': ')', '[': ']'}}
close_tokens = {'delimiter': {'}': '{', ')': '(', ']': '['}}
scope_tokens = {'delimiter': Set(['{'])}
control_tokens = {'keyword': Set(['if', 'else', 'while', 'do', 'for'])}
end_at_eof = True
end_at_tokens = {}
continue_tokens = {}
nocontinue_tokens = {}
start_free_tokens = {'string.start': 'string.end'}
end_free_tokens = {'string.end': 'string.start'}
start_macro_tokens = {}
end_macro_tokens = {}
def __init__(self, m):
self.mode = m
self.name = m.name()
@ -377,17 +379,30 @@ class StackTabber2(Tabber):
def _handle_other_token(self, y, tokens, start, end, i, t):
name, s = t.fqname(), t.string
# handle "free" tokens (strings, heredocs, etc)
if name in self.start_free_tokens:
self._append('free', name, None)
return
elif name in self.end_free_tokens:
self._pop('free')
# handle macros
if name in self.start_macro_tokens:
self._append('macro', name, 0)
if i == 0:
self._save_curr_level()
return
elif name in self.end_macro_tokens:
self._pop('macro')
return
# remove implicit continuation
if self.end_at_eof and i + start == end:
self._pop_while('continue', 'control')
elif self.end_at_tokens.get(name, {}).get(s):
self._pop_while('continue', 'control')
# add implicit continuation
top = self._peek()
if top and top.name in self.scope_tokens.get(top.type_, {}):
if self.continue_tokens:
@ -397,9 +412,12 @@ class StackTabber2(Tabber):
if s not in self.nocontinue_tokens.get(name, {}):
self._append_unless('continue', name, self._get_next_level())
if name == 'continuation':
# handle explicit continuation
self._append_unless('continue', name, self._get_next_level())
elif s in self.control_tokens.get(name, {}):
# handle control keywords
if i == start:
self._save_curr_level()
self._append_unless('control', name, self._get_next_level())