| #!/usr/bin/env python
import os, sys
import pprint
def import_module(name, path):
    import imp
    try:
        mod_fp, mod_path, mod_desc  = imp.find_module(name, [path])
        mod = getattr( imp.load_module(name, mod_fp, mod_path, mod_desc), name )
    except ImportError as exc:
        mod = None
        sys.stderr.write("Error: failed to import module ({})".format(exc))
    finally:
        if mod_fp: mod_fp.close()
    return mod
# import the GrammarTemplate.py engine (as a) module, probably you will want to place this in another dir/package
GrammarTemplate = import_module('GrammarTemplate', os.path.join(os.path.dirname(__file__), '../src/python/'))
if not GrammarTemplate:
    print ('Could not load the GrammarTemplate Module')
    sys.exit(1)
else:    
    pass
def echo( s='' ):
    print (s)
echo('GrammarTemplate.VERSION = ' + GrammarTemplate.VERSION)
echo( )
#
#    i.e: 
#    foreach "expression:terms" as "term":
#        foreach "term:factors" as "factor":
#            ..
#    
#    here an :EXPR template is defined which itself uses (anonymous) sub-templates
#    it is equivalent to (expand sub-templates to distinct):
#
#<:FACTOR>:=[<lhs>[ <?op> <rhs|NULL>]]
#
#<:TERM>:=[(<factor:FACTOR>[ AND <*factor:FACTOR>])]
#
#<:EXPR>:=[<term:TERM>[ OR <*term:TERM>]]
#
#<expression:EXPR>
#<expression2:EXPR>
#
#
tpl = "<:EXPR>:=[<term>:=[(<factor>:=[<globalNegation:NEG><lhs>[ <?op:OP> <rhs|NULL>]][ AND <*factor>])][ OR <*term>]]<expression:EXPR>\n<expression2:EXPR>"
def op_func( val, *rest ):
    return '<>' if '!=' == val else val
def neg_func( val, *rest ):
    return 'NOT ' if val else ''
    
expr = GrammarTemplate(tpl)
GrammarTemplate.fnGlobal['NEG'] = neg_func
expr.fn['OP'] = op_func
echo("input template:")
echo(tpl)
echo( )
echo("output:")
echo(expr.render({
    'globalNegation': True,
    'expression'  : [
        # term
        [
            # factor
            {'lhs': 1, 'op': '=', 'rhs': 1},
            # factor
            {'lhs': 1, 'op': '=', 'rhs': 2},
            # factor
            {'lhs': 1, 'op': '=', 'rhs': 3}
        ],
        # term
        [
            # factor
            {'lhs': 1, 'op': '<', 'rhs': 1},
            # factor
            {'lhs': 1, 'op': '<', 'rhs': 2},
            # factor
            {'lhs': 1, 'op': '<', 'rhs': 3}
        ],
        # term
        [
            # factor
            {'lhs': 1, 'op': '>', 'rhs': 1},
            # factor
            {'lhs': 1, 'op': '>', 'rhs': 2},
            # factor
            {'lhs': 1, 'op': '>', 'rhs': 3}
        ]
    ],
    'expression2'  : [
        # term
        [
            # factor
            {'lhs': 2, 'op': '=', 'rhs': 1},
            # factor
            {'lhs': 2, 'op': '=', 'rhs': 2},
            # factor
            {'lhs': 2, 'op': '=', 'rhs': 3}
        ],
        # term
        [
            # factor
            {'lhs': 2, 'op': '<', 'rhs': 1},
            # factor
            {'lhs': 2, 'op': '<', 'rhs': 2},
            # factor
            {'lhs': 2, 'op': '<', 'rhs': 3}
        ],
        # term
        [
            # factor
            {'lhs': 2, 'op': '>', 'rhs': 1},
            # factor
            {'lhs': 2, 'op': '>', 'rhs': 2},
            # factor
            {'lhs': 2, 'op': '>', 'rhs': 3}
        ],
        # term
        [
            # factor
            {'lhs': 3},
            # factor
            {'lhs': 3, 'op': '!='}
        ]
    ]
}))
 |