[feaLib] Move block parsing to a separate method

We will soon support additional blocks beyond `feature`,
and keeping this refactoring separate from new functionality
makes it easier for code reviewers to follow the changes.
This commit is contained in:
Sascha Brawer 2015-08-11 10:19:39 +02:00
parent 1f2fadc864
commit 6d7540ecac
3 changed files with 11 additions and 10 deletions

View File

@ -8,9 +8,9 @@ class FeatureFile(object):
class FeatureBlock(object): class FeatureBlock(object):
def __init__(self, location, tag): def __init__(self, location, name):
self.location = location self.location = location
self.tag = tag self.name = name
self.statements = [] self.statements = []

View File

@ -43,7 +43,7 @@ class Parser(object):
elif self.is_cur_keyword_("languagesystem"): elif self.is_cur_keyword_("languagesystem"):
self.parse_languagesystem_() self.parse_languagesystem_()
elif self.is_cur_keyword_("feature"): elif self.is_cur_keyword_("feature"):
self.parse_feature_block_() statements.append(self.parse_feature_block_())
else: else:
raise ParserError("Expected languagesystem, feature, or " raise ParserError("Expected languagesystem, feature, or "
"glyph class definition", "glyph class definition",
@ -214,15 +214,16 @@ class Parser(object):
location = self.cur_token_location_ location = self.cur_token_location_
tag = self.expect_tag_() tag = self.expect_tag_()
vertical = (tag == "vkrn") vertical = (tag == "vkrn")
block = ast.FeatureBlock(location, tag)
self.parse_block_(block, vertical)
return block
def parse_block_(self, block, vertical):
self.expect_symbol_("{") self.expect_symbol_("{")
for symtab in self.symbol_tables_: for symtab in self.symbol_tables_:
symtab.enter_scope() symtab.enter_scope()
block = ast.FeatureBlock(location, tag)
self.doc_.statements.append(block)
statements = block.statements statements = block.statements
while self.next_token_ != "}": while self.next_token_ != "}":
self.advance_lexer_() self.advance_lexer_()
if self.cur_token_type_ is Lexer.GLYPHCLASS: if self.cur_token_type_ is Lexer.GLYPHCLASS:
@ -248,9 +249,9 @@ class Parser(object):
for symtab in self.symbol_tables_: for symtab in self.symbol_tables_:
symtab.exit_scope() symtab.exit_scope()
endtag = self.expect_tag_() name = self.expect_name_()
if tag != endtag: if name != block.name.strip():
raise ParserError("Expected \"%s\"" % tag.strip(), raise ParserError("Expected \"%s\"" % block.name.strip(),
self.cur_token_location_) self.cur_token_location_)
self.expect_symbol_(";") self.expect_symbol_(";")

View File

@ -286,7 +286,7 @@ class ParserTest(unittest.TestCase):
def test_feature_block(self): def test_feature_block(self):
[liga] = self.parse("feature liga {} liga;").statements [liga] = self.parse("feature liga {} liga;").statements
self.assertEqual(liga.tag, "liga") self.assertEqual(liga.name, "liga")
def setUp(self): def setUp(self):
self.tempdir = None self.tempdir = None