示例#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:])