def p_property_string(p): '''expression : property SYMBOL | property SYMBOL OR factor | property SYMBOL LPAREN expression RPAREN | property SYMBOL LPAREN expression RPAREN OR factor ''' if p[2] == "length": p[0] = node.FunctionCall('len', p[1]) elif p[2] == "indexOf": p[0] = node.FunctionCall('index', p[1], p[4]) elif p[2] == "charAt": if isinstance(p[1], node.Variable): if p[1].key is None: p[1] = p[1].name else: p.lexer.error( 'complex expressions are not supported in ESI. break apart into multiple variable asignments', abort=SyntaxError) p[0] = node.Variable(p[1], key=p[4]) if len(p) >= 7: p[0] = node.Variable(p[1], key=p[4], default=p[7]) elif len(p) == 3: p[0] = node.Variable(p[1], key=p[2]) elif len(p) == 5: p[0] = node.Variable(p[1], key=p[2], default=p[4]) else: p.lexer.error('unknown object property: "%s"' % (p[1]), abort=SyntaxError)
def p_assign_incdec(p): '''assign : assignLvalue INCREMENT | assignLvalue DECREMENT ''' op = p[2][0] == '+' and node.Plus or node.Minus p[0] = node.Assign(p[1][0], op(node.Variable(p[1][0], key=p[1][1]), node.Literal(1)), key=p[1][1])
def p_assign_op(p): '''assign : assignLvalue ASSIGNPLUS expression STOP | assignLvalue ASSIGNMINUS expression STOP | assignLvalue ASSIGNMULTIPLY expression STOP | assignLvalue ASSIGNMODULUS expression STOP | assignLvalue ASSIGNDIVIDE expression STOP ''' p[0] = node.Assign(p[1][0], node.Operator(p[2][0], node.Variable(p[1][0], key=p[1][1]), p[3]), key=p[1][1])
def p_for_loop(p): '''statement : FOR LPAREN assign testExpression STOP assign RPAREN statement ''' initAssign = p[3] testExpression = p[4] statementBlock = node.Block(node.If(node.Not(testExpression), node.Break())) statementBlock.statements.append(p[8]) statementBlock.statements.append(p[6]) p[0] = node.Block(initAssign) p[0].statements.append( node.Assign( '_loop', node.List(node.Range(initAssign.value, testExpression.args[1])))) p[0].statements.append(node.ForEach(node.Variable('_loop'), statementBlock))
def p_factor_varref_key_default(p): 'factor : SYMBOL LBRACKET expression RBRACKET OR expression' p[0] = node.Variable(p[1], key=p[3], default=p[6])
def p_factor_varref_default(p): 'factor : SYMBOL OR expression' p[0] = node.Variable(p[1], default=p[3])
def p_factor_varref_ternary(p): 'factor : testExpression QUESTION expression COLON expression' iftrue = node.Block(node.Variable(p[1], default=p[4])) iffalse = node.Block(node.Variable(p[1], default=p[5])) p[0] = node.If(p[1], iftrue, noMatchStatement=iffalse)
def p_factor_varref_key(p): 'factor : SYMBOL LBRACKET expression RBRACKET' p[0] = node.Variable(p[1], key=p[3])
def p_factor_varref(p): 'factor : SYMBOL' p[0] = node.Variable(p[1])
def p_factor_varref(p): 'factor : DOLLAR LPAREN SYMBOL varrefKey varrefDefault RPAREN' p[0] = node.Variable(p[3], key=p[4], default=p[5])
def p_varsExpr_varref_more(p): 'varsExprElement : VARREF varKey varDefault RPAREN' p[0] = node.Variable(p[1], key=p[2], default=p[3])
def p_varsExpr_varref(p): 'varsExprElement : VARREF' p[0] = node.Variable(p[1])
def p_vars_inline(p): 'vars : sVARS aNAME assignName xEMPTY' p[0] = node.Output(node.Variable(p[3][0], key=p[3][1]), vars=True)