Module hxl.formulas.parser

Expand source code
import logging
import ply.yacc as yacc
import hxl.model
import hxl.formulas.functions as f

from hxl.util import logup

logger = logging.getLogger(__name__)

from hxl.formulas.lexer import tokens

precedence = [
    ['left', 'PLUS', 'MINUS'],
    ['left', 'TIMES', 'DIVIDE', 'MODULO'],
    ['right', 'UMINUS'],
]

def p_expression_const(p):
    """expression : INT
                  | FLOAT
                  | STRING
    """
    p[0] = [f.const, [p[1]]]

def p_expression_group(p):
    'expression : LPAREN expression RPAREN'
    p[0] = p[2]

def p_expression_plus(p):
    'expression : expression PLUS expression'
    p[0] = [f.add, [p[1], p[3]]]

def p_expression_minus(p):
    'expression : expression MINUS expression'
    p[0] = [f.subtract, [p[1], p[3]]]

def p_expression_times(p):
    'expression : expression TIMES expression'
    p[0] = [f.multiply, [p[1], p[3]]]

def p_expression_divide(p):
    'expression : expression DIVIDE expression'
    p[0] = [f.divide, [p[1], p[3]]]

def p_expression_modulo(p):
    'expression : expression MODULO expression'
    p[0] = [f.modulo, [p[1], p[3]]]

def p_expression_uminus(p):
    'expression : MINUS expression %prec UMINUS'
    p[0] = [f.subtract, [0, p[2]]]

def p_expression_tagpattern(p):
    'expression : TAGPATTERN'
    p[0] = [f.tagref, [hxl.model.TagPattern.parse(p[1])]]

def p_expression_function(p):
    'expression : NAME LPAREN args RPAREN'
    p[0] = [f.function, [p[1]] + p[3]]

def p_args_multiple(p):
    'args : expression COMMA args'
    p[0] = [p[1]] + p[3]

def p_args_single(p):
    'args : expression'
    p[0] = [p[1]]

def p_args_empty(p):
    'args :'
    p[0] = []

# Error rule for syntax errors
def p_error(p):
    logup('Syntax error', {"err": str(p)}, level='error')
    logger.error("Syntax error: %s", str(p))

parser = yacc.yacc()

Functions

def p_args_empty(p)

args :

Expand source code
def p_args_empty(p):
    'args :'
    p[0] = []
def p_args_multiple(p)

args : expression COMMA args

Expand source code
def p_args_multiple(p):
    'args : expression COMMA args'
    p[0] = [p[1]] + p[3]
def p_args_single(p)

args : expression

Expand source code
def p_args_single(p):
    'args : expression'
    p[0] = [p[1]]
def p_error(p)
Expand source code
def p_error(p):
    logup('Syntax error', {"err": str(p)}, level='error')
    logger.error("Syntax error: %s", str(p))
def p_expression_const(p)

expression : INT | FLOAT | STRING

Expand source code
def p_expression_const(p):
    """expression : INT
                  | FLOAT
                  | STRING
    """
    p[0] = [f.const, [p[1]]]
def p_expression_divide(p)

expression : expression DIVIDE expression

Expand source code
def p_expression_divide(p):
    'expression : expression DIVIDE expression'
    p[0] = [f.divide, [p[1], p[3]]]
def p_expression_function(p)

expression : NAME LPAREN args RPAREN

Expand source code
def p_expression_function(p):
    'expression : NAME LPAREN args RPAREN'
    p[0] = [f.function, [p[1]] + p[3]]
def p_expression_group(p)

expression : LPAREN expression RPAREN

Expand source code
def p_expression_group(p):
    'expression : LPAREN expression RPAREN'
    p[0] = p[2]
def p_expression_minus(p)

expression : expression MINUS expression

Expand source code
def p_expression_minus(p):
    'expression : expression MINUS expression'
    p[0] = [f.subtract, [p[1], p[3]]]
def p_expression_modulo(p)

expression : expression MODULO expression

Expand source code
def p_expression_modulo(p):
    'expression : expression MODULO expression'
    p[0] = [f.modulo, [p[1], p[3]]]
def p_expression_plus(p)

expression : expression PLUS expression

Expand source code
def p_expression_plus(p):
    'expression : expression PLUS expression'
    p[0] = [f.add, [p[1], p[3]]]
def p_expression_tagpattern(p)

expression : TAGPATTERN

Expand source code
def p_expression_tagpattern(p):
    'expression : TAGPATTERN'
    p[0] = [f.tagref, [hxl.model.TagPattern.parse(p[1])]]
def p_expression_times(p)

expression : expression TIMES expression

Expand source code
def p_expression_times(p):
    'expression : expression TIMES expression'
    p[0] = [f.multiply, [p[1], p[3]]]
def p_expression_uminus(p)

expression : MINUS expression %prec UMINUS

Expand source code
def p_expression_uminus(p):
    'expression : MINUS expression %prec UMINUS'
    p[0] = [f.subtract, [0, p[2]]]