mirror of
ssh://git.janware.com/srv/git/janware/proj/jw-python
synced 2026-01-15 18:03:31 +01:00
79 lines
2 KiB
Python
79 lines
2 KiB
Python
|
|
#!/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')
|