Exemple #1
0
            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,
Exemple #2
0
            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
Exemple #3
0
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
Exemple #4
0
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