Exemple #1
0
def add_conj(word_type_list):
    new_list = []
    for type in word_type_list:
        new_list.append(type)
        new_type = Literal('و') + type
        new_type.setName('C_' + type.name)
        new_list.append(new_type)
    return (new_list)
Exemple #2
0
quotedArg = (dblQuotedString | sglQuotedString)
quotedArg.setParseAction(removeQuotes)
quotedArg.setName("quotedArg")

plainArgChars = printables.replace('#', '').replace('"', '').replace("'", "")
plainArg = Word(plainArgChars)
plainArg.setName("plainArg")

arguments = Group(ZeroOrMore(quotedArg | plainArg))
arguments = arguments.setResultsName('arguments')
arguments.setName("arguments")

# comment line.
comment = Literal('#') + restOfLine
comment = comment.suppress()
comment.setName('comment')

full_command = (comment | (command + arguments + Optional(comment)))
full_command.setName('full_command')

###

command_list = []  # filled in by namespaces.init_global_dict().

# command/argument handling.


def process_args(args, globals_dict, locals_dict):
    """
    Take a list of string arguments parsed via pyparsing and evaluate
    the special variables ('__*').
Exemple #3
0
 def get_parsing_expr():
     expr = Literal('[') + sts_type + "," + sts_type + Literal(']')    
     expr.setName('Interval')
     return True, expr
Exemple #4
0
quotedArg = ( dblQuotedString | sglQuotedString )
quotedArg.setParseAction(removeQuotes)
quotedArg.setName("quotedArg")

plainArgChars = printables.replace('#', '').replace('"', '').replace("'", "")
plainArg = Word(plainArgChars)
plainArg.setName("plainArg")

arguments = Group(ZeroOrMore(quotedArg | plainArg))
arguments = arguments.setResultsName('arguments')
arguments.setName("arguments")

# comment line.
comment = Literal('#') + restOfLine
comment = comment.suppress()
comment.setName('comment')

full_command = (
    comment
    | (command + arguments + Optional(comment))
    )
full_command.setName('full_command')

###

command_list = []           # filled in by namespaces.init_global_dict().

### command/argument handling.

def process_args(args, globals_dict, locals_dict):
    """
Exemple #5
0
def operator():
    token = Literal("+") | Literal("-") | Literal("/") | Literal("*")
    token.setName("operator")
    return token
class Parser:
    """
    Parse a dbus signature using pyparsing.
    """

    # pylint: disable=too-many-instance-attributes
    # pylint: disable=too-few-public-methods
    # pylint: disable=invalid-name
    def __init__(self):
        """
        Initializer.

        Instantiates the entire parser.

        All productions are public instance attributes.
        """
        self.BYTE = Literal("y")("BYTE")
        self.BOOLEAN = Literal("b")("BOOLEAN")
        self.INT16 = Literal("n")("INT16")
        self.UINT16 = Literal("q")("UINT16")
        self.INT32 = Literal("i")("INT32")
        self.UINT32 = Literal("u")("UINT32")
        self.INT64 = Literal("x")("INT64")
        self.UINT64 = Literal("t")("UINT64")
        self.DOUBLE = Literal("d")("DOUBLE")
        self.UNIX_FD = Literal("h")("UNIX_FD")

        self.STRING = Literal("s")("STRING")
        self.OBJECT_PATH = Literal("o")("OBJECT_PATH")
        self.SIGNATURE = Literal("g")("SIGNATURE")

        self.VARIANT = Literal("v")("VARIANT")

        self.CODE = (
            self.BYTE
            ^ self.BOOLEAN
            ^ self.DOUBLE
            ^ self.INT16
            ^ self.UINT16
            ^ self.INT32
            ^ self.UINT32
            ^ self.INT64
            ^ self.UINT64
            ^ self.UNIX_FD
            ^ self.STRING
            ^ self.OBJECT_PATH
            ^ self.SIGNATURE
            ^ self.VARIANT
        )

        self.COMPLETE = Forward()

        self.DICT_ENTRY = (
            Literal("{") + self.CODE + Forward(self.COMPLETE) + Literal("}")
        )
        self.DICT_ENTRY.setName("DICT_ENTRY")

        self.ARRAY = Literal("a") + (Forward(self.COMPLETE) ^ self.DICT_ENTRY)
        self.ARRAY.setName("ARRAY")

        self.STRUCT = Literal("(") + OneOrMore(Forward(self.COMPLETE)) + Literal(")")
        self.STRUCT.setName("STRUCT")

        self.COMPLETE <<= self.CODE ^ self.ARRAY ^ self.STRUCT
        self.PARSER = ZeroOrMore(self.COMPLETE)
