Exemplo n.º 1
0
        public static JavaAST CreateToken(int type, string text = "")
        {
            JavaAST ast = new JavaAST();

            ast.isRule = false;
            ast.type   = type;

            if (type == -1)
            {
                ast.text = "";
            }
            else
            {
                var literalText = Java8Lexer._LiteralNames[type] ?? "";
                if (literalText != "")
                {
                    ast.text = literalText.Substring(1, literalText.Length - 2);
                }
                else
                {
                    ast.text = text;
                }
            }
            return(ast);
        }
Exemplo n.º 2
0
 /// <summary>
 /// Constructs the AST recursively from the ANTLR Java Parser classes.
 /// </summary>
 /// <param name="ctx"></param>
 /// <returns></returns>
 public static JavaAST ConstructAST(TerminalNodeImpl ctx)
 {
     if (literals.Contains(ctx.Symbol.Type))
     {
         return(JavaAST.CreateToken(ctx.Symbol.Type, ctx.GetText()));
     }
     else
     {
         return(JavaAST.CreateToken(ctx.Symbol.Type));
     }
 }
Exemplo n.º 3
0
        /// <summary>
        /// Constructs the AST recursively from the ANTLR Java Parser classes.
        /// </summary>
        /// <param name="ctx"></param>
        /// <returns></returns>
        public static JavaAST ConstructAST(ParserRuleContext ctx)
        {
            if (ctx.children != null)
            {
                if (ctx.children.Count > 1)
                {
                    var ast = JavaAST.CreateRule(ctx.RuleIndex);

                    foreach (var child in ctx.children)
                    {
                        var childCtx = child;

                        if (childCtx is ParserRuleContext)
                        {
                            var childAst = ConstructAST(childCtx as ParserRuleContext);
                            if (childAst != null)
                            {
                                ast.Children.Add(childAst);
                            }
                        }
                        if (childCtx is TerminalNodeImpl)
                        {
                            var childAst = ConstructAST(childCtx as TerminalNodeImpl);
                            if (childAst != null)
                            {
                                ast.Children.Add(childAst);
                            }
                        }
                    }

                    return(ast);
                }
                else if (ctx.children.Count == 1)
                {
                    if (ctx.children[0] is ParserRuleContext)
                    {
                        return(ConstructAST(ctx.children[0] as ParserRuleContext));
                    }
                    else
                    {
                        return(ConstructAST(ctx.children[0] as TerminalNodeImpl));
                    }
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                return(null);
            }
        }
Exemplo n.º 4
0
        public static JavaAST CreateRule(int type, params JavaAST[] children)
        {
            JavaAST ast = new JavaAST();

            ast.isRule = true;
            ast.type   = type;
            ast.text   = "";
            if (children != null)
            {
                ast.children.AddRange(children);
            }
            return(ast);
        }
Exemplo n.º 5
0
        public JavaAST Parse(string filePath)
        {
            var code = File.ReadAllText(filePath);

            var stream = CharStreams.fromString(code);
            var lexer  = new Java8Lexer(stream);
            var tokens = new CommonTokenStream(lexer);
            var parser = new Java8Parser(tokens);

            parser.BuildParseTree = true;

            var cu = parser.compilationUnit();

            return(JavaAST.ConstructAST(cu));
        }
Exemplo n.º 6
0
        public JavaAST Desugar(JavaAST ast)
        {
            if (ast == null)
            {
                return(null);
            }


            // De-sugar a basic for loop into a while loop.
            //
            if (ast.Rule == Java8Parser.RULE_basicForStatement)
            {
                return(JavaAST.CreateRule(Java8Parser.RULE_block,
                                          JavaAST.CreateToken(Java8Lexer.LBRACE),
                                          JavaAST.CreateRule(Java8Parser.RULE_blockStatements,
                                                             Desugar(ast.Children[2]), // for loop variable declaration
                                                             JavaAST.CreateToken(Java8Lexer.SEMI),
                                                             JavaAST.CreateRule(Java8Parser.RULE_whileStatement,
                                                                                JavaAST.CreateToken(Java8Lexer.WHILE),
                                                                                JavaAST.CreateToken(Java8Lexer.LPAREN),
                                                                                Desugar(ast.Children[4]), // for loop condition
                                                                                JavaAST.CreateToken(Java8Lexer.RPAREN),
                                                                                JavaAST.CreateRule(Java8Parser.RULE_block,
                                                                                                   JavaAST.CreateToken(Java8Lexer.LBRACE),
                                                                                                   Desugar(ast.Children[8]), // for loop block
                                                                                                   Desugar(ast.Children[6]), // for loop increment
                                                                                                   JavaAST.CreateToken(Java8Lexer.SEMI),
                                                                                                   JavaAST.CreateToken(Java8Lexer.RBRACE)
                                                                                                   )
                                                                                )
                                                             ),
                                          JavaAST.CreateToken(Java8Lexer.RBRACE)
                                          ));
            }

            // De-sugar a do-while loop into a while loop
            //
            if (ast.Rule == Java8Parser.RULE_doStatement)
            {
                return(JavaAST.CreateRule(Java8Parser.RULE_block,
                                          JavaAST.CreateToken(Java8Lexer.LBRACE),
                                          JavaAST.CreateRule(Java8Parser.RULE_blockStatements,
                                                             Desugar(ast.Children[1]), // do-while block
                                                             JavaAST.CreateToken(Java8Lexer.SEMI),
                                                             JavaAST.CreateRule(Java8Parser.RULE_whileStatement,
                                                                                JavaAST.CreateToken(Java8Lexer.WHILE),
                                                                                JavaAST.CreateToken(Java8Lexer.LPAREN),
                                                                                Desugar(ast.Children[4]), // do-while loop condition
                                                                                JavaAST.CreateToken(Java8Lexer.RPAREN),
                                                                                Desugar(ast.Children[1])  // do-while block (this will be repeated under the while block
                                                                                )
                                                             ),
                                          JavaAST.CreateToken(Java8Lexer.RBRACE)
                                          ));
            }

            // Default case: recursively desugar all children.
            //
            if (ast.IsRule)
            {
                var newChildren = new List <JavaAST>();

                foreach (var child in ast.Children)
                {
                    newChildren.Add(Desugar(child));
                }

                return(JavaAST.CreateRule(ast.Rule, newChildren.ToArray()));
            }
            else
            {
                return(JavaAST.CreateToken(ast.Token, ast.Text));
            }
        }