#!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import print_function import argparse import sys import re import textwrap from collections import OrderedDict from abc import abstractmethod import jwutils from jwutils.log import * from jwutils import grammar base = 'grammartest' mip = '_JW_PYTHON_' + base + base.upper() namespace = base def create_grammartest_ebnf(grammar): print(jwutils.grammar.create_ebnf(grammar)) def create_grammartest_y(grammar): print(jwutils.grammar.create_yacc(grammar)) def create_grammartest_l(grammar): print(jwutils.grammar.create_lex(grammar)) def create_include_grammartest_h(grammar): print(jwutils.grammar.create_header(grammar, mip=mip, namespace=namespace)) class GrammarCmd(jwutils.grammar.GrammarCmd): def __init__(self, name, help): super(GrammarCmd, self).__init__(name, help=help) @abstractmethod def _run(self, grammar): pass def add_parser(self, parsers): p = super(GrammarCmd, self).add_parser(parsers) return p def run(self, args): with open(args.input, 'r') as infile: contents = infile.read() grammar = jwutils.grammar.grammar_parse_ebnf(contents) grammar = super(GrammarCmd, self).processGrammar(args, grammar) self._run(args, grammar) class CmdCreate(GrammarCmd): def __init__(self): super(CmdCreate, self).__init__("create", help="Create a file") def add_parser(self, parsers): p = super(CmdCreate, self).add_parser(parsers) p.add_argument("output", help="output file") return p def _run(self, args, grammar): cmd = getattr(sys.modules[__name__], 'create_' + re.sub(r'[-./]', '_', args.output)) cmd(grammar) class CmdCheck(GrammarCmd): def __init__(self): super(CmdCheck, self).__init__("check", help="Check grammar") def add_parser(self, parsers): p = super(CmdCheck, self).add_parser(parsers) return p def _run(self, args, grammar): pass jwutils.run_sub_commands('generate Test parser files')