Exemple #7
0
    def __init__(self):
        self.stack = []
        self.dice_roles = []

        self.binary_ops = {
            '+': operator.add,
            '-': operator.sub,
            '*': operator.mul,
            '/': operator.truediv,
            '^': operator.pow,
            '>': operator.gt,
            '>=': operator.ge,
            '<': operator.lt,
            '<=': operator.le,
            '!=': operator.ne,
            '==': operator.eq,
            'or': operator.or_,
            'and': operator.and_
        }

        self.constants = {'PI': math.pi, 'E': math.e}

        self.functions = {
            'sum': lambda *a: sum(a),
            'sin': math.sin,
            'cos': math.cos,
            'tan': math.tan,
            'exp': math.exp,
            'hypot': math.hypot,
            'abs': abs,
            'trunc': int,
            'round': round,
            'sgn': lambda a: -1 if a < -math.e else 1 if a > math.e else 0,
            'multiply': lambda a, b: a * b,
            'all': lambda *a: all(a),
            'any': lambda *a: any(a)
        }

        # lang vars
        e = CaselessKeyword("E")
        pi = CaselessKeyword("PI")
        number = Regex(r"[+-]?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?")
        number.setName('Number')
        ident = Word(alphas, alphanums + "_$")
        ident.setName('Ident')
        dice = Regex(r'\d?[dD]\d+')
        dice.setName('Dice')
        plus, minus, lt, le, gt, ge, eq, ne, or_, and_ = map(
            Literal, ['+', '-', '<', '<=', '>', '>=', '==', '!=', 'or', 'and'])
        bi_op = plus | minus | lt | le | gt | ge | eq | ne | or_ | and_
        bi_op.setName('LowBinaryOp')
        mult = Literal('*')
        div = Literal('/')
        multop = mult | div
        multop.setName('MediumBinaryOp')
        expop = Literal('^')
        expop.setName('HighBinaryOp')
        lpar = Suppress('(')
        rpar = Suppress(')')
        factor = Forward()
        expr = Forward()
        expr_list = delimitedList(Group(expr))
        expr_list.setName('ExpressionList')

        def dice_role(s: str) -> int:
            rolls = DiceRolls(roll=s, results=[])
            s = s.lower()
            if s.startswith('d'):
                count = 1
                limit = s[1:]
            else:
                count, limit = s.lower().split('d')
            count = int(count)
            limit = int(limit)
            for _ in range(0, count):
                roll = random.randint(1, limit)
                rolls.results.append(roll)
            self.dice_roles.append(rolls)
            return rolls.sum

        def insert_fn_arg_count_tuple(t: Tuple) -> None:
            fn = t.pop(0)
            argc = len(t[0])
            t.insert(0, (fn, argc))

        def push(tokens) -> None:
            self.stack.append(tokens[0])

        def push_unary_minus(tokens) -> None:
            if '-' in tokens:
                push('unary -')

        def push_dice(t: ParseResults) -> None:
            self.stack.append(functools.partial(dice_role, t[0]))

        dice.setParseAction(push_dice)

        fn_call = ((ident + lpar - Group(expr_list) +
                    rpar).setParseAction(insert_fn_arg_count_tuple))

        atom = dice | (bi_op[...] + (
            ((fn_call | pi | e | number | ident).setParseAction(push))
            | Group(lpar + expr + rpar)).setParseAction(push_unary_minus))

        factor <<= atom + (expop + factor).setParseAction(push)[...]
        term = factor + (multop + factor).setParseAction(push)[...]
        expr <<= term + (bi_op + term).setParseAction(push)[...]

        self.expr = expr
        expr.setName('Expression')
        factor.setName('Factor')
        atom.setName('Atom')
        term.setName('Term')
