def p_for(p): """forLoopInstruction : FOR ID '=' array instruction""" p[0] = For(Variable( p[2], line=p.lineno if type(p.lineno) is int else p.lexer.lineno, column=scanner.find_column(file_content, p)), p[4], p[5], line=p.lineno if type(p.lineno) is int else p.lexer.lineno, column=scanner.find_column(file_content, p))
def p_if(p): """conditionInstruction : IF '(' expression ')' instruction ELSE instruction | IF '(' expression ')' instruction""" if len(p) == 6: p[0] = If(p[3], p[5], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p)) else: p[0] = Else(p[3], p[5], p[7], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_reference(p): """reference : variable '[' expression ']' | variable '[' expression ',' expression ']'""" if len(p) == 5: p[0] = Reference(p[1], [p[3]], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p)) else: p[0] = Reference(p[1], [p[3], p[5]], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_unaryExpression(p): """unaryExpression : '-' expression | expression TRANSPOSITION """ if (p[2] == '\''): p[0] = UnaryExpression( p[2], p[1], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p)) else: p[0] = UnaryExpression( p[1], p[2], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_matrix(p): """matrix : '[' rows ']' | EYE '(' expression ')' | ZEROS '(' expression ')' | ONES '(' expression ')'""" if p[1] == '[': p[0] = Matrix(p[2], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p)) else: p[0] = Matrix((p[1], p[3]), p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_arrayType(p): """array : '[' row ']' | expression ':' expression""" if len(p) == 2: p[0] = p[1] elif p[2] == ':': p[0] = Array.fromRange( p[1], p[3], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p)) else: p[0] = Array.fromList( p[2], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_error(p): if p: print("Syntax error at line {0}, column {1}: LexToken({2}, '{3}')". format(p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p), p.type, p.value)) else: print("Unexpected end of input")
def p_error(p): if p: if p.type != 'SEMICOLON': print("Syntax error at line {0}, column {1}: LexToken({2}, '{3}')". format(p.lineno, scanner.find_column(p), p.type, p.value)) parser.errok() else: print("Unexpected end of input")
def p_error(p): p.lexer.encountered_error = True if p: print("Syntax error at line {0}, column {1}: LexToken({2}, '{3}')" .format(p.lineno, scanner.find_column(p.lexer.lexdata, p), p.type, p.value)) else: print("Unexpected end of input")
def p_instructions(p): """instructions : instruction instructions | instruction """ if len(p) == 2: p[0] = Block([p[1]], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p)) else: p[0] = p[2] p[2].body = [p[1]] + p[2].body
def p_int(p): """number : INT """ p[0] = IntNum(p[1], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_float(p): """number : FLOAT""" p[0] = FloatNum(p[1], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_string(p): """string : STRING""" p[0] = String(p[1], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_jump(p): """jump : CONTINUE | BREAK""" p[0] = Jump(p[1], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_variable(p): """variable : ID""" p[0] = Variable(p[1], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_binaryExpression(p): """binaryExpression : expression binaryOperator expression""" p[0] = BinaryExpression( p[2], p[1], p[3], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
def p_while(p): """whileLoopInstruction : WHILE '(' expression ')' instruction""" p[0] = While(p[3], p[5], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
import sys import scanner if __name__ == '__main__': try: filename = sys.argv[1] if len(sys.argv) > 1 else "example.txt" file = open(filename, "r") except IOError: print("Cannot open {0} file".format(filename)) sys.exit(0) text = file.read() lexer = scanner.lexer lexer.input(text) # Give the lexer some input # Tokenize while True: tok = lexer.token() if not tok: break # No more input column = scanner.find_column(tok) print("\033[1;40;40m(%d,%d): %s(%s)" % (tok.lineno, column, tok.type, tok.value))
def p_returnStatement(p): """returnStatement : RETURN expression """ p[0] = Return(p[2], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))
import sys # import ply.lex as lex import scanner # scanner.py is a file you create, (it is not an external library) sys.path.append('..') if __name__ == '__main__': try: filename = sys.argv[1] if len(sys.argv) > 1 else "example.txt" file = open(filename, "r") except IOError: print("Cannot open {0} file".format(filename)) sys.exit(0) text = file.read() lexer = scanner.lexer lexer.input(text) # Give the lexer some input # Tokenize while True: tok = lexer.token() if not tok: break # No more input column = scanner.find_column(text, tok) print("(%d,%d): %s(%s)" % (tok.lineno, column, tok.type, tok.value))
def p_printInstruction(p): """printInstruction : PRINT valuesToPrint """ p[0] = Print(p[2], p.lineno if type(p.lineno) is int else p.lexer.lineno, scanner.find_column(file_content, p))