Esempio n. 1
0
def grammar(**kwargs):
    return adjective.grammar(**kwargs) | preposition.grammar(**kwargs) | {
        # Raw nouns
        Rule("NOUN^", [NounParser(is_plural=False)], passthru),

        Rule("NOUNS^", [NounParser(is_plural=True)], passthru),

        # Nouns without prepositions
        Rule("NOUN", [RuleRef('NOUN^')], passthru),

        Rule("NOUNS", [RuleRef('NOUNS^')], passthru),

        # Nouns with prepositions (the car of (the owner of the building))
        Rule("NOUN", [RuleRef('NOUN^'), RuleRef('PP')],
            lambda state, data: data[1] + Interpretation(local=data[0].local.with_preposition_phrase(data[1].local))),

        Rule("NOUNS", [RuleRef('NOUNS^'), RuleRef('PP')],
            lambda state, data: data[1] + Interpretation(local=data[0].local.with_preposition_phrase(data[1].local))),
        
        Rule("NOUN", [RuleRef('ADJECTIVE'), RuleRef('NOUN')],
            lambda state, data: data[1] + Interpretation(local=data[1].local.with_adjective(data[0].local))),

        Rule("NOUNS", [RuleRef('ADJECTIVE'), RuleRef('NOUNS')],
            lambda state, data: data[1] + Interpretation(local=data[1].local.with_adjective(data[0].local))),

        Rule("NOUN*", [RuleRef('NOUN')], passthru),
        Rule("NOUN*", [RuleRef('NOUNS')], passthru),
    }
Esempio n. 2
0
def grammar(**kwargs):
    return {
        Rule("VERB_INF", [VerbParser(r'^\w+([^e]ed|ing|able)$', negate=True)],
             passthru),
        Rule("VERB_PP", [VerbParser(r'^\w+([^e]ed)$', negate=False)],
             passthru),
        Rule("VERB_BE", [VerbParser(r'be', negate=False)], passthru),
    }
Esempio n. 3
0
def grammar(**kwargs):
    return recursive.grammar(**kwargs) | {
        Rule('SPECIFIC_CLAIM', [RuleRef('BLOB')], blob_specific_claim),
        Rule('CONDITIONAL_CLAIM', [RuleRef('BLOB')], blob_conditional_claim),
        Rule('BLOB_WORD', [Expression(r'^(?!because|but|except)$')],
             lambda state, data: data[0].local),
        Rule('BLOB', [RuleRef('BLOB_WORD')], lambda state, data: [data[0]]),
        Rule('BLOB', [RuleRef('BLOB'), RuleRef('BLOB_WORD')],
             lambda state, data: data[0] + [data[1]]),
    }
Esempio n. 4
0
def grammar(**kwargs):
    return category.grammar(**kwargs) | prototype.grammar(**kwargs) | verb.grammar(**kwargs) | {
        Rule('CATEGORY', [Expression(r'^not?$'), RuleRef('CATEGORY')],
            Negation.from_rule),

        Rule('PROTOTYPE', [Expression(r'^not$'), RuleRef('PROTOTYPE')],
            Negation.from_rule),

        Rule('PROTOTYPES', [Expression(r'^not$'), RuleRef('PROTOTYPES')],
            Negation.from_rule),

        Rule('VERB_INF', [Expression(r'^not$'), RuleRef('VERB_INF')],
            Negation.from_rule)
    }
Esempio n. 5
0
def grammar(**kwargs):
    return noun.grammar(**kwargs) | {
        Rule(
            "PROTOTYPE", [Expression(r'^every|an?$'),
                          RuleRef("NOUN")],
            lambda state, data: data[1] + Interpretation(local=Prototype(
                data[1].local, article=data[0].local))),
        Rule(
            "PROTOTYPES", [RuleRef("NOUNS")], lambda state, data: data[0] +
            Interpretation(local=Prototype(data[0].local))),
        Rule(
            "PROTOTYPES",
            [Expression(r'^all|most|many|some$'),
             RuleRef("NOUNS")], lambda state, data: data[0] + Interpretation(
                 local=Prototype(data[1].local, article=data[0].local))),
        Rule("PROTOTYPE*", [RuleRef("PROTOTYPE")], passthru),
        Rule("PROTOTYPE*", [RuleRef("PROTOTYPES")], passthru),
    }
