java parser
java parser是什么,让我们一起了解一下?罩斗闷
Java Parser是基于JavaCC作为Java语言词法解析的工具,支持Java语言生成AST(Abstract Syntax Tree抽象语法树),在AST基础上进行类型推断分析,支持修改AST从而生成新的Java文件内容,支持从Java 1.0到14所有的版本的AST解析。
AST结构允许以一种简单的编程方式使用Java代码。可以专门操作Java文件,使用起来也更简单物弯。它提供了一种方便的机制,可以使用我们称为“访客支持”的功能来导航树。这使开发人员能够专注于在源代码中识别有趣的模式,销缺而不必编写费力的树遍历代码。该库的最终主要功能是能够操纵源代码的基础结构。然后可以将其写入文件,为开发人员提供构建自己的代码生成软件的便利。
那么我们使用JavaParser theere时,总是希望进行很多操作。
例如,我们希望对整个项目进行操作,因此在给定目录的情况下,我们将探索所有Java文件。 此类应有助于完成此任务:
package me.tomassetti.support; import java.io.File; public class DirExplorer { public interface FileHandler { void handle(int level, String path, File file); } public interface Filter { boolean interested(int level, String path, File file); } private FileHandler fileHandler; private Filter filter; public DirExplorer(Filter filter, FileHandler fileHandler) { this.filter = filter; this.fileHandler = fileHandler; } public void explore(File root) { explore(0, "", root); } private void explore(int level, String path, File file) { if (file.isDirectory()) { for (File child : file.listFiles()) { explore(level + 1, path + "/" + child.getName(), child); } } else { if (filter.interested(level, path, file)) { fileHandler.handle(level, path, file); } } } }
对于每个Java文件,我们首先要为每个Java文件构建一个抽象语法树(AST),然后对其进行导航。 这样做有两种主要策略:
1、使用访客:要在特定类型的AST节点上进行操作时,这是正确的策略。
2、使用递归迭代器:这允许处理所有类型的节点。
请问怎么用java一行一行的读取ini文件,然后进行内容匹配,最后输出一个list? 已有的是一个
你好,你的问题是:如何在一个class里使销洞吵用另一个class的应用。
先看你Parser类上方四行代码
package parseme;
import java.util.ArrayList;
import java.util.Calendar;
import java.io.*;
public class Parser {
private static ArrayListPerson personen = new ArrayList();
//...
}
Java里的关键字import,意思是导入类(无需后缀.class)。即你可以在导入某个类之后,按照规范调用该类的属性和行为。表现为:
import packageName.ClassName;
//如上述代码,Parser中定义了Person类的集合personen
packageName就是代码第一行的,称为“包名”,简单理解就是路径
package parseme;
Java规范允许同一包下的类在互相使用时无需显示导入类(另默认导入了java.lang路径下的所有类)。所以Parser类可以在代码中直接调用Person类。因为它们属于同亏侍一路径
package parseme;
//import ...
public class Person{
//...
}
使用另一个类的应用(属性和行为),你可以看到Parser类中的parse方法
Person p = new Person(vname, nname, birthd);
//...
System.out.println(p);
//等等,均为你所说的使用另一个类的应用
类中成员表现形式有两种:类变量/方法和实例变量/方法
类变量通常用static关键词修饰,如
System.out.println(p);//System是java.lang包下的类,out是System中一个由static修饰颤闷过的变量(类变量),out本身是一个实例,它提供了实例方法println()。
实例变量只允许类的对象使用,如
Person p = new Person(vname, nname, birthd);//实例化Person、新建Person对象
//Person类中有许多没有static关键词修饰的变量和方法,只有实例化之后才可以使用它们。
p.toString();
利用JAVACC将HQL-SQL
首先下载JAVACC 编写 jj文件 定义要空开的分隔符SKIP :{ | \t | \n | \r | \f } 定义关键字 from 为HQL的关键字 Teacher是用户输入的类名 应当是一个喊梁宏任意由字母和数字组成的单词 我们可以用正则表达式:[ A Z a z ]来表示 TOKEN: /*RESERVED TOKENS FOR UQL */{FROM: from | FROM_OBJECT:([ A Z a z ])+ } 接下来定义一下输入的顺序与规范void expression() :{ Token tTable;}{ ( FROM tTable = FROM_OBJECT ) { sqlSB append( SELECT * ); sqlSB append( FROM ) append(tTable image); }}最后就是写解析代码 以便生成java代码PARSER_BEGIN(HQLParser)import java lang StringBuffer;import java io StringReader;import java io Reader;public class HQLParser {private static StringBuffer sqlSB;/**A String based constructor for ease of use **/public HQLParser(String s) 郑册{this((Reader)(new StringReader(s))); sqlSB = new StringBuffer();}public String getSQL(){return sqlSB toString();} public static void main(String args[]){try{ String query = args[ ]; HQLParser parser = new HQLParser(query); parser parse(); System out println( SQL: +parser getSQL());}catch(Exception e){渣雹 e printStackTrace();}}public void parse(){ try { expression(); } catch(Exception e){e printStackTrace();}}}PARSER_END(HQLParser)接下来到dos下输入:javacc debug_parser test jj debug_parser:用来输出语法树这时候会生成 个java文件 每个文件的作用以后会详细说明这时候只需要javac * java即可编译全部的java文件然后执行java HQLParser from Teacher 这时候屏幕上就会显示出 select * from Teacher lishixinzhi/Article/program/Java/JSP/201311/19735