class Parser(object):
    """
    Parse a dbus signature using pyparsing.
    """

    # pylint: disable=too-many-instance-attributes
    # pylint: disable=too-few-public-methods

    def __init__(self):
        """
        Initializer.

        Instantiates the entire parser.

        All productions are public instance attributes.
        """
        self.BYTE = Literal('y')('BYTE')
        self.BOOLEAN = Literal('b')('BOOLEAN')
        self.INT16 = Literal('n')('INT16')
        self.UINT16 = Literal('q')('UINT16')
        self.INT32 = Literal('i')('INT32')
        self.UINT32 = Literal('u')('UINT32')
        self.INT64 = Literal('x')('INT64')
        self.UINT64 = Literal('t')('UINT64')
        self.DOUBLE = Literal('d')('DOUBLE')
        self.UNIX_FD = Literal('h')('UNIX_FD')

        self.STRING = Literal('s')('STRING')
        self.OBJECT_PATH = Literal('o')('OBJECT_PATH')
        self.SIGNATURE = Literal('g')('SIGNATURE')

        self.VARIANT = Literal('v')('VARIANT')

        self.CODE = \
           self.BYTE ^ \
           self.BOOLEAN ^ \
           self.DOUBLE ^ \
           self.INT16 ^ \
           self.UINT16 ^ \
           self.INT32 ^ \
           self.UINT32 ^ \
           self.INT64 ^ \
           self.UINT64 ^ \
           self.UNIX_FD ^ \
           self.STRING ^ \
           self.OBJECT_PATH ^ \
           self.SIGNATURE ^ \
           self.VARIANT

        self.COMPLETE = Forward()

        self.DICT_ENTRY = \
           Literal('{') + \
           self.CODE + \
           Forward(self.COMPLETE) + \
           Literal('}')
        self.DICT_ENTRY.setName('DICT_ENTRY')

        self.ARRAY = Literal('a') + (Forward(self.COMPLETE) ^ self.DICT_ENTRY)
        self.ARRAY.setName('ARRAY')

        self.STRUCT = \
           Literal('(') + OneOrMore(Forward(self.COMPLETE)) + Literal(')')
        self.STRUCT.setName('STRUCT')

        self.COMPLETE <<= self.CODE ^ self.ARRAY ^ self.STRUCT
        self.PARSER = ZeroOrMore(self.COMPLETE)
Exemple #9
0
C = oneOf(conjunctions)("stem")
C.setName('C')

PREP = oneOf(prepositions)("stem")
PREP.setName('PREP')

# Particles

GEN = oneOf(genitive)("stem")

GEN_PRO = oneOf(genitive)("stem") + oneOf(poss_suffixes)
GEN_PRO.setName('GEN_PRO')

# انني --> ان + ني
PART_PRO = Literal('ان')("stem") + oneOf(dir_obj_suffixes)
PART_PRO.setName('PART_PRO')

# Nouns

# كتابها --> كتاب + ها
N_PRO = SkipTo(N_SUFF)("stem") + N_SUFF("suffix")
N_PRO.setName('N_PRO')

# لكتابها --> ل + كتاب + ها
PREP_N_PRO = oneOf(prepositions)("prefix") + SkipTo(N_SUFF)("stem") + N_SUFF(
    "suffix")
PREP_N_PRO.setName('PREP_N_PRO')

