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); }
/// <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)); } }
/// <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); } }
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); }
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)); }
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)); } }