summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerman M. Bravo <german.mb@deipi.com>2013-08-14 15:38:25 -0500
committerGerman M. Bravo <german.mb@deipi.com>2013-08-16 10:08:32 -0500
commit89005b0119c3753bec59a8aa76f44ae3676f04a7 (patch)
tree31f2db32e46a737ec207e532685e5a1f0e2896d8
parentbb173d58ace600519d8167dc89a2b63a433651ea (diff)
downloadpyscss-89005b0119c3753bec59a8aa76f44ae3676f04a7.tar.gz
Cleaned grammar a bit more
-rw-r--r--scss/expression.py36
-rw-r--r--scss/src/grammar/grammar.g13
-rw-r--r--scss/src/grammar/grammar.py35
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'])