# الكتاب --> ال + كتاب
DET_N = oneOf(def_art)("prefix") + SkipTo(endOfString)("stem")
DET_N.setName('DET_N')
Exemple #10
0
def model_grammar():
    """
    Construct a parser for winBugs/openBugs/JAGS models.

    Returns *parser*, which is a *pyaparsing.ParserElement, with the
    *parser.parserString()* method.

    Be sure to strip comments from the string prior to parsing, so that the
    grammar can be a little simpler.
    """
    ###factor = Forward().setName('factor') # for right-to-left parsing
    expression = Forward().setName('expr')
    group = Forward().setName('group')

    # start:stop used for indexing and for loops
    inner_range = Optional (expression + Optional(Literal(":") + expression))
    paren_range = Literal("(").suppress() + inner_range + Literal(")").suppress()
    slice =  inner_range | paren_range

    paren_range.setName('(slice)')
    inner_range.setName('slice').setParseAction(
        lambda s,l,t: [(SLICE,(NONE,),(NONE,)) if len(t)==0 else (SLICE,t[0],t[2]) if len(t)>1 else t[0]])

    # indexing
    subscripts = slice + ZeroOrMore(Literal(',').suppress() + slice)
    index = Literal('[').suppress() + subscripts + Literal(']').suppress()
    indexed_variable = variable + Optional(index)

    subscripts.setName('subs')
    index.setName('index')
    indexed_variable.setName('deref').setParseAction(
        lambda s,l,t: [(DEREF,t[0],t[1:])])

    # arithmetic
    muldiv = Literal('*') | Literal('/')
    addsub = Literal('+') | Literal('-')
    ###exponent = Literal('^')

    pars = expression + ZeroOrMore(Literal(',').suppress() + expression)
    function = variable + Literal('(') + Optional(pars) + Literal(')')
    paren = Literal('(') + expression + Literal(')')
    value = constant + Empty()
    atom = Optional("-") + (function | indexed_variable | value | paren )
    ###factor << (atom | ZeroOrMore (exponent + factor))
    ###term = factor + ZeroOrMore(muldiv + factor)
    term = atom + ZeroOrMore(muldiv + atom)
    expression << (term + ZeroOrMore(addsub + term))

    paren.setName('paren').setParseAction(
        lambda s,l,t: [t[1]])
    value.setName('value').setParseAction(
        lambda s,l,t: [(CONST, t[0])])
    function.setName('apply').setParseAction(
        lambda s,l,t: [(APPLY, t[0], t[2:-1])])
    atom.setName('atom').setParseAction(
        lambda s,l,t: [(UNARY, t[0], t[1]) if len(t)>1 else t[0]])
    ###factor.setName('factor').setParseAction(lambda s,l,t: [_binop(t)])
    term.setName('term').setParseAction(
        lambda s,l,t: [_binop(t)])
    expression.setName('expr').setParseAction(
        lambda s,l,t: [_binop(t)])

    # priors look like dname(p1,p2,...) with optional qualifier T(left,right)
    # to set the bounds on the prior.   Since left/right are optional, the
    # function parser can't be used, and we need a special bounds term to
    # parse this form.
    bounds_limit = expression | Empty()
    bounds_function = (variable + Literal('(') + bounds_limit
                           + Literal(',') + bounds_limit + Literal(')'))
    bounds = bounds_function | Empty()
    bounds_limit.setName('limit').setParseAction(
        lambda s,l,t: [(t[0] if len(t) else (NONE,))])
    bounds.setName('trunc').setParseAction(
        lambda s,l,t: [(APPLY,t[0],[t[2],t[4]]) if len(t) else (NONE,)])

    # Funky assignment lhs functions, such as:
    #    logit(t) <- alpha; D(C[5],t) <- PER1 * C[7] - R*kT1*C[1]
    lhs_function = variable + Literal('(') + indexed_variable \
                   + ZeroOrMore(Literal(',') + indexed_variable) + Literal(')')
    lhs_function.setName('f(lhs)').setParseAction(
        lambda s,l,t: [(APPLY, t[0], t[2::2])])

    # statements
    assignment = (lhs_function | indexed_variable) + Literal("<-") + expression
    prior = indexed_variable + Literal("~") + function + bounds
    loop = (Keyword("for")  + Literal("(") + variable + Keyword("in")
            + expression + Literal(":") + expression + Literal(")") + group)

    assignment.setName('assign').setParseAction(
        lambda s,l,t: [(ASSIGN, t[0], t[2])])
    prior.setName('prior').setParseAction(
        lambda s,l,t: [(PRIOR, t[0], t[2], t[3])])
    loop.setName('loop').setParseAction(
        lambda s,l,t: [(LOOP, t[2], t[4], t[6], t[8:])])

    # Note: line breaks are ignored.  That means the following are valid:
    #     statement\n
    #     statement;\n
    #     statement; statement\n
    #     statement statement\n
    #     partial statement\n statement completion
    # Indeed, all of these forms exist in the openBugs example models.
    #comment = Literal("#[^\n]*")
    statement = (loop | assignment | prior) + Optional(Literal(';')).suppress()
    body = ZeroOrMore(statement)
    group << (Literal("{").suppress() + body + Literal("}").suppress())
    model = Keyword("model") + group + StringEnd()

    model.setName('model').setParseAction(
        lambda s,l,t: [(MODEL, t[1:])])

    if 0: # Debug
        all_terms = (
            model, group, body, statement, loop, prior, assignment,
            expression, term, atom, muldiv, addsub,
            value, constant, paren, function, pars,
            indexed_variable, variable, index, subscripts,
            slice, inner_range, paren_range,
        )
        for s in all_terms: s.setDebug(True)
    return model
Exemple #11
0
def operator():
    token = Literal("+") | Literal("-") | Literal("/") | Literal("*")
    token.setName("operator")
    token.setResultsName("operator")
    return token