def p_tuple_indexing(p): ''' TUPLE_INDEXING : TUPLE_LIST | TUPLE_INDEX INTEGER TUPLE_LIST ''' if len(p) == 2: p[0] = p[1] elif len(p) == 4: p[0] = ExpressionNode(p[2], p[3], operator=p[1]) else: raise RuntimeError('Case not handled')
def p_exponentiation(p): ''' EXPONENTIATION : LIST_STR_INDEXING | LIST_STR_INDEXING EXPONENT EXPONENTIATION ''' if len(p) == 2: p[0] = p[1] elif len(p) == 4: p[0] = ExpressionNode(p[1], p[3], operator=p[2]) else: raise RuntimeError('Case not handled')
def p_membership(p): ''' MEMBERSHIP : PLUS_MINUS | MEMBERSHIP IN PLUS_MINUS ''' if len(p) == 2: p[0] = p[1] elif len(p) == 4: p[0] = ExpressionNode(p[1], p[3], operator=p[2]) else: raise RuntimeError('Case not handled')
def p_urnary(p): ''' URNARY : EXPONENTIATION | MINUS URNARY ''' if len(p) == 2: p[0] = p[1] elif len(p) == 3: p[0] = ExpressionNode(0, p[2], operator=p[1]) else: raise RuntimeError('Case not handled')
def p_cons_list(p): ''' CONS_LIST : MEMBERSHIP | MEMBERSHIP CONS CONS_LIST ''' if len(p) == 2: p[0] = p[1] elif len(p) == 4: p[0] = ExpressionNode(p[1], p[3], operator=p[2]) else: raise RuntimeError('Case not handled')
def p_negation(p): ''' NEGATION : COMPARISON | NOT NEGATION ''' if len(p) == 2: p[0] = p[1] elif len(p) == 3: p[0] = ExpressionNode(p[2], operator=p[1]) else: raise RuntimeError('Case not handled')
def p_and(p): ''' AND : NEGATION | AND ANDALSO NEGATION ''' if len(p) == 2: p[0] = p[1] elif len(p) == 4: p[0] = ExpressionNode(p[1], p[3], operator=p[2]) else: raise RuntimeError('Case not handled')
def p_or(p): ''' OR : AND | OR ORELSE AND ''' if len(p) == 2: p[0] = p[1] elif len(p) == 4: p[0] = ExpressionNode(p[1], p[3], operator=p[2]) else: raise RuntimeError('Case not handled')
def p_plus_minus(p): ''' PLUS_MINUS : MULT_DIV | PLUS_MINUS PLUS MULT_DIV | PLUS_MINUS MINUS MULT_DIV ''' if len(p) == 2: p[0] = p[1] elif len(p) == 4: p[0] = ExpressionNode(p[1], p[3], operator=p[2]) else: raise RuntimeError('Case not handled')
def p_list_str_indexing(p): ''' LIST_STR_INDEXING : TUPLE_INDEXING | LIST_STR_INDEXING LBRACKET OR RBRACKET | LIST_STR_INDEXING LBRACKET OR RBRACKET TAKES_VALUE OR ''' if len(p) == 2: p[0] = p[1] elif len(p) == 5: p[0] = ExpressionNode(p[1], p[3], operator=p[2]) elif len(p) == 7: p[0] = StatementNode(p[1], p[3], p[6], keyword=p[5]) else: raise RuntimeError('Case not handled')
def p_mult_div(p): ''' MULT_DIV : URNARY | MULT_DIV TIMES URNARY | MULT_DIV DIVIDE URNARY | MULT_DIV DIV URNARY | MULT_DIV MOD URNARY ''' if len(p) == 2: p[0] = p[1] elif len(p) == 4: p[0] = ExpressionNode(p[1], p[3], operator=p[2]) else: raise RuntimeError('Case not handled')
def p_comparison(p): ''' COMPARISON : CONS_LIST | COMPARISON LESS_THAN CONS_LIST | COMPARISON LESS_EQUAL CONS_LIST | COMPARISON GREATER_THAN CONS_LIST | COMPARISON GREATER_EQUAL CONS_LIST | COMPARISON EQUAL CONS_LIST | COMPARISON NOT_EQUAL CONS_LIST ''' if len(p) == 2: p[0] = p[1] elif len(p) == 4: p[0] = ExpressionNode(p[1], p[3], operator=p[2]) else: raise RuntimeError('Case not handled')
def p_primary(p): ''' PRIMARY : BOOLEAN | INTEGER | REAL | STRING | IDENTIFIER | LPAREN OR RPAREN ''' if len(p) == 2: if isinstance(p[1], Node): p[0] = p[1] elif is_identifier(p[1]): p[0] = VariableNode(p[1]) else: p[0] = ExpressionNode(p[1]) elif len(p) == 4: p[0] = p[2] else: raise RuntimeError('Case not handled')