def test_04_file_error(self): """ Test ERROR """ with self.assertRaises(error.Diagnostic) as pe: T = grammar.from_file(os.getcwd() + "/tests/bnf/error_bracket.bnf", 'source') self.assertTrue(pe.exception, "Can't detect error in BNF") self.assertEqual(pe.exception.logs[0].msg, "Expected ']'", "Bad message in Error") self.assertEqual(pe.exception.logs[0].location.line, 2, "Bad line") self.assertEqual(pe.exception.logs[0].location.col, 7, "Bad col") with self.assertRaises(error.Diagnostic) as pe: T = grammar.from_file( os.getcwd() + "/tests/bnf/error_bracket2.bnf", 'source') self.assertTrue(pe.exception, "Can't detect error in BNF") self.assertEqual(pe.exception.logs[0].msg, "Expected '['", "Bad message in Error") self.assertEqual(pe.exception.logs[0].location.line, 2, "Bad line") self.assertEqual(pe.exception.logs[0].location.col, 1, "Bad col") with self.assertRaises(error.Diagnostic) as pe: T = grammar.from_file(os.getcwd() + "/tests/bnf/error_rule.bnf", 'source') self.assertTrue(pe.exception, "Can't detect error in BNF") self.assertEqual(pe.exception.logs[0].msg, "Expected '='", "Bad message in Error") self.assertEqual(pe.exception.logs[0].location.line, 2, "Bad line") self.assertEqual(pe.exception.logs[0].location.col, 1, "Bad col") with self.assertRaises(error.Diagnostic) as pe: T = grammar.from_file( os.getcwd() + "/tests/bnf/error_bracket3.bnf", 'source') self.assertTrue(pe.exception, "Can't detect error in BNF") self.assertEqual(pe.exception.logs[0].msg, "Expected sequences", "Bad message in Error") self.assertEqual(pe.exception.logs[0].location.line, 1, "Bad line") self.assertEqual(pe.exception.logs[0].location.col, 8, "Bad col") with self.assertRaises(error.Diagnostic) as pe: T = grammar.from_file(os.getcwd() + "/tests/bnf/error_empty.bnf", 'source') self.assertTrue(pe.exception, "Can't detect error in BNF") self.assertEqual(pe.exception.logs[0].msg, "Parse error in 'directive' in EBNF bnf", "Bad message in Error") self.assertEqual(pe.exception.logs[0].location.line, 1, "Bad line") self.assertEqual(pe.exception.logs[0].location.col, 7, "Bad col")
def to_tl4t(self): return fmt.sep("", [self.call_expr.to_tl4t(), self.p[0].to_tl4t()]) class Paren(Expr): def __init__(self, expr: Expr): super().__init__(None, [expr]) def to_tl4t(self): return fmt.block("(", ")", [self.p[0].to_tl4t()]) ### PARSING TL4T = grammar.from_file(os.getcwd() + "/tests/bnf/tl4t.bnf", 'source') # AST NODES @meta.hook(TL4T) def info(self): n = Node() n.info = LocationInfo.from_stream(self._stream, is_error=self.from_string) return n @meta.hook(TL4T) def new_declvar(self, ast, n, t, e, i): typ = None txt = self.value(t)
def to_tl4t(self): return fmt.sep("", [self.call_expr.to_tl4t(), self.p[0].to_tl4t()]) class Paren(Expr): def __init__(self, expr: Expr): super().__init__(None, [expr]) def to_tl4t(self): return fmt.block("(", ")", [self.p[0].to_tl4t()]) ### PARSING TL4T = grammar.from_file(os.getcwd() + "/tests/bnf/tl4t.bnf", 'source') # AST NODES @meta.hook(TL4T) def info(self, n): n.info = LocationInfo.from_stream(self._stream, is_error=self.from_string) return True @meta.hook(TL4T) def new_declvar(self, ast, n, t, e, i): typ = None txt = self.value(t)
def test_02_json(self): """ Test JSON """ JSON = grammar.from_file(os.getcwd() + "/tests/bnf/json.bnf", 'json') # add hook to the dynamically created base class @meta.hook(JSON) def is_num(self, ast, n): ast.node = float(self.value(n)) return True @meta.hook(JSON) def is_str(self, ast, s): ast.node = self.value(s).strip('"') return True @meta.hook(JSON) def is_bool(self, ast, b): bval = self.value(b) if bval == "true": ast.node = True if bval == "false": ast.node = False return True @meta.hook(JSON) def is_none(self, ast): ast.node = None return True @meta.hook(JSON) def is_pair(self, ast, s, v): ast.node = (self.value(s).strip('"'), v.node) return True @meta.hook(JSON) def is_array(self, ast): ast.node = [] return True @meta.hook(JSON) def add_item(self, ast, item): ast.node.append(item.node) return True @meta.hook(JSON) def is_dict(self, ast): ast.node = {} return True @meta.hook(JSON) def add_kv(self, ast, item): ast.node[item.node[0]] = item.node[1] return True json = JSON() res = json.parse('{"test":12}') self.assertEqual(res.node['test'], 12) res = json.parse('{"test":12,"puf":[1,2,3]}') self.assertEqual(res.node['puf'][1], 2) res = json.parse('{"test":12,"puf":[1,2,3],"obj":{"flags":true}}') self.assertTrue(res.node['obj']['flags'])
def test_04_file_error(self): """ Test ERROR """ with self.assertRaises(error.Diagnostic) as pe: T = grammar.from_file( os.getcwd() + "/tests/bnf/error_bracket.bnf", 'source' ) self.assertTrue(pe.exception, "Can't detect error in BNF") self.assertEqual( pe.exception.logs[0].msg, "Expected ']'", "Bad message in Error" ) self.assertEqual(pe.exception.logs[0].location.line, 2, "Bad line") self.assertEqual(pe.exception.logs[0].location.col, 7, "Bad col") with self.assertRaises(error.Diagnostic) as pe: T = grammar.from_file( os.getcwd() + "/tests/bnf/error_bracket2.bnf", 'source' ) self.assertTrue(pe.exception, "Can't detect error in BNF") self.assertEqual( pe.exception.logs[0].msg, "Expected '['", "Bad message in Error" ) self.assertEqual(pe.exception.logs[0].location.line, 2, "Bad line") self.assertEqual(pe.exception.logs[0].location.col, 1, "Bad col") with self.assertRaises(error.Diagnostic) as pe: T = grammar.from_file( os.getcwd() + "/tests/bnf/error_rule.bnf", 'source' ) self.assertTrue(pe.exception, "Can't detect error in BNF") self.assertEqual( pe.exception.logs[0].msg, "Expected '='", "Bad message in Error" ) self.assertEqual(pe.exception.logs[0].location.line, 2, "Bad line") self.assertEqual(pe.exception.logs[0].location.col, 1, "Bad col") with self.assertRaises(error.Diagnostic) as pe: T = grammar.from_file( os.getcwd() + "/tests/bnf/error_bracket3.bnf", 'source' ) self.assertTrue(pe.exception, "Can't detect error in BNF") self.assertEqual( pe.exception.logs[0].msg, "Expected sequences", "Bad message in Error" ) self.assertEqual(pe.exception.logs[0].location.line, 1, "Bad line") self.assertEqual(pe.exception.logs[0].location.col, 8, "Bad col") with self.assertRaises(error.Diagnostic) as pe: T = grammar.from_file( os.getcwd() + "/tests/bnf/error_empty.bnf", 'source' ) self.assertTrue(pe.exception, "Can't detect error in BNF") self.assertEqual( pe.exception.logs[0].msg, "Parse error in 'directive' in EBNF bnf", "Bad message in Error" ) self.assertEqual(pe.exception.logs[0].location.line, 1, "Bad line") self.assertEqual(pe.exception.logs[0].location.col, 7, "Bad col")