import antlr3
from CalculatorLexer import CalculatorLexer
from CalculatorParser import CalculatorParser

while True:
    expr = raw_input('>>> ')
    if expr == '':
        break

    cStream = antlr3.StringStream(expr)
    lexer = CalculatorLexer(cStream)
    tStream = antlr3.CommonTokenStream(lexer)
    parser = CalculatorParser(tStream)
    result = parser.evaluate()
    print result
Exemple #2
0
    def testTreeRewrite(self):
        grammar = textwrap.dedent(r'''grammar T6;
            options {
              language=Python;
              output=AST;
            }

            tokens {
              BLOCK;
              ASSIGN;
            }
            
            prog: stat+;

            stat
                : IF '(' e=expr ')' s=stat
                  -> ^(IF $e $s)
                | RETURN expr ';'
                  -> ^(RETURN expr)                
                | '{' stat* '}'
                  -> ^(BLOCK stat*)                
                | ID '=' expr ';'
                  -> ^(ASSIGN ID expr)
                ;
                
            expr
                : ID
                | INT
                ;

            IF: 'if';
            RETURN: 'return';
            ID:  'a'..'z'+;
            INT: '0'..'9'+;
            WS: (' '|'\n')+ {$channel=HIDDEN;} ;
            COMMENT: '/*' (options {greedy=false;} : .)* '*/' {$channel = HIDDEN;} ;
            ''')

        treeGrammar = textwrap.dedent(r'''tree grammar T6Walker;
            options {
              language=Python;
              tokenVocab=T6;
              ASTLabelType=CommonTree;
              output=template;
              rewrite=true;
            }

            prog: stat+;

            stat
                : ^(IF expr stat)
                | ^(RETURN return_expr)                
                | ^(BLOCK stat*)                
                | ^(ASSIGN ID expr)
                ;

            return_expr
                : expr
                  -> template(t={$text}) <<boom(<t>)>>
                ;
            
            expr
                : ID
                | INT
                ;
            ''')

        input = textwrap.dedent('''\
            if ( foo ) {
              b = /* bla */ 2;
              return 1 /* foo */;
            }

            /* gnurz */
            return 12;
            ''')

        lexerCls, parserCls = self.compileInlineGrammar(grammar)
        walkerCls = self.compileInlineGrammar(treeGrammar)

        cStream = antlr3.StringStream(input)
        lexer = lexerCls(cStream)
        tStream = antlr3.TokenRewriteStream(lexer)
        parser = parserCls(tStream)
        tree = parser.prog().tree
        nodes = antlr3.tree.CommonTreeNodeStream(tree)
        nodes.setTokenStream(tStream)
        walker = walkerCls(nodes)
        walker.prog()

        found = tStream.toString()

        expected = textwrap.dedent('''\
            if ( foo ) {
              b = /* bla */ 2;
              return boom(1) /* foo */;
            }

            /* gnurz */
            return boom(12);
            ''')

        self.failUnlessEqual(expected, found)
Exemple #3
0
 def testValid1(self):
     cStream = antlr3.StringStream('foo')
     lexer = self.getLexer(cStream)
     tStream = antlr3.CommonTokenStream(lexer)
     parser = self.getParser(tStream)
     events = parser.r()
Exemple #4
0
import sys
import antlr3
from SimpleCLexer import SimpleCLexer
from SimpleCParser import SimpleCParser

