dsl_syntax_error.lineno = syntax_error.lineno dsl_syntax_error.msg = syntax_error.msg dsl_syntax_error.filename = syntax_error.filename dsl_syntax_error.message = syntax_error.message dsl_syntax_error.text = syntax_error.text dsl_syntax_error.offset = syntax_error.offset dsl_syntax_error.print_file_and_line = syntax_error.print_file_and_line dsl_syntax_error.understood_expression = cleaned_expression_string raise dsl_syntax_error else: if check(expression)(): check_analysis_out = [] def analysis_out(*things): check_analysis_out.append("".join(map(str, things))) check_analysis(expression)(analysis_out) raise DSLTypeError( "\n".join(check_analysis_out) ) else: Build(expression)() return expression from Units import ( units, analysis ) from Check import check, check_analysis from Build import Build from CodeGeneration import ( R_Code_for_values,
dsl_syntax_error.msg = syntax_error.msg dsl_syntax_error.filename = syntax_error.filename dsl_syntax_error.message = syntax_error.message dsl_syntax_error.text = syntax_error.text dsl_syntax_error.offset = syntax_error.offset dsl_syntax_error.print_file_and_line = syntax_error.print_file_and_line dsl_syntax_error.understood_expression = cleaned_expression_string raise dsl_syntax_error else: if check(expression): check_analysis_out = [] def analysis_out(*things): check_analysis_out.append("".join(map(str, things))) check_analysis(expression, analysis_out) raise DSLTypeError("\n".join(check_analysis_out)) else: Build(expression) return expression from Units import (Units, units, analysis, WhateverUnitsAreNeeded, MeaninglessUnitsException, DimensionError) from Check import check, check_analysis from Build import Build from CodeGeneration import (R_Code_for_values, init_R_interpreter) from GridSizing import grid_sizes import Stringification
def parse(expression_string): import re tokens = [] out = tokens.append def out_all(*pieces): tokens.extend(pieces) def write_table_name(scanner, table_name): out(table_name) def allowed_identifier(scanner, token): out(token) def operator(scanner, token): if token == "^": out("**") else: out(token) def write_number(scanner, number): out(number) def number_with_units(scanner, token): number, units = token.split(None, 1) out_all("Number(", number, ",'", units, "')") def whitespace(scanner, token): out(token) def parenthesis(scanner, token): out(token) def comma(scanner, token): out(token) allowed_names = {} for name in ( "Sum Average StandardDeviation Minimum Maximum Count " "Months FromDate ToDate Number".split() ): allowed_names[name] = globals()[name] for month_name in Months.options.keys(): if not isinstance(month_name, int): allowed_names[month_name] = month_name scanner_spec = ( (r"#.*?\n", whitespace), (r'"('+"|".join(SampleTable._SampleTable__names.keys())+')"', write_table_name), (r"(%s)(?=\W)" % "|".join(allowed_names.keys()), allowed_identifier), (r"\+|\-|\/|\*|\=|\^", operator), (r"\(|\)", parenthesis), (r",", comma), (r"\s+", whitespace), ( r"-?[0-9]+(?:\.[0-9]+)?\s+(?:(?:delta|Δ)\s+)?(?: *(?:%(units)s)(?:\^[0-9])?)* *(?:\/(?: *(?:%(units)s)(?:\^[0-9])?)*)?" % dict( units = "|".join(units_in_out.keys()) ), number_with_units ), (r"-?[0-9]*(\.[0-9]+)?", write_number), ) scanner = re.Scanner(scanner_spec) #print scanner_spec #print expression_string _, remainder = scanner.scan(expression_string) if remainder: raise SyntaxError( "Syntax error near: '"+("".join(remainder))+"'" ) else: cleaned_expression_string = "("+("".join(tokens))+")" #print cleaned_expression_string expression = eval( cleaned_expression_string, allowed_names ) if check(expression): check_analysis_out = [] def analysis_out(*things): check_analysis_out.append("".join(map(str, things))) check_analysis(expression, analysis_out) raise TypeError( "\n".join(check_analysis_out) ) else: Build(expression) return expression
def parse(expression_string): import re tokens = [] out = tokens.append def out_all(*pieces): tokens.extend(pieces) def write_table_name(scanner, table_name): out(table_name) def allowed_identifier(scanner, token): out(token) def operator(scanner, token): if token == "^": out("**") else: out(token) def write_number(scanner, number): out(number) def number_with_units(scanner, token): number, units = token.split(None, 1) out_all("Number(", number, ",'", units, "')") def whitespace(scanner, token): out(token) def parenthesis(scanner, token): out(token) def comma(scanner, token): out(token) allowed_names = {} for name in ("Sum Average StandardDeviation Minimum Maximum Count " "Months FromDate ToDate Number".split()): allowed_names[name] = globals()[name] for month_name in Months.options.keys(): if not isinstance(month_name, int): allowed_names[month_name] = month_name scanner_spec = ( (r"#.*?\n", whitespace), (r'"(' + "|".join(SampleTable._SampleTable__names.keys()) + ')"', write_table_name), (r"(%s)(?=\W)" % "|".join(allowed_names.keys()), allowed_identifier), (r"\+|\-|\/|\*|\=|\^", operator), (r"\(|\)", parenthesis), (r",", comma), (r"\s+", whitespace), (r"-?[0-9]+(?:\.[0-9]+)?\s+(?:(?:delta|Δ)\s+)?(?: *(?:%(units)s)(?:\^[0-9])?)* *(?:\/(?: *(?:%(units)s)(?:\^[0-9])?)*)?" % dict(units="|".join(units_in_out.keys())), number_with_units), (r"-?[0-9]*(\.[0-9]+)?", write_number), ) scanner = re.Scanner(scanner_spec) #print scanner_spec #print expression_string _, remainder = scanner.scan(expression_string) if remainder: raise SyntaxError("Syntax error near: '" + ("".join(remainder)) + "'") else: cleaned_expression_string = "(" + ("".join(tokens)) + ")" #print cleaned_expression_string expression = eval(cleaned_expression_string, allowed_names) if check(expression): check_analysis_out = [] def analysis_out(*things): check_analysis_out.append("".join(map(str, things))) check_analysis(expression, analysis_out) raise TypeError("\n".join(check_analysis_out)) else: Build(expression) return expression