Esempio n. 6
0
def grammar(**kwargs):
    return {
        Rule('PREPOSITION', [PrepositionSymbol()], passthru),
        Rule(
            'PP', [RuleRef('PREPOSITION'),
                   RuleRef('INSTANCE*')],
            lambda state, data: data[1] + Interpretation(
                local=PrepositionPhrase(data[0].local, data[1].local))),
        Rule(
            'PP', [RuleRef('PREPOSITION'),
                   RuleRef('PROTOTYPE*')],
            lambda state, data: data[1] + Interpretation(
                local=PrepositionPhrase(data[0].local, data[1].local))),
        Rule(
            'PP', [RuleRef('PREPOSITION'),
                   RuleRef('CATEGORY')],
            lambda state, data: data[1] + Interpretation(
                local=PrepositionPhrase(data[0].local, data[1].local))),
    }
Esempio n. 7
0
def and_rules(name: str, singleton: str, accept_singular: bool = False, first_singleton: Optional[str] = None, last_singleton: Optional[str] = None) -> Set[Rule]:
    """
    Creates a mini-grammar of rules that are needed to parse 'A and B',
    'A, B and C', 'A, B, C and D', etc. where A, B, C and D all are parseable
    using the rule name passed using the singleton argument.

    Grammar:

        <As> ::= A_helper `and' A_last
        <A_helper> ::= A_helper `,' A
        <A_helper> ::= A_first
        <As> ::= A
    
    """
    if last_singleton is None:
        last_singleton = singleton

    if first_singleton is None:
        first_singleton = singleton

    helper = name + "_"
    
    rules = {
        # _ and C
        Rule(name, [RuleRef(helper), Literal('and'), RuleRef(last_singleton)],
            lambda state, data: data[0] + data[2] + Interpretation(local=data[0].local | OrderedSet([data[2].local]))),

        # A, B # (allows for 'A, B and C')
        Rule(helper, [RuleRef(helper), Literal(','), RuleRef(singleton)],
            lambda state, data: data[0] + data[2] + Interpretation(local=data[0].local | OrderedSet([data[2].local]))),

        # A (allows for 'A and B')
        Rule(helper, [RuleRef(first_singleton)],
            lambda state, data: data[0] + Interpretation(local=OrderedSet([data[0].local])))
    }

    if accept_singular:
        rules |= {
            Rule(name, [RuleRef(singleton)],
                lambda state, data: data[0] + Interpretation(local=OrderedSet([data[0].local])))
        }

    return rules
Esempio n. 8
0
    def rule(self, name, symbols):
        previous_frame = inspect.currentframe().f_back
        (filename, line_number, function_name, lines,
         index) = inspect.getframeinfo(previous_frame)
        rule = Rule(name, symbols, file=filename, line=line_number)
        self.rules.append(rule)

        def wrapper(callback):
            rule.callback = lambda state, data: callback(*data)
            return callback

        return wrapper
Esempio n. 9
0
def test_claims():
    grammar = general.grammar | specific.grammar | negation.grammar | {
        Rule('ARGUMENT', [RuleRef('GENERAL_CLAIM')], passthru),
        Rule('ARGUMENT', [RuleRef('SPECIFIC_CLAIM')], passthru),
    }

    sentences = map(tokenize, [
        'Tweety is a bird',
        'birds can fly',
        'the birds can fly',
        'Tweety can fly',
        'Tweety can not fly',
        'Tweety and Birdy are pretty',
    ])

    # Uncomment this call to see the parse trees.
    # override_callbacks(grammar)

    parser = Parser(grammar, 'ARGUMENT')

    test(parser, sentences)