cStream = antlr3.StringStream(open(sys.argv[1]).read())
lexer = SimpleCLexer(cStream)
tStream = antlr3.CommonTokenStream(lexer)
parser = SimpleCParser(tStream)
parser.program()
Exemple #5
0
    def testRewrite(self):
        grammar = textwrap.dedent(r'''grammar T5;
            options {
              language=Python;
              output=template;
              rewrite=true;
            }

            prog: stat+;

            stat
                : 'if' '(' expr ')' stat
                | 'return' return_expr ';'
                | '{' stat* '}'
                | ID '=' expr ';'
                ;

            return_expr
                : expr
                  -> template(t={$text}) <<boom(<t>)>>
                ;
                
            expr
                : ID
                | INT
                ;
                
            ID:  'a'..'z'+;
            INT: '0'..'9'+;
            WS: (' '|'\n')+ {$channel=HIDDEN;} ;
            COMMENT: '/*' (options {greedy=false;} : .)* '*/' {$channel = HIDDEN;} ;
            ''')

        input = textwrap.dedent('''\
            if ( foo ) {
              b = /* bla */ 2;
              return 1 /* foo */;
            }

            /* gnurz */
            return 12;
            ''')

        lexerCls, parserCls = self.compileInlineGrammar(grammar)

        cStream = antlr3.StringStream(input)
        lexer = lexerCls(cStream)
        tStream = antlr3.TokenRewriteStream(lexer)
        parser = parserCls(tStream)
        result = parser.prog()

        found = tStream.toString()

        expected = textwrap.dedent('''\
            if ( foo ) {
              b = /* bla */ 2;
              return boom(1) /* foo */;
            }

            /* gnurz */
            return boom(12);
            ''')

        self.failUnlessEqual(expected, found)
Exemple #6
0
    def testSize(self):
        """StringStream.size()"""

        stream = antlr3.StringStream('foo')

        self.assertEqual(stream.size(), 3)
Exemple #7
0
 def testValid1(self):
     cStream = antlr3.StringStream('foobar')
     lexer = self.getLexer(cStream)
     tStream = antlr3.CommonTokenStream(lexer)
     parser = self.getParser(tStream)
     parser.prog()
Exemple #8
0
import sys
import antlr3
from CSVLexer import CSVLexer
from CSVParser import CSVParser

cStream = antlr3.StringStream(sys.stdin.read())  # create char stream
lexer = CSVLexer(cStream)  # lexer feeds off chars
tStream = antlr3.CommonTokenStream(lexer)  # buffer up tokens
parser = CSVParser(tStream)  # parser feeds off tokens
parser.file()  # begin parse w/rule file
Exemple #9
0
    def testIndex(self):
        """StringStream.index()"""

        stream = antlr3.StringStream('foo')

        self.assertEqual(stream.index(), 0)
    def testIndex(self):
        """StringStream.index()"""

        stream = antlr3.StringStream('foo')

        self.failUnlessEqual(stream.index(), 0)
    def testSize(self):
        """StringStream.size()"""

        stream = antlr3.StringStream('foo')

        self.failUnlessEqual(stream.size(), 3)
Exemple #12
0
    def _parseGuard(self, sm, guard_s, container):
        from UMLStateMachine.Parsers.GuardLexer import GuardLexer
        from UMLStateMachine.Parsers.GuardParser import GuardParser
        sStream = antlr3.StringStream(guard_s)
        lexer = GuardLexer(sStream)
        tStream = antlr3.CommonTokenStream(lexer)
        parser = GuardParser(tStream)
        _guard = parser.guard()

        def check(lst):
            hasBool = False
            hasInt = False
            for var in lst:
                if isinstance(var, BoolConst):
                    hasBool = True
                elif isinstance(var, int):
                    hasInt = True
                else:
                    v = sm.lookupVar(var)
                    if var != "self.c" and not v:
                        import_logger.error(
                            "Can't find var \"%s\" in state machine \"%s\"" %
                            (var, sm.name))
                    else:
                        if isinstance(v, BoolVar):
                            hasBool = True
                        else:
                            hasInt = True
            if hasBool and hasInt:
                return False, False
            return True, hasBool

        def analyze(guard):
            result = True
            for atom in guard.disjunctions:
                if isinstance(atom, CompAtom):
                    r1 = check(atom.args[0].args)
                    r2 = check(atom.args[1].args)
                    if not r1[0] or not r2[0] or r1[1] != r2[1]:
                        result = False
                elif isinstance(atom, OrAtom) or isinstance(atom, AndAtom):
                    result &= analyze(atom)
                elif isinstance(atom, InAtom):
                    pass
                elif isinstance(atom, Negation):
                    if isinstance(atom.arg, OrAtom):
                        result = analyze(atom.arg)
                    else:
                        r1 = check(atom.arg.args[0].args)
                        r2 = check(atom.arg.args[1].args)
                        if not r1[0] or not r2[0] or r1[1] != r2[1]:
                            result = False
                else:
                    print atom, conj, guard_s
                    print atom.__class__
                    assert (0)
            return result

        if not analyze(_guard):
            import_logger.error(
                "Comparing vars of different types in guard atom \"%s\"" %
                (str(_guard)))

        return _guard
