diff options
author | German M. Bravo <german.mb@deipi.com> | 2013-08-14 15:38:25 -0500 |
---|---|---|
committer | German M. Bravo <german.mb@deipi.com> | 2013-08-16 10:08:32 -0500 |
commit | 89005b0119c3753bec59a8aa76f44ae3676f04a7 (patch) | |
tree | 31f2db32e46a737ec207e532685e5a1f0e2896d8 | |
parent | bb173d58ace600519d8167dc89a2b63a433651ea (diff) | |
download | pyscss-89005b0119c3753bec59a8aa76f44ae3676f04a7.tar.gz |
Cleaned grammar a bit more
-rw-r--r-- | scss/expression.py | 36 | ||||
-rw-r--r-- | scss/src/grammar/grammar.g | 13 | ||||
-rw-r--r-- | scss/src/grammar/grammar.py | 35 |
3 files changed, 40 insertions, 44 deletions
diff --git a/scss/expression.py b/scss/expression.py index cfbe9e8..afb9f74 100644 --- a/scss/expression.py +++ b/scss/expression.py @@ -420,6 +420,7 @@ class Parser(object): ################################################################################ ## Grammar compiled using Yapps: + class SassExpressionScanner(Scanner): patterns = None _patterns = [ @@ -577,31 +578,30 @@ class SassExpression(Parser): def atom(self): _token_ = self._peek(self.u_expr_chks) - if _token_ == 'LPAR': - LPAR = self._scan('LPAR') - expr_lst = self.expr_lst() - RPAR = self._scan('RPAR') - return Parentheses(expr_lst) - elif _token_ == 'ID': + if _token_ == 'ID': ID = self._scan('ID') return Literal(parse_bareword(ID)) elif _token_ == 'BANG_IMPORTANT': BANG_IMPORTANT = self._scan('BANG_IMPORTANT') return Literal(String(BANG_IMPORTANT, quotes=None)) + elif _token_ == 'LPAR': + LPAR = self._scan('LPAR') + expr_lst = ListLiteral([]) + if self._peek(self.atom_rsts) not in self.atom_chks: + expr_lst = self.expr_lst() + RPAR = self._scan('RPAR') + return Parentheses(expr_lst) elif _token_ == 'FNCT': FNCT = self._scan('FNCT') - v = ArgspecLiteral([]) LPAR = self._scan('LPAR') - if self._peek(self.atom_rsts) != 'RPAR': + expr_lst = ArgspecLiteral([]) + if self._peek(self.atom_rsts) not in self.atom_chks: expr_lst = self.expr_lst() - v = expr_lst - if self._peek(self.atom_rsts_) == 'COMMA': - COMMA = self._scan('COMMA') RPAR = self._scan('RPAR') - return CallOp(FNCT, v) + return CallOp(FNCT, expr_lst) elif _token_ == 'NUM': NUM = self._scan('NUM') - if self._peek(self.atom_rsts__) == 'UNITS': + if self._peek(self.atom_rsts_) == 'UNITS': UNITS = self._scan('UNITS') return Literal(NumberValue(float(NUM), unit=UNITS.lower())) return Literal(NumberValue(float(NUM))) @@ -648,17 +648,17 @@ class SassExpression(Parser): m_expr_chks = set(['MUL', 'DIV']) comparison_rsts = set(['LPAR', 'QSTR', 'RPAR', 'BANG_IMPORTANT', 'LE', 'COLOR', 'NE', 'LT', 'NUM', 'COMMA', 'GT', 'END', 'SIGN', 'ADD', 'FNCT', 'STR', 'VAR', 'EQ', 'ID', 'AND', 'GE', 'NOT', 'OR']) - atom_rsts = set(['LPAR', 'BANG_IMPORTANT', 'COLOR', 'QSTR', 'SIGN', 'NOT', 'ADD', 'NUM', 'FNCT', 'STR', 'VAR', 'RPAR', 'ID']) - atom_rsts__ = set(['LPAR', 'SUB', 'QSTR', 'RPAR', 'VAR', 'MUL', 'DIV', 'BANG_IMPORTANT', 'LE', 'COLOR', 'NE', 'LT', 'NUM', 'COMMA', 'GT', 'END', 'SIGN', 'GE', 'FNCT', 'STR', 'UNITS', 'EQ', 'ID', 'AND', 'ADD', 'NOT', 'OR']) + atom_rsts = set(['LPAR', 'BANG_IMPORTANT', 'END', 'COLOR', 'QSTR', 'SIGN', 'NOT', 'ADD', 'NUM', 'FNCT', 'STR', 'VAR', 'RPAR', 'ID']) u_expr_chks = set(['LPAR', 'COLOR', 'QSTR', 'NUM', 'FNCT', 'STR', 'VAR', 'BANG_IMPORTANT', 'ID']) m_expr_rsts = set(['LPAR', 'SUB', 'QSTR', 'RPAR', 'MUL', 'DIV', 'BANG_IMPORTANT', 'LE', 'COLOR', 'NE', 'LT', 'NUM', 'COMMA', 'GT', 'END', 'SIGN', 'GE', 'FNCT', 'STR', 'VAR', 'EQ', 'ID', 'AND', 'ADD', 'NOT', 'OR']) expr_lst_rsts = set(['END', 'COMMA', 'RPAR']) and_expr_rsts = set(['AND', 'LPAR', 'RPAR', 'END', 'COLOR', 'QSTR', 'SIGN', 'VAR', 'ADD', 'NUM', 'COMMA', 'FNCT', 'STR', 'NOT', 'ID', 'BANG_IMPORTANT', 'OR']) u_expr_rsts = set(['LPAR', 'COLOR', 'QSTR', 'SIGN', 'ADD', 'NUM', 'FNCT', 'STR', 'VAR', 'BANG_IMPORTANT', 'ID']) - expr_rsts = set(['LPAR', 'RPAR', 'END', 'COLOR', 'QSTR', 'SIGN', 'VAR', 'ADD', 'NUM', 'COMMA', 'FNCT', 'STR', 'NOT', 'ID', 'BANG_IMPORTANT', 'OR']) - expr_item_rsts = set(['LPAR', 'COLOR', 'QSTR', 'SIGN', 'NOT', 'ADD', 'NUM', 'FNCT', 'STR', 'VAR', 'BANG_IMPORTANT', 'ID']) + expr_rsts = set(['LPAR', 'RPAR', 'BANG_IMPORTANT', 'END', 'COLOR', 'QSTR', 'ID', 'VAR', 'ADD', 'NUM', 'COMMA', 'FNCT', 'STR', 'NOT', 'SIGN', 'OR']) + atom_chks = set(['END', 'RPAR']) not_expr_rsts = set(['LPAR', 'COLOR', 'QSTR', 'SIGN', 'VAR', 'ADD', 'NUM', 'FNCT', 'STR', 'NOT', 'BANG_IMPORTANT', 'ID']) - atom_rsts_ = set(['COMMA', 'RPAR']) + atom_rsts_ = set(['LPAR', 'SUB', 'QSTR', 'RPAR', 'VAR', 'MUL', 'DIV', 'BANG_IMPORTANT', 'LE', 'COLOR', 'NE', 'LT', 'NUM', 'COMMA', 'GT', 'END', 'SIGN', 'GE', 'FNCT', 'STR', 'UNITS', 'EQ', 'ID', 'AND', 'ADD', 'NOT', 'OR']) + expr_item_rsts = set(['LPAR', 'COLOR', 'QSTR', 'SIGN', 'NOT', 'ADD', 'NUM', 'FNCT', 'STR', 'VAR', 'BANG_IMPORTANT', 'ID']) comparison_chks = set(['GT', 'GE', 'NE', 'LT', 'LE', 'EQ']) a_expr_chks = set(['ADD', 'SUB']) a_expr_rsts = set(['LPAR', 'SUB', 'QSTR', 'RPAR', 'BANG_IMPORTANT', 'LE', 'COLOR', 'NE', 'LT', 'NUM', 'COMMA', 'GT', 'END', 'SIGN', 'GE', 'FNCT', 'STR', 'VAR', 'EQ', 'ID', 'AND', 'ADD', 'NOT', 'OR']) diff --git a/scss/src/grammar/grammar.g b/scss/src/grammar/grammar.g index 2e71741..8798018 100644 --- a/scss/src/grammar/grammar.g +++ b/scss/src/grammar/grammar.g @@ -76,15 +76,12 @@ parser SassExpression: | ADD u_expr {{ return UnaryOp(operator.pos, u_expr) }} | atom {{ return atom }} - rule atom: LPAR expr_lst RPAR {{ return Parentheses(expr_lst) }} - | ID {{ return Literal(parse_bareword(ID)) }} + rule atom: ID {{ return Literal(parse_bareword(ID)) }} | BANG_IMPORTANT {{ return Literal(String(BANG_IMPORTANT, quotes=None)) }} - | FNCT {{ v = ArgspecLiteral([]) }} - LPAR [ - expr_lst {{ v = expr_lst }} - [ COMMA - ] - ] RPAR {{ return CallOp(FNCT, v) }} + | LPAR {{ expr_lst = ListLiteral([]) }} + [ expr_lst ] RPAR {{ return Parentheses(expr_lst) }} + | FNCT LPAR {{ expr_lst = ArgspecLiteral([]) }} + [ expr_lst ] RPAR {{ return CallOp(FNCT, expr_lst) }} | NUM [ UNITS {{ return Literal(NumberValue(float(NUM), unit=UNITS.lower())) }} ] {{ return Literal(NumberValue(float(NUM))) }} diff --git a/scss/src/grammar/grammar.py b/scss/src/grammar/grammar.py index 8c843f9..e89be20 100644 --- a/scss/src/grammar/grammar.py +++ b/scss/src/grammar/grammar.py @@ -165,31 +165,30 @@ class SassExpression(Parser): def atom(self): _token_ = self._peek(self.u_expr_chks) - if _token_ == 'LPAR': - LPAR = self._scan('LPAR') - expr_lst = self.expr_lst() - RPAR = self._scan('RPAR') - return Parentheses(expr_lst) - elif _token_ == 'ID': + if _token_ == 'ID': ID = self._scan('ID') return Literal(parse_bareword(ID)) elif _token_ == 'BANG_IMPORTANT': BANG_IMPORTANT = self._scan('BANG_IMPORTANT') return Literal(String(BANG_IMPORTANT, quotes=None)) + elif _token_ == 'LPAR': + LPAR = self._scan('LPAR') + expr_lst = ListLiteral([]) + if self._peek(self.atom_rsts) not in self.atom_chks: + expr_lst = self.expr_lst() + RPAR = self._scan('RPAR') + return Parentheses(expr_lst) elif _token_ == 'FNCT': FNCT = self._scan('FNCT') - v = ArgspecLiteral([]) LPAR = self._scan('LPAR') - if self._peek(self.atom_rsts) != 'RPAR': + expr_lst = ArgspecLiteral([]) + if self._peek(self.atom_rsts) not in self.atom_chks: expr_lst = self.expr_lst() - v = expr_lst - if self._peek(self.atom_rsts_) == 'COMMA': - COMMA = self._scan('COMMA') RPAR = self._scan('RPAR') - return CallOp(FNCT, v) + return CallOp(FNCT, expr_lst) elif _token_ == 'NUM': NUM = self._scan('NUM') - if self._peek(self.atom_rsts__) == 'UNITS': + if self._peek(self.atom_rsts_) == 'UNITS': UNITS = self._scan('UNITS') return Literal(NumberValue(float(NUM), unit=UNITS.lower())) return Literal(NumberValue(float(NUM))) @@ -236,17 +235,17 @@ class SassExpression(Parser): m_expr_chks = set(['MUL', 'DIV']) comparison_rsts = set(['LPAR', 'QSTR', 'RPAR', 'BANG_IMPORTANT', 'LE', 'COLOR', 'NE', 'LT', 'NUM', 'COMMA', 'GT', 'END', 'SIGN', 'ADD', 'FNCT', 'STR', 'VAR', 'EQ', 'ID', 'AND', 'GE', 'NOT', 'OR']) - atom_rsts = set(['LPAR', 'BANG_IMPORTANT', 'COLOR', 'QSTR', 'SIGN', 'NOT', 'ADD', 'NUM', 'FNCT', 'STR', 'VAR', 'RPAR', 'ID']) - atom_rsts__ = set(['LPAR', 'SUB', 'QSTR', 'RPAR', 'VAR', 'MUL', 'DIV', 'BANG_IMPORTANT', 'LE', 'COLOR', 'NE', 'LT', 'NUM', 'COMMA', 'GT', 'END', 'SIGN', 'GE', 'FNCT', 'STR', 'UNITS', 'EQ', 'ID', 'AND', 'ADD', 'NOT', 'OR']) + atom_rsts = set(['LPAR', 'BANG_IMPORTANT', 'END', 'COLOR', 'QSTR', 'SIGN', 'NOT', 'ADD', 'NUM', 'FNCT', 'STR', 'VAR', 'RPAR', 'ID']) u_expr_chks = set(['LPAR', 'COLOR', 'QSTR', 'NUM', 'FNCT', 'STR', 'VAR', 'BANG_IMPORTANT', 'ID']) m_expr_rsts = set(['LPAR', 'SUB', 'QSTR', 'RPAR', 'MUL', 'DIV', 'BANG_IMPORTANT', 'LE', 'COLOR', 'NE', 'LT', 'NUM', 'COMMA', 'GT', 'END', 'SIGN', 'GE', 'FNCT', 'STR', 'VAR', 'EQ', 'ID', 'AND', 'ADD', 'NOT', 'OR']) expr_lst_rsts = set(['END', 'COMMA', 'RPAR']) and_expr_rsts = set(['AND', 'LPAR', 'RPAR', 'END', 'COLOR', 'QSTR', 'SIGN', 'VAR', 'ADD', 'NUM', 'COMMA', 'FNCT', 'STR', 'NOT', 'ID', 'BANG_IMPORTANT', 'OR']) u_expr_rsts = set(['LPAR', 'COLOR', 'QSTR', 'SIGN', 'ADD', 'NUM', 'FNCT', 'STR', 'VAR', 'BANG_IMPORTANT', 'ID']) - expr_rsts = set(['LPAR', 'RPAR', 'END', 'COLOR', 'QSTR', 'SIGN', 'VAR', 'ADD', 'NUM', 'COMMA', 'FNCT', 'STR', 'NOT', 'ID', 'BANG_IMPORTANT', 'OR']) - expr_item_rsts = set(['LPAR', 'COLOR', 'QSTR', 'SIGN', 'NOT', 'ADD', 'NUM', 'FNCT', 'STR', 'VAR', 'BANG_IMPORTANT', 'ID']) + expr_rsts = set(['LPAR', 'RPAR', 'BANG_IMPORTANT', 'END', 'COLOR', 'QSTR', 'ID', 'VAR', 'ADD', 'NUM', 'COMMA', 'FNCT', 'STR', 'NOT', 'SIGN', 'OR']) + atom_chks = set(['END', 'RPAR']) not_expr_rsts = set(['LPAR', 'COLOR', 'QSTR', 'SIGN', 'VAR', 'ADD', 'NUM', 'FNCT', 'STR', 'NOT', 'BANG_IMPORTANT', 'ID']) - atom_rsts_ = set(['COMMA', 'RPAR']) + atom_rsts_ = set(['LPAR', 'SUB', 'QSTR', 'RPAR', 'VAR', 'MUL', 'DIV', 'BANG_IMPORTANT', 'LE', 'COLOR', 'NE', 'LT', 'NUM', 'COMMA', 'GT', 'END', 'SIGN', 'GE', 'FNCT', 'STR', 'UNITS', 'EQ', 'ID', 'AND', 'ADD', 'NOT', 'OR']) + expr_item_rsts = set(['LPAR', 'COLOR', 'QSTR', 'SIGN', 'NOT', 'ADD', 'NUM', 'FNCT', 'STR', 'VAR', 'BANG_IMPORTANT', 'ID']) comparison_chks = set(['GT', 'GE', 'NE', 'LT', 'LE', 'EQ']) a_expr_chks = set(['ADD', 'SUB']) a_expr_rsts = set(['LPAR', 'SUB', 'QSTR', 'RPAR', 'BANG_IMPORTANT', 'LE', 'COLOR', 'NE', 'LT', 'NUM', 'COMMA', 'GT', 'END', 'SIGN', 'GE', 'FNCT', 'STR', 'VAR', 'EQ', 'ID', 'AND', 'ADD', 'NOT', 'OR']) |