summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Magnusson <ulfalizer@gmail.com>2018-01-27 07:23:37 +0100
committerUlf Magnusson <ulfalizer@gmail.com>2018-01-27 08:04:21 +0100
commita84848b823471b0e8385815c1a47563cbd139fd8 (patch)
tree8e341ba68751d88c2095651ceb615e285edf7332
parente6aa2b2e5bbc7f94b6acd0a6e05674e476b3827c (diff)
Tighten up syntax checking
Now points out the error for stuff like 'config' with no symbol name following it instead of randomly failing later. 1-2% parsing performance hit tops it seems.
-rw-r--r--kconfiglib.py38
1 files changed, 25 insertions, 13 deletions
diff --git a/kconfiglib.py b/kconfiglib.py
index f6b63f7..ab20ea6 100644
--- a/kconfiglib.py
+++ b/kconfiglib.py
@@ -1388,6 +1388,18 @@ class Kconfig(object):
self._tokens_i += 1
return self._tokens[self._tokens_i]
+ def _expect_sym(self):
+ token = self._next_token()
+ if not isinstance(token, Symbol):
+ self._parse_error("expected symbol")
+ return token
+
+ def _expect_str(self):
+ token = self._next_token()
+ if not isinstance(token, str):
+ self._parse_error("expected string")
+ return token
+
def _peek_token(self):
return self._tokens[self._tokens_i + 1]
@@ -1477,7 +1489,7 @@ class Kconfig(object):
if t0 in (_T_CONFIG, _T_MENUCONFIG):
# The tokenizer allocates Symbol objects for us
- sym = self._next_token()
+ sym = self._expect_sym()
self.defined_syms.append(sym)
node = MenuNode()
@@ -1498,7 +1510,7 @@ class Kconfig(object):
prev_node.next = prev_node = node
elif t0 == _T_SOURCE:
- self._enter_file(self._expand_syms(self._next_token()))
+ self._enter_file(self._expand_syms(self._expect_str()))
prev_node = self._parse_block(None, # end_token
parent,
visible_if_deps,
@@ -1543,7 +1555,7 @@ class Kconfig(object):
node.filename = self._filename
node.linenr = self._linenr
- prompt = self._next_token()
+ prompt = self._expect_str()
self._parse_properties(node, visible_if_deps)
node.prompt = (prompt, node.dep)
@@ -1565,7 +1577,7 @@ class Kconfig(object):
node.filename = self._filename
node.linenr = self._linenr
- prompt = self._next_token()
+ prompt = self._expect_str()
self._parse_properties(node, visible_if_deps)
node.prompt = (prompt, node.dep)
@@ -1607,7 +1619,7 @@ class Kconfig(object):
prev_node.next = prev_node = node
elif t0 == _T_MAINMENU:
- self.top_node.prompt = (self._next_token(), self.y)
+ self.top_node.prompt = (self._expect_str(), self.y)
self.top_node.filename = self._filename
self.top_node.linenr = self._linenr
@@ -1668,7 +1680,7 @@ class Kconfig(object):
node.item.orig_type = _TOKEN_TO_TYPE[t0]
if self._peek_token() is not None:
- prompt = (self._next_token(), self._parse_cond())
+ prompt = (self._expect_str(), self._parse_cond())
elif t0 == _T_DEPENDS:
if not self._check_token(_T_ON):
@@ -1728,13 +1740,13 @@ class Kconfig(object):
if not isinstance(node.item, Symbol):
self._parse_error("only symbols can select")
- selects.append((self._next_token(), self._parse_cond()))
+ selects.append((self._expect_sym(), self._parse_cond()))
elif t0 == _T_IMPLY:
if not isinstance(node.item, Symbol):
self._parse_error("only symbols can imply")
- implies.append((self._next_token(), self._parse_cond()))
+ implies.append((self._expect_sym(), self._parse_cond()))
elif t0 == _T_DEFAULT:
defaults.append((self._parse_expr(False), self._parse_cond()))
@@ -1747,11 +1759,11 @@ class Kconfig(object):
# 'prompt' properties override each other within a single
# definition of a symbol, but additional prompts can be added
# by defining the symbol multiple times
- prompt = (self._next_token(), self._parse_cond())
+ prompt = (self._expect_str(), self._parse_cond())
elif t0 == _T_RANGE:
- ranges.append((self._next_token(),
- self._next_token(),
+ ranges.append((self._expect_sym(),
+ self._expect_sym(),
self._parse_cond()))
elif t0 == _T_OPTION:
@@ -1759,7 +1771,7 @@ class Kconfig(object):
if not self._check_token(_T_EQUAL):
self._parse_error("expected '=' after 'env'")
- env_var = self._next_token()
+ env_var = self._expect_str()
node.item.env_var = env_var
if env_var not in os.environ:
@@ -1968,7 +1980,7 @@ class Kconfig(object):
# Relation
return (_TOKEN_TO_REL[self._next_token()], token,
- self._next_token())
+ self._expect_sym())
if token == _T_NOT:
return (NOT, self._parse_factor(transform_m))