Exemple #13
0
    def _parseAction(self, sm, s):
        from UMLStateMachine.Parsers.ActionLexer import ActionLexer
        from UMLStateMachine.Parsers.ActionParser import ActionParser
        sStream = antlr3.StringStream(s)
        lexer = ActionLexer(sStream)
        tStream = antlr3.CommonTokenStream(lexer)
        parser = ActionParser(tStream)
        statements = parser.action()
        ret_statements = []
        for statement in statements:

            def analyze_expr(expr, type):
                assert (type in (int, bool))
                # TODO: put BoolConst class into a common file?
                if isinstance(expr, ActionBoolConst):
                    return (type == bool)
                if isinstance(expr, IntConst):
                    return (type == int)
                if isinstance(expr, VarName):
                    var = sm.lookupVar(str(expr))
                    if var == None:
                        import_logger.error(
                            "Unknown variable \"%s\" in assignment %s" %
                            (expr, statement))
                    if type == int:
                        return isinstance(var, IntVar) or isinstance(
                            var, ClockVar)
                    else:
                        return isinstance(var, BoolVar)
                if isinstance(expr, PlusOp):
                    if type == bool:
                        return False
                    else:
                        return all([analyze_expr(e[1], int) for e in expr.ops])
                if isinstance(expr, MultOp):
                    if type == bool:
                        return False
                    else:
                        return all([analyze_expr(e, int) for e in expr.ops])
                if isinstance(expr, CompOp):
                    if type == int:
                        return False
                    else:
                        return all([analyze_expr(e, int) for e in expr.ops])
                if isinstance(expr, AndOp) or isinstance(expr, OrOp):
                    if type == int:
                        return False
                    else:
                        return all([analyze_expr(e, bool) for e in expr.ops])
                if isinstance(expr, ConditionalOp):
                    return analyze_expr(expr.op1, bool) and analyze_expr(
                        expr.op2, type) and analyze_expr(expr.op3, type)

            if isinstance(statement, SendSignalStatement):
                self.send_signal_names.add(statement.signal_name)
            elif isinstance(statement, AssignStatement):
                var = sm.lookupVar(statement.var_name)
                if var == None:
                    import_logger.error("Assignment to unknown variable: " +
                                        str(statement))
                    return None
                if isinstance(var, IntVar):
                    res = analyze_expr(statement.expr, int)
                elif isinstance(var, BoolVar):
                    res = analyze_expr(statement.expr, bool)
                elif isinstance(var, ClockVar):
                    res = analyze_expr(statement.expr, int)
                else:
                    assert (0)
                if not res:
                    import_logger.error("Wrong expr type in assignment: " +
                                        str(statement))
                    continue
            elif isinstance(statement, RandomAssignStatement):
                var = sm.lookupVar(statement.var_name)
                if var == None:
                    import_logger.error("Assignment to unknown variable: " +
                                        str(statement))
                    return None
                if isinstance(var, IntVar) or isinstance(var, BoolVar):
                    res = True
                else:
                    import_logger.error(
                        "Trying to assign a random variable to a clock variable: "
                        + str(statement))
                    continue
            ret_statements.append(statement)
        return ret_statements
Exemple #14
0
 def testb2(self):
     cStream = antlr3.StringStream('foobar')
     lexer = self.getLexer(cStream)
     tStream = antlr3.CommonTokenStream(lexer)
     parser = self.getParser(tStream)
     parser.b(True)