[javascriptlint-commit] SF.net SVN: javascriptlint:[346] trunk/jsengine/tokenizer
Status: Beta
Brought to you by:
matthiasmiller
|
From: <mat...@us...> - 2013-10-10 15:28:35
|
Revision: 346
http://sourceforge.net/p/javascriptlint/code/346
Author: matthiasmiller
Date: 2013-10-10 15:28:32 +0000 (Thu, 10 Oct 2013)
Log Message:
-----------
Refactor punctuator/keyword handling.
Modified Paths:
--------------
trunk/jsengine/tokenizer/__init__.py
trunk/jsengine/tokenizer/tok.py
Modified: trunk/jsengine/tokenizer/__init__.py
===================================================================
--- trunk/jsengine/tokenizer/__init__.py 2013-10-10 15:25:47 UTC (rev 345)
+++ trunk/jsengine/tokenizer/__init__.py 2013-10-10 15:28:32 UTC (rev 346)
@@ -5,15 +5,11 @@
_WHITESPACE = u'\u0020\t\u000B\u000C\u00A0\uFFFF'
_LINETERMINATOR = u'\u000A\u000D\u2028\u2029'
_DIGITS = u'0123456789'
-_DOT_DIGITS = [u'.%s' % digit for digit in _DIGITS]
_HEX_DIGITS = _DIGITS + u'abcdefABCDEF'
_IDENT = u'abcdefghijklmnopqrstuvwxyz' + \
u'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + \
u'$_'
-_KEYWORDS = tok.getkeywords()
-_PUNCTUATOR_TREE = tok.get_punctuator_tree()
-
class _Char(object):
def __init__(self, u):
assert isinstance(u, int) or u is None, u
@@ -179,7 +175,7 @@
def expect_identifiername(self):
encountered = self.advance()
- if encountered.tok in list(_KEYWORDS.values()):
+ if tok.keywords.has(encountered.tok) != -1:
encountered.tok = tok.NAME
if encountered.tok != tok.NAME:
raise JSSyntaxError(encountered.start_offset, 'syntax_error')
@@ -332,29 +328,28 @@
atom = stream.get_watched_reads()
return Token(tok.NUMBER, atom=atom)
- if c.uval in _PUNCTUATOR_TREE:
- d = _PUNCTUATOR_TREE[c.uval]
+ if tok.punctuators.hasprefix(c.tostr()):
+ s = c.tostr()
while True:
c = stream.peekchr()
- if c and c.uval in d:
+ if c and tok.punctuators.hasprefix(s + c.tostr()):
+ s += c.tostr()
stream.readchr()
- d = d[c.uval]
else:
break
- try:
- return Token(d[-1])
- except KeyError:
- print('oops')
+ d = tok.punctuators.get(s)
+ if not d:
raise JSSyntaxError(stream.get_offset(), 'syntax_error')
-
+ return Token(d)
if c.instr(_IDENT):
while stream.readchrin(_IDENT + _DIGITS):
pass
atom = stream.get_watched_reads()
- if atom in _KEYWORDS:
- return Token(_KEYWORDS[atom], atom=atom)
- return Token(tok.NAME, atom=atom)
+ tt = tok.keywords.get(atom, tok.NAME)
+ t = Token(tt)
+ t.atom = atom
+ return t
raise JSSyntaxError(stream.get_offset(), 'unexpected_char',
{ 'char': c.tostr() })
Modified: trunk/jsengine/tokenizer/tok.py
===================================================================
--- trunk/jsengine/tokenizer/tok.py 2013-10-10 15:25:47 UTC (rev 345)
+++ trunk/jsengine/tokenizer/tok.py 2013-10-10 15:28:32 UTC (rev 346)
@@ -10,12 +10,10 @@
def __repr__(self):
return 'TokenType(%r, %r)' % (self._category, self._literal)
- @property
- def category(self):
+ def getcategory(self):
return self._category
- @property
- def literal(self):
+ def getliteral(self):
return self._literal
# Symbols
@@ -113,16 +111,44 @@
SPACE = TokenType('other', '(sp)')
STRING = TokenType('other', '(str)')
-def getkeywords():
- return dict((t.literal, t) for t in _ALL_TOKENS if t.category == 'kw')
+# Freeze the list of keywords
+_ALL_TOKENS = tuple(_ALL_TOKENS)
-def get_punctuator_tree():
- tree = {}
- for punctuator in (t for t in _ALL_TOKENS if t.category == 'sym'):
- leaf = tree
- for c in punctuator.literal:
- leaf = leaf.setdefault(ord(c), {})
- assert not None in leaf, punctuator.literal
- leaf[-1] = punctuator
- return tree
+class _Keywords(object):
+ def __init__(self):
+ self._d = {}
+ for tt in _ALL_TOKENS:
+ if tt.getcategory() == 'kw':
+ self._d[tt.getliteral()] = tt
+ def get(self, literal, default):
+ return self._d.get(literal, default)
+
+ def has(self, tok):
+ for iter in self._d.values():
+ if iter == tok:
+ return True
+ return False
+
+keywords = _Keywords()
+
+class _Punctuators(object):
+ def __init__(self):
+ self._prefixes = {}
+ self._punctuators = {}
+
+ for t in _ALL_TOKENS:
+ if t.getcategory() == 'sym':
+ literal = t.getliteral()
+ for i in range(len(literal)):
+ prefix = literal[:i+1]
+ self._prefixes[prefix] = True
+ self._punctuators[literal] = t
+
+ def hasprefix(self, prefix):
+ return self._prefixes.get(prefix, False)
+
+ def get(self, literal):
+ return self._punctuators.get(literal)
+
+punctuators = _Punctuators()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|