Пример #1
0
def _create_grammar_tree(tree: Any) -> GrammarTree:
    """Create a GrammarTree object for the given constituent parse tree object
    outputted by the benepar library.

    From the documentation, spaCy does not provide an official constituency parsing API,
    so all methods are only accessible through the extension namespaces Span._ and Token._.

    Preconditions:
        - tree is a constituent parse tree object outputted by the benepar library.
    """
    # sums up the number of children of tree (tree._.children is an iterator)
    if sum(1 for _ in tree._.children) == 0:
        parse_string_lst = str(tree._.parse_string).replace("(", "").replace(
            ")", "").split()
        assert 2 <= len(parse_string_lst) <= 3
        # if len(parse_string_lst) == 2, tree represents a word (i.e. tree is a leaf)
        # if len(parse_string_lst) == 3, tree represents a unary chain of length 2 (special case)
        if len(parse_string_lst) == 2:
            label, text = parse_string_lst[0], parse_string_lst[1]
        else:
            leaf = GrammarTree(parse_string_lst[1], [], parse_string_lst[2])
            return GrammarTree(parse_string_lst[0], [leaf], "")
    else:
        # tree represents a clause or a phrase that is not a unary chain
        label, text = str(tree._.labels[0]), ""

    grammar_tree = GrammarTree(
        label, [_create_grammar_tree(subtree) for subtree in tree._.children],
        text)
    return grammar_tree
Пример #2
0
def p_expr(p):
    '''Expr : Constant
            | LValue
            | THIS
            | Call
            | LPAREN Expr RPAREN
            | Expr PLUS Expr
            | Expr MINUS Expr
            | Expr MULTI Expr
            | Expr DIVIDE Expr
            | Expr MOD Expr
            | Expr LESS Expr
            | Expr LESSEQUAL Expr
            | Expr GREATER Expr
            | Expr GREATEREQUAL Expr
            | Expr EQUAL Expr
            | Expr NOTEQUAL Expr
            | Expr AND Expr
            | Expr OR Expr
            | NOT Expr
            | READINT LPAREN RPAREN
            | READLINE LPAREN RPAREN
            | NEW ID LPAREN RPAREN
            | NEW Type LBRACKET Expr RBRACKET
            | INSTANCEOF LPAREN Expr COMMA ID RPAREN
            | LPAREN CLASS ID RPAREN Expr
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #3
0
def t_ID(t):
    r'[a-zA-Z_][a-zA-Z_0-9]*'
    t.type = reserved.get(t.value,'ID')    # Check for reserved words
    if t.type == 'BOOL_CONST':
        t.value = bool(t.value)
    t.value = GrammarTree(t.type, t.lineno, (), t.value)
    return t
Пример #4
0
def p_constant(p):
    '''Constant : INT_CONST
                | FLOAT_CONST
                | BOOL_CONST
                | STR_CONST
                | NULL
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #5
0
def p_type(p):
    '''Type : INT
            | FLOAT
            | BOOL
            | STRING
            | VOID
            | CLASS ID
            | Type LBRACKET RBRACKET
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #6
0
def p_stmt(p):
    '''Stmt : VariableDef
            | SimpleStmt SEMICOLON
            | IfStmt
            | WhileStmt
            | ForStmt
            | BreakStmt SEMICOLON
            | ReturnStmt SEMICOLON
            | PrintStmt SEMICOLON
            | StmtBlock
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #7
0
def p_stmt_block(p):
    'StmtBlock : LBRACE Stmts RBRACE'
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #8
0
def p_fields(p):
    '''Fields : Fields Field
              |
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0),
                       p[1].childs + p[2:] if len(p) >= 3 else p[1:])
Пример #9
0
def p_function_def(p):
    '''FunctionDef : Type ID LPAREN Formals RPAREN StmtBlock
                   | STATIC Type ID LPAREN Formals RPAREN StmtBlock
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #10
0
def p_program(p):
    '''Program : ClassDef
               | Program ClassDef'''
    p[0] = GrammarTree(p.slice[0], p.lineno(0),
                       p[1].childs + p[2:] if len(p) >= 3 else p[1:])
Пример #11
0
def p_while_stmt(p):
    'WhileStmt : WHILE LPAREN BoolExpr RPAREN Stmt'
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #12
0
def p_for_stmt(p):
    'ForStmt : FOR LPAREN SimpleStmt SEMICOLON BoolExpr SEMICOLON SimpleStmt RPAREN Stmt'
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #13
0
def p_actuals(p):
    '''Actuals : Exprs
               |
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #14
0
def p_call(p):
    '''Call : ID LPAREN Actuals RPAREN
            | Expr DOT ID LPAREN Actuals RPAREN
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #15
0
def p_lvalue(p):
    '''LValue : ID
              | Expr DOT ID
              | Expr LBRACKET Expr RBRACKET
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #16
0
def p_variable_def(p):
    '''VariableDef : Variable CommaID SEMICOLON
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #17
0
def p_expr_uminus(p):
    'Expr : MINUS Expr %prec UMINUS'
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #18
0
def p_if_stmt(p):
    '''IfStmt : IF LPAREN BoolExpr RPAREN Stmt %prec LOWER_THEN_ELSE
              | IF LPAREN BoolExpr RPAREN Stmt ELSE Stmt
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #19
0
def p_comma_id(p):
    '''CommaID : CommaID COMMA ID
               |
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0),
                       p[1].childs + p[2:] if len(p) >= 3 else p[1:])
Пример #20
0
def p_return_stmt(p):
    '''ReturnStmt : RETURN
                  | RETURN Expr
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #21
0
def p_variables(p):
    '''Variables : Variable
                 | Variables COMMA Variable
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0),
                       p[1].childs + p[2:] if len(p) >= 3 else p[1:])
Пример #22
0
def p_break_stmt(p):
    'BreakStmt : BREAK'
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #23
0
def p_formals(p):
    '''Formals : Variables
               |
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #24
0
def p_print_stmt(p):
    'PrintStmt : PRINT LPAREN Exprs RPAREN'
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #25
0
def p_class_def(p):
    '''ClassDef : CLASS ID LBRACE Fields RBRACE
                | CLASS ID EXTENDS ID LBRACE Fields RBRACE
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #26
0
def p_exprs(p):
    '''Exprs : Expr
             | Exprs COMMA Expr
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0),
                       p[1].childs + p[2:] if len(p) >= 3 else p[1:])
Пример #27
0
def p_field(p):
    '''Field : VariableDef
             | FunctionDef
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #28
0
def p_variable(p):
    'Variable : Type ID'
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])
Пример #29
0
def p_stmts(p):
    '''Stmts : Stmts Stmt
             |
    '''
    p[0] = GrammarTree(p.slice[0], p.lineno(0),
                       p[1].childs + p[2:] if len(p) >= 3 else p[1:])
Пример #30
0
def p_bool_expr(p):
    'BoolExpr : Expr'
    p[0] = GrammarTree(p.slice[0], p.lineno(0), p[1:])