Esempio n. 10
0
def grammar(anaphora=True, **kwargs):
    if anaphora:
        singular = Instance
        plural = GroupInstance
    else:
        singular = DumbInstance
        plural = DumbGroupInstance

    return name.grammar(**kwargs) | noun.grammar(**kwargs) | pronoun.grammar(**kwargs) | {
        # Singular
        Rule("INSTANCE", [RuleRef("PRONOUN")],
            singular.from_pronoun_rule),

        Rule("INSTANCE", [RuleRef("NAME")],
            singular.from_name_rule),

        Rule("INSTANCE", [Expression(r"^[Tt]he$"), RuleRef("NOUN")],
            singular.from_noun_rule),

        Rule("INSTANCE", [Expression(r"^[Hh]is|[Hh]er|[Tt]heir$"), RuleRef("NOUN")],
            singular.from_noun_rule),

        # Plural
        Rule("INSTANCES", [RuleRef("PRONOUNS")],
            plural.from_pronoun_rule),

        Rule("INSTANCES", [RuleRef("NAMES")],
            plural.from_names_rule),

        Rule("INSTANCES", [Expression(r"^[Tt]he$"), RuleRef("NOUNS")],
            plural.from_noun_rule),

        Rule("INSTANCES", [Expression(r"^[Hh]is|[Hh]er|[Tt]heir$"), RuleRef("NOUNS")],
            plural.from_noun_rule),

        # Shortcuts
        Rule("INSTANCE*", [RuleRef("INSTANCE")], passthru),

        Rule("INSTANCE*", [RuleRef("INSTANCES")], passthru),
    }
Esempio n. 11
0
    def apply(self, vpc):
        """
        returns a list of new security groups that will be added
        """
        assert vpc is not None
        # make sure we're up to date
        self.reload_remote_groups()

        vpc_groups = self.vpc_groups(vpc)
        self._apply_groups(vpc)

        # reloads groups from AWS, the authority
        self.reload_remote_groups()
        vpc_groups = self.vpc_groups(vpc)


        groups = {k.name:k for k in vpc_groups}

        for x,y in self.config.items():
            # process 1 security group at a time
            group = groups[x]
            if y.get('rules'):
                # apply all rule changes
                rules = [Rule.parse(rule) for rule in y.get('rules')]
                rules = list(itertools.chain(*rules))

                rules = self.filter_existing_rules(rules, group)
                # need to use chain because multiple rules can be created for a single stanza
                for rule in rules:
                    group_name = groups.get(rule.group_name, None)
                    if group_name and rule.address:
                        raise Exception("Can't auth an address and a group")

                    logger.debug("Authorizing %s %s %s to address:%s name:%s", rule.protocol,
                                 rule.from_port, rule.to_port, rule.address, rule.group_name)

                    group_to_authorize = groups.get(rule.group_name, None)

                    try:
                        group.authorize(rule.protocol,
                                    rule.from_port,
                                    rule.to_port,
                                    rule.address,
                                    group_to_authorize, None)
                    except Exception as e:
                        print "could not authorize group %s" % group_to_authorize
                        raise

                # apply rules

        return self
Esempio n. 12
0
def grammar(**kwargs):
    return {
        # Singular
        Rule("PRONOUN", [Expression(r'^[Hh]e$')], passthru),
        Rule("PRONOUN", [Expression(r'^[Ss]he$')], passthru),
        Rule("PRONOUN", [Expression(r'^[Ii]t$')], passthru),

        # Plural
        Rule("PRONOUNS", [Expression(r'^[Tt]hey$')], passthru),

        # Undetermined
        Rule("PRONOUN", [Expression(r'^[Ss]omeone$')], passthru),
        Rule("PRONOUN", [Expression(r'^[Ss]omething$')], passthru),
    }
Esempio n. 13
0
def grammar(**kwargs):
    return and_rules('NAMES', 'NAME', accept_singular=False) | {
        Rule("NAME", [NameParser()], passthru)
    }
