[javascriptlint-commit] SF.net SVN: javascriptlint:[337] trunk/jsengine/tokenizer/__init__.py
Status: Beta
Brought to you by:
matthiasmiller
|
From: <mat...@us...> - 2013-10-09 20:21:35
|
Revision: 337
http://sourceforge.net/p/javascriptlint/code/337
Author: matthiasmiller
Date: 2013-10-09 20:21:32 +0000 (Wed, 09 Oct 2013)
Log Message:
-----------
Attempt to simplify token definitions.
Modified Paths:
--------------
trunk/jsengine/tokenizer/__init__.py
Modified: trunk/jsengine/tokenizer/__init__.py
===================================================================
--- trunk/jsengine/tokenizer/__init__.py 2013-10-09 19:41:02 UTC (rev 336)
+++ trunk/jsengine/tokenizer/__init__.py 2013-10-09 20:21:32 UTC (rev 337)
@@ -10,139 +10,131 @@
u'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + \
u'$_'
-_PUNCTUATORS = {
- "<<<=": "ASSIGN_ULSHIFT",
- ">>>=": "ASSIGN_URSHIFT",
- "===": "EQ_STRICT",
- "!==": "NE_STRICT",
- ">>>": "URSHIFT",
- "<<=": "ASSIGN_LSHIFT",
- ">>=": "ASSIGN_RSHIFT",
- "<=": "LE",
- ">=": "GE",
- "==": "EQ",
- "!=": "NE",
- "++": "INC",
- "--": "DEC",
- "<<": "LSHIFT",
- ">>": "RSHIFT",
- "&&": "LOGICAL_AND",
- "||": "LOGICAL_OR",
- "+=": "ASSIGN_ADD",
- "-=": "ASSIGN_SUB",
- "*=": "ASSIGN_MUL",
- "%=": "ASSIGN_MOD",
- "&=": "ASSIGN_BIT_AND",
- "|=": "ASSIGN_BIT_OR",
- "^=": "ASSIGN_BIT_XOR",
- "/=": "ASSIGN_DIV",
- "{": "LBRACE",
- "}": "RBRACE",
- "(": "LPAREN",
- ")": "RPAREN",
- "[": "LBRACKET",
- "]": "RBRACKET",
- ".": "DOT",
- ";": "SEMI",
- ",": "COMMA",
- "<": "LT",
- ">": "GT",
- "+": "ADD",
- "-": "SUB",
- "*": "MUL",
- "%": "MOD",
- "|": "BIT_OR",
- "&": "BIT_AND",
- "^": "BIT_XOR",
- "!": "LOGICAL_NOT",
- "~": "BIT_NOT",
- "?": "QUESTION",
- ":": "COLON",
- "=": "ASSIGN",
- "/": "DIV",
- "!": "LOGICAL_NOT",
-}
+_ALL_TOKENS = []
-_KEYWORDS = dict((keyword, keyword.upper()) for keyword in [
- 'break',
- 'case',
- 'catch',
- 'continue',
- 'default',
- 'delete',
- 'do',
- 'else',
- 'false',
- 'finally',
- 'for',
- 'function',
- 'if',
- 'in',
- 'instanceof',
- 'new',
- 'null',
- 'return',
- 'switch',
- 'this',
- 'throw',
- 'true',
- 'typeof',
- 'try',
- 'var',
- 'void',
- 'while',
- 'with',
-])
+class _Token(object):
+ def __init__(self, category, literal):
+ self._category = category
+ self._literal = literal
+ _ALL_TOKENS.append(self)
-_TOKENS = [
- 'C_COMMENT',
- 'CPP_COMMENT',
- 'HTML_COMMENT',
- 'ERROR',
- 'EOF',
- 'EOL',
- 'NAME',
- 'NUMBER',
- 'OPERATOR',
- 'REGEXP',
- 'SPACE',
- 'STRING',
-]
+ def __repr__(self):
+ return '_Token(%r, %r)' % (self._category, self._literal)
-class _Token(object):
- def __init__(self, name):
- self._name = name
+ @property
+ def category(self):
+ return self._category
- def __eq__(self, other):
- assert isinstance(other, _Token)
- return self is other
+ @property
+ def literal(self):
+ return self._literal
- def __repr__(self):
- return 'tok.%s' % self._name
-
-class _Tokens:
+class _Tokens(object):
def __init__(self):
- for token in _TOKENS:
- setattr(self, token, _Token(token))
+ # Load symbols
+ self.ASSIGN_ULSHIFT = _Token('sym', '<<<=')
+ self.ASSIGN_URSHIFT = _Token('sym', '>>>=')
+ self.EQ_STRICT = _Token('sym', '===')
+ self.NE_STRICT = _Token('sym', '!==')
+ self.URSHIFT = _Token('sym', '>>>')
+ self.ASSIGN_LSHIFT = _Token('sym', '<<=')
+ self.ASSIGN_RSHIFT = _Token('sym', '>>=')
+ self.LE = _Token('sym', '<=')
+ self.GE = _Token('sym', '>=')
+ self.EQ = _Token('sym', '==')
+ self.NE = _Token('sym', '!=')
+ self.INC = _Token('sym', '++')
+ self.DEC = _Token('sym', '--')
+ self.LSHIFT = _Token('sym', '<<')
+ self.RSHIFT = _Token('sym', '>>')
+ self.LOGICAL_AND = _Token('sym', '&&')
+ self.LOGICAL_OR = _Token('sym', '||')
+ self.ASSIGN_ADD = _Token('sym', '+=')
+ self.ASSIGN_SUB = _Token('sym', '-=')
+ self.ASSIGN_MUL = _Token('sym', '*=')
+ self.ASSIGN_MOD = _Token('sym', '%=')
+ self.ASSIGN_BIT_AND = _Token('sym', '&=')
+ self.ASSIGN_BIT_OR = _Token('sym', '|=')
+ self.ASSIGN_BIT_XOR = _Token('sym', '^=')
+ self.ASSIGN_DIV = _Token('sym', '/=')
+ self.LBRACE = _Token('sym', '{')
+ self.RBRACE = _Token('sym', '}')
+ self.LPAREN = _Token('sym', '(')
+ self.RPAREN = _Token('sym', ')')
+ self.LBRACKET = _Token('sym', '[')
+ self.RBRACKET = _Token('sym', ']')
+ self.DOT = _Token('sym', '.')
+ self.SEMI = _Token('sym', ';')
+ self.COMMA = _Token('sym', ',')
+ self.LT = _Token('sym', '<')
+ self.GT = _Token('sym', '>')
+ self.ADD = _Token('sym', '+')
+ self.SUB = _Token('sym', '-')
+ self.MUL = _Token('sym', '*')
+ self.MOD = _Token('sym', '%')
+ self.BIT_OR = _Token('sym', '|')
+ self.BIT_AND = _Token('sym', '&')
+ self.BIT_XOR = _Token('sym', '^')
+ self.LOGICAL_NOT = _Token('sym', '!')
+ self.BIT_NOT = _Token('sym', '~')
+ self.QUESTION = _Token('sym', '?')
+ self.COLON = _Token('sym', ':')
+ self.ASSIGN = _Token('sym', '=')
+ self.DIV = _Token('sym', '/')
- for key, name in list(_KEYWORDS.items()):
- _KEYWORDS[key] = _Token(name)
- setattr(self, name, _KEYWORDS[key])
+ # Load keywords
+ self.BREAK = _Token('kw', 'break')
+ self.CASE = _Token('kw', 'case')
+ self.CATCH = _Token('kw', 'catch')
+ self.CONTINUE = _Token('kw', 'continue')
+ self.DEFAULT = _Token('kw', 'default')
+ self.DELETE = _Token('kw', 'delete')
+ self.DO = _Token('kw', 'do')
+ self.ELSE = _Token('kw', 'else')
+ self.FALSE = _Token('kw', 'false')
+ self.FINALLY = _Token('kw', 'finally')
+ self.FOR = _Token('kw', 'for')
+ self.FUNCTION = _Token('kw', 'function')
+ self.IF = _Token('kw', 'if')
+ self.IN = _Token('kw', 'in')
+ self.INSTANCEOF = _Token('kw', 'instanceof')
+ self.NEW = _Token('kw', 'new')
+ self.NULL = _Token('kw', 'null')
+ self.RETURN = _Token('kw', 'return')
+ self.SWITCH = _Token('kw', 'switch')
+ self.THIS = _Token('kw', 'this')
+ self.THROW = _Token('kw', 'throw')
+ self.TRUE = _Token('kw', 'true')
+ self.TYPEOF = _Token('kw', 'typeof')
+ self.TRY = _Token('kw', 'try')
+ self.VAR = _Token('kw', 'var')
+ self.VOID = _Token('kw', 'void')
+ self.WHILE = _Token('kw', 'while')
+ self.WITH = _Token('kw', 'with')
- for key, name in list(_PUNCTUATORS.items()):
- _PUNCTUATORS[key] = _Token(name)
- setattr(self, name, _PUNCTUATORS[key])
+ # Load other tokens
+ self.C_COMMENT = _Token('other', '/*')
+ self.CPP_COMMENT = _Token('other', '//')
+ self.HTML_COMMENT = _Token('other', '<!--')
+ self.ERROR = _Token('other', 'err')
+ self.EOF = _Token('other', 'eof')
+ self.EOL = _Token('other', 'eol')
+ self.NAME = _Token('other', '(name)')
+ self.NUMBER = _Token('other', '(num)')
+ self.OPERATOR = _Token('other', '(op)')
+ self.REGEXP = _Token('other', '(re)')
+ self.SPACE = _Token('other', '(sp)')
+ self.STRING = _Token('other', '(str)')
tok = _Tokens()
-
-
+_KEYWORDS = dict((t.literal, t) for t in _ALL_TOKENS if t.category == 'kw')
_PUNCTUATOR_TREE = {}
-for punctuator in _PUNCTUATORS:
+for punctuator in (t for t in _ALL_TOKENS if t.category == 'sym'):
d = _PUNCTUATOR_TREE
- for c in punctuator:
+ for c in punctuator.literal:
d = d.setdefault(c, {})
- assert not None in d
- d[None] = _PUNCTUATORS[punctuator]
+ assert not None in d, punctuator.literal
+ d[None] = punctuator
class Token:
def __init__(self, tok, atom=None):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|