summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerman M. Bravo <german.mb@deipi.com>2013-08-15 12:47:44 -0500
committerGerman M. Bravo <german.mb@deipi.com>2013-08-16 10:13:28 -0500
commitce3945de020fc28f7ccaf7dea91d673beaeaae2f (patch)
treef80662f7e4f8445bf95302a93cccefd4fd1bf28c
parent7af1997c0d289e7f8b9747df349734fabe14ff10 (diff)
downloadpyscss-ce3945de020fc28f7ccaf7dea91d673beaeaae2f.tar.gz
Yapps changes from https://github.com/mk-fg/yapps/ being pulled
-rw-r--r--scss/_native.py45
-rwxr-xr-xscss/src/grammar/yapps2.py24
2 files changed, 34 insertions, 35 deletions
diff --git a/scss/_native.py b/scss/_native.py
index b6e2b81..7abeb5b 100644
--- a/scss/_native.py
+++ b/scss/_native.py
@@ -179,19 +179,19 @@ class Scanner(object):
output = "%s\n (@%s) %s = %s" % (output, t[0], t[2], repr(t[3]))
return output
- def _scan(self, restrict):
+ def _scan(self, restrict, context=None):
"""
Should scan another token and add it to the list, self.tokens,
and add the restriction to self.restrictions
"""
# Keep looking for a token, ignoring any in self.ignore
- token = None
while True:
tok = None
- best_pat = None
+
# Search the patterns for a match, with earlier
# tokens in the list having preference
- best_pat_len = 0
+ best_match = -1
+ best_pat = None
for tok, regex in self.patterns:
if DEBUG:
print("\tTrying %s: %s at pos %d -> %s" % (repr(tok), repr(regex.pattern), self.pos, repr(self.input)))
@@ -201,27 +201,27 @@ class Scanner(object):
print "\tSkipping %s!" % repr(tok)
continue
m = regex.match(self.input, self.pos)
- if m:
- # We got a match
+ if m and m.end() - m.start() > best_match:
+ # We got a match that's better than the previous one
best_pat = tok
- best_pat_len = len(m.group(0))
+ best_match = m.end() - m.start()
if DEBUG:
print("Match OK! %s: %s at pos %d" % (repr(tok), repr(regex.pattern), self.pos))
break
# If we didn't find anything, raise an error
- if best_pat is None:
+ if best_pat is None or best_match < 0:
msg = "Bad token: %s" % ("???" if tok is None else repr(tok),)
if restrict:
msg = "%s found while trying to find one of the restricted tokens: %s" % ("???" if tok is None else repr(tok), ", ".join(repr(r) for r in restrict))
- raise SyntaxError("SyntaxError[@ char %s: %s]" % (repr(self.pos), msg))
+ raise SyntaxError("SyntaxError[@ char %s: %s]" % (repr(self.pos), msg), context=context)
# If we found something that isn't to be ignored, return it
if best_pat in self.ignore:
# This token should be ignored...
- self.pos += best_pat_len
+ self.pos += best_match
else:
- end_pos = self.pos + best_pat_len
+ end_pos = self.pos + best_match
# Create a token with this data
token = (
self.pos,
@@ -229,26 +229,25 @@ class Scanner(object):
best_pat,
self.input[self.pos:end_pos]
)
- break
- if token is not None:
- self.pos = token[1]
- # Only add this token if it's not in the list
- # (to prevent looping)
- if not self.tokens or token != self.tokens[-1]:
- self.tokens.append(token)
- self.restrictions.append(restrict)
- return 1
- return 0
+ self.pos = end_pos
+ # Only add this token if it's not in the list
+ # (to prevent looping)
+ if not self.tokens or token != self.tokens[-1]:
+ self.tokens.append(token)
+ self.restrictions.append(restrict)
+ return 1
+ return 0
- def token(self, i, restrict=None):
+ def token(self, i, restrict=None, **kwargs):
"""
Get the i'th token, and if i is one past the end, then scan
for another token; restrict is a list of tokens that
are allowed, or 0 for any token.
"""
+ context = kwargs.get("context")
tokens_len = len(self.tokens)
if i == tokens_len: # We are at the end, get the next...
- tokens_len += self._scan(restrict)
+ tokens_len += self._scan(restrict, context)
elif i >= 0 and i < tokens_len:
if restrict and self.restrictions[i] and restrict > self.restrictions[i]:
raise NotImplementedError("Unimplemented: restriction set changed")
diff --git a/scss/src/grammar/yapps2.py b/scss/src/grammar/yapps2.py
index b231829..6ccb045 100755
--- a/scss/src/grammar/yapps2.py
+++ b/scss/src/grammar/yapps2.py
@@ -226,20 +226,20 @@ class Generator:
self.write("from yappsrt import *\n")
self.write("\n\n")
self.write("class ", self.name, "Scanner(Scanner):\n")
- self.write(" patterns = None\n")
- self.write(" _patterns = [\n")
+ self.write(INDENT, "patterns = None\n")
+ self.write(INDENT, "_patterns = [\n")
for p in self.terminals:
- self.write(" (%s, %s),\n" % (
+ self.write(INDENT*2, "(%s, %s),\n" % (
repr(p), repr(self.tokens[p])))
- self.write(" ]\n\n")
- self.write(" def __init__(self, input=None):\n")
- self.write(" if hasattr(self, 'setup_patterns'):\n")
- self.write(" self.setup_patterns(self._patterns)\n")
- self.write(" elif self.patterns is None:\n")
- self.write(" self.__class__.patterns = []\n")
- self.write(" for t, p in self._patterns:\n")
- self.write(" self.patterns.append((t, re.compile(p)))\n")
- self.write(" super(", self.name, "Scanner, self).__init__(None, %s, input)\n" %
+ self.write(INDENT, "]\n\n")
+ self.write(INDENT, "def __init__(self, input=None):\n")
+ self.write(INDENT*2, "if hasattr(self, 'setup_patterns'):\n")
+ self.write(INDENT*3, "self.setup_patterns(self._patterns)\n")
+ self.write(INDENT*2, "elif self.patterns is None:\n")
+ self.write(INDENT*3, "self.__class__.patterns = []\n")
+ self.write(INDENT*3, "for t, p in self._patterns:\n")
+ self.write(INDENT*4, "self.patterns.append((t, re.compile(p)))\n")
+ self.write(INDENT*2, "super(", self.name, "Scanner, self).__init__(None, %s, input)\n" %
repr(self.ignore))
self.write("\n\n")