def p_statement(p): '''statement : varAssignment | procedureDeclaration | procedureCall | builtInFunction | ifStatement | forLoop | printStatement''' p[0] = ASTNode("statement", [p[1]])
def p_builtInFunction(p): '''builtInFunction : delay | listOperation | listInsert | matrixInsert | listDelete | matrixDelete | blink''' p[0] = ASTNode("builtInFunction", ([p[1]]))
def p_varValue(p): '''varValue : ID | indexedId | INTEGER | numExpression | idNegation | BOOLEAN | list | listDimension | listRange | len''' p[0] = ASTNode("varValue", ([p[1]]))
def p_forLoop(p): 'forLoop : FOR ID IN iterable LBRACE statementList RBRACE SEMICOLON' p[0] = ASTNode("forLoop", (p[1], p[2], p[3], p[4], p[5], p[6], p[7]))
def p_idList_many(p): 'idList : ID COMMA idList' p[0] = ASTNode("idListMany", (p[1], p[2], p[3]))
def p_varAssignment(p): '''varAssignment : simpleAssignment | indexAssignment | multipleDeclaration''' p[0] = ASTNode("varAssignment", [p[1]])
def p_arguments_many(p): 'arguments : argument COMMA arguments' p[0] = ASTNode("arguments", (p[1], p[2], p[3]))
def p_indexedId(p): 'indexedId : ID index' p[0] = ASTNode("indexedId", (p[1], p[2]))
def p_indexMany(p): 'index : index index' p[0] = ASTNode("index", (p[1], p[2]))
def p_statementList_one(p): 'statementList : statement ' p[0] = ASTNode("statementList", [p[1]])
def p_simpleAssignment(p): 'simpleAssignment : ID ASSIGN varValue SEMICOLON' p[0] = ASTNode("simpleAssignment", (p[1], p[2], p[3], p[4]))
def p_statementList_empty(p): 'statementList : empty' p[0] = ASTNode("statementList", [p[1]])
def p_procedureCall_parameters(p): 'procedureCall : CALL ID LPARENTHESES arguments RPARENTHESES SEMICOLON' p[0] = ASTNode("procedureCall", (p[1], p[2], p[3], p[4], p[5], p[6]))
def p_statementList_many(p): 'statementList : statement statementList' p[0] = ASTNode("statementList", (p[1], p[2]))
def p_procedureDeclaration_noParameters(p): 'procedureDeclaration : PROCEDURE ID LPARENTHESES RPARENTHESES LBRACE statementList RBRACE SEMICOLON' p[0] = ASTNode("procedureDeclaration", (p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8]))
def p_argument(p): 'argument : varValue' p[0] = ASTNode("argument", [p[1]])
def p_varValueList_one(p): 'varValueList : varValue' p[0] = ASTNode("varValueListOne", [p[1]])
def p_forLoop_step(p): 'forLoop : FOR ID IN iterable STEP INTEGER LBRACE statementList RBRACE SEMICOLON' p[0] = ASTNode("forLoop", (p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9]))
def p_varValueList_many(p): 'varValueList : varValue COMMA varValueList' p[0] = ASTNode("varValueListMany", (p[1], p[2], p[3]))
def p_iterable(p): '''iterable : ID | indexedId | INTEGER | len''' p[0] = ASTNode("iterable", [p[1]])
def p_indexAssignment(p): 'indexAssignment : ID index ASSIGN varValue SEMICOLON' p[0] = ASTNode("indexAssignment", (p[1], p[2], p[3], p[4], p[5]))
def p_ifStatement(p): 'ifStatement : IF ifIterable COMPARATOR comparisonValue LBRACE statementList RBRACE SEMICOLON' p[0] = ASTNode("ifStatement", (p[1], p[2], p[3], p[4], p[5], p[6], p[7]))
def p_indexOne(p): 'index : LSQUAREBRACKET indexValue RSQUAREBRACKET' p[0] = ASTNode("index", (p[1], p[2], p[3]))
def p_multipleDeclaration(p): 'multipleDeclaration : ID COMMA idList ASSIGN varValue COMMA varValueList SEMICOLON' p[0] = ASTNode("multipleDeclaration", (p[1], p[2], p[3], p[4], p[5], p[6], p[7]))
def p_indexValue(p): '''indexValue : INTEGER | ID | indexPair | indexRange''' p[0] = ASTNode("indexValue", ([p[1]]))
def p_procedureCall_noParameters(p): 'procedureCall : CALL ID LPARENTHESES RPARENTHESES SEMICOLON' p[0] = ASTNode("procedureCall", (p[1], p[2], p[3], p[4], p[5]))
def p_ifIterable(p): '''ifIterable : ID | indexedId''' p[0] = ASTNode("ifIterable", [p[1]])
def p_arguments_one(p): 'arguments : argument' p[0] = ASTNode("arguments", [p[1]])
def p_idList_one(p): 'idList : ID' p[0] = ASTNode("idListOne", [p[1]])
def p_comparisonValue(p): '''comparisonValue : BOOLEAN | INTEGER''' p[0] = ASTNode("comparisonValue", [p[1]])