Esempio n. 14
0
def grammar(**kwargs):
    return and_rules('SPECIFIC_CLAIMS', 'SPECIFIC_CLAIM', accept_singular=True) \
    | and_rules('SPECIFIC_CLAIMS_CONDITIONAL_FIRST', 'SPECIFIC_CLAIM', first_singleton='CONDITIONAL_CLAIM') \
    | and_rules('SPECIFIC_CLAIMS_CONDITIONAL_LAST', 'SPECIFIC_CLAIM', last_singleton='CONDITIONAL_CLAIM') \
    | {
        Rule('ARGUMENT', [RuleRef('SENTENCE')],
            lambda state, data: data[0]),

        Rule('ARGUMENT', [RuleRef('ARGUMENT'), RuleRef('SENTENCE')],
            lambda state, data: data[0] + data[1]),


        Rule('SENTENCE', [RuleRef('SUPPORTED_CLAIM'), Literal('.')],
            lambda state, data: data[0]),

        Rule('SENTENCE', [RuleRef('ATTACKED_CLAIM'), Literal('.')],
            lambda state, data: data[0]),


        Rule('SUPPORTED_CLAIM', [RuleRef('SPECIFIC_CLAIM'), Literal('because'), RuleRef('SPECIFIC_CLAIMS')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.SUPPORT, data[0].local, specifics=data[2].local), local=data[0].local)),

        Rule('SUPPORTED_CLAIM', [RuleRef('SUPPORTED_CLAIM_WITH_WARRANT')],
            lambda state, data: data[0]),

        Rule('SUPPORTED_CLAIM_WITH_WARRANT', [RuleRef('SPECIFIC_CLAIM'), Literal('because'), RuleRef('SPECIFIC_CLAIMS_CONDITIONAL_FIRST')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.SUPPORT, data[0].local, general=data[2].local[0], specifics=data[2].local[1:]), local=data[0].local)),

        Rule('SUPPORTED_CLAIM_WITH_WARRANT', [RuleRef('SPECIFIC_CLAIM'), Literal('because'), RuleRef('SPECIFIC_CLAIMS_CONDITIONAL_LAST')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.SUPPORT, data[0].local, general=data[2].local[-1], specifics=data[2].local[:-1]), local=data[0].local)),


        Rule('ATTACKED_CLAIM', [RuleRef('SPECIFIC_CLAIM'), Expression(r'^but|except$'), RuleRef('SPECIFIC_CLAIMS')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.ATTACK, data[0].local, specifics=data[2].local), local=data[0].local)),

        Rule('ATTACKED_CLAIM', [RuleRef('ATTACKED_CLAIM_WITH_WARRANT')],
            lambda state, data: data[0]),

        Rule('ATTACKED_CLAIM_WITH_WARRANT', [RuleRef('SPECIFIC_CLAIM'), Expression(r'^but|except$'), RuleRef('SPECIFIC_CLAIMS_CONDITIONAL_FIRST')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.ATTACK, data[0].local, general=data[2].local[0], specifics=data[2].local[1:]), local=data[0].local)),

        Rule('ATTACKED_CLAIM_WITH_WARRANT', [RuleRef('SPECIFIC_CLAIM'), Expression(r'^but|except$'), RuleRef('SPECIFIC_CLAIMS_CONDITIONAL_LAST')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.ATTACK, data[0].local, general=data[2].local[-1], specifics=data[2].local[:-1]), local=data[0].local)),

        # Experimental, don't know if I want this
        # Rule('SUPPORTED_CLAIM', [RuleRef('SPECIFIC_CLAIM'), Literal('because'), RuleRef('CONDITIONAL_CLAIM')],
        #     lambda state, data: data[0] + data[2] + assume(data[0].local, data[2].local)),

        # Attacking a warrant?
        Rule('SUPPORTED_CLAIM', [RuleRef('SUPPORTED_CLAIM'), Expression(r'^but|except$'), RuleRef('SPECIFIC_CLAIMS')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.ATTACK, data[0].local, specifics=data[2].local))),

        Rule('SUPPORTED_CLAIM', [RuleRef('SUPPORTED_CLAIM_WITH_WARRANT'), Expression(r'^but|except$'), RuleRef('SPECIFIC_CLAIMS')],
            lambda state, data: data[0] + data[2] + Interpretation(argument=relation(Relation.ATTACK, warrant_relation(data[0]), specifics=data[2].local)))
    }
Esempio n. 15
0
 def add_rule(self, symbol, expansion):
     assert isinstance(symbol, Symbol)
     for s in expansion:
         assert isinstance(s, Symbol)
     self.rules.append(Rule(symbol, expansion))
Esempio n. 16
0
def post_multiple_rule(env, loc, lhs, block):
    seq = []
    for rhs, attribute, mapping in block:
        seq.append(Rule(lhs.value, rhs, attribute, mapping))
    return seq
Esempio n. 17
0
special => special(symbol string): symbol colon:":" string
"""
from parser import Parser, Rule
import sys

symboltab = {
        '=': 'equals',
        '=>': 'arrow',
        ':': 'colon',
        '(': 'lp',
        ')': 'rp',
}

grammar = [
    # statement level syntax
    Rule('file', ['statement'],
        'pass'),
    Rule('file', ['file', 'newline', 'statement'],
        'concat', [0, 2]),

    Rule('statement', ['symbol', 'arrow', 'rule'],
        'single_rule', [0, 2]),
    Rule('statement', ['symbol', 'arrow', 'indent', 'block', 'dedent'],
        'multiple_rule', [0, 3]),
    Rule('statement', ['special'],
        'empty_list', []),

    Rule('block', ['rule'],
        'first'),
    Rule('block', ['block', 'newline', 'rule'], 
        'append', [0, 2]),
Esempio n. 18
0
    def rule(self, name, symbols):
        previous_frame = inspect.currentframe().f_back
        (filename, line_number, function_name, lines,
         index) = inspect.getframeinfo(previous_frame)
        rule = Rule(name, symbols, file=filename, line=line_number)
        self.rules.append(rule)

        def wrapper(callback):
            rule.callback = lambda state, data: callback(*data)
            return callback

        return wrapper


en_grammar = Grammar([
    Rule('name', [Tag('NNP')], merge),
    Rule('name', [RuleRef('name'), Tag('NNP')], merge),  # longer names
    Rule('name', [RuleRef('name'), Tag('NNPS')], merge),  # Catholic Swedes
    Rule('name', [Literal('Tweety')], merge),
    Rule('instance', [RuleRef('name')],
         lambda state, data: Entity(name=data[0])),
    Rule(
        'instance',
        [Tag('PRP')],  # "I"
        lambda state, data: Entity(pronoun=data[0])),
    Rule('instance',
         [RuleRef('def-dt'),
          RuleRef('adjectives?'),
          RuleRef('noun')],
         lambda state, data: Entity(noun=data[0] + data[1] + data[2])),
    Rule(
Esempio n. 19
0
def grammar(**kwargs):
    return {Rule("ADJECTIVE", [Expression(r"^\w+$")], passthru)}
Esempio n. 20
0
    def __init__(self, pattern: str, negate=False) -> None:
        self.pattern = re.compile(pattern)
        self.negate = negate

    def test(self, literal: str, position: int, state: State) -> bool:
        accept = re.match(self.pattern, literal) is not None
        return not accept if self.negate else accept

    def __repr__(self):
        return "ReSymbol({}{!r})".format("¬" if self.negate else "", self.pattern)


rules = list(parse_rule(expression, callback) for expression, callback in grammar)

rules += [
    Rule("NOUN", [NounSymbol(plural=False)], passthru),
    Rule("NOUNS", [NounSymbol(plural=True)], passthru),
    Rule("NAME", [NameSymbol()], lambda state, data: data[0]),
    Rule("PRONOUN", [PronounSymbol()], lambda state, data: data[0]),
    Rule("VERB_INF", [ReSymbol(r'^\w+([^e]ed|ing|able)$', negate=True)], lambda state, data: Verb(data[0])),
    Rule("VERB_NOUN", [ReSymbol(r'^\w+([^e]ed|ing|able)$')], lambda state, data: Verb(data[0]))
]

start = "START"

Operation = ArgumentativeDiscourseUnit  # for compatibility for now

if __name__ == '__main__':
    try:
        for sentence in sentences[:4]:
            parser = Parser(rules, start)
Esempio n. 21
0
def grammar(**kwargs):
    return {
        # Rule("CATEGORY", [Expression(r'.+')],
        #     lambda state, data: data[0] + Interpretation(local=Category(data[0].local)))
        Rule('CATEGORY', [RuleRef('NOUN*')], passthru),
    }