`

antlr parse oracle store procedure

 
阅读更多
build.bat
antlr4 Cymbol.g4
javac *.java
run Cymbol file -gui test1.sp

dot -Tpng dot.gv -o dot.png


g4
/** Simple statically-typed programming language with functions and variables
 *  taken from "Language Implementation Patterns" book.
 */
grammar Cymbol;

file:   packageDeclaration functionDecl* 'END' ID ';';

packageDeclaration
	:	'CREATE' 'OR' 'REPLACE' 'PACKAGE' 'BODY' qualifiedName 'AS'
	
	;
	
functionDecl
    :   'FUNCTION' ID ('(' formalParameters? ')')? 'RETURN' oracleType 'IS' varDecl* block 
	// FUNCTION IS_FIXED_INCOME( CUSIPID_IN IN VARCHAR2) RETURN BOOLEAN is type defs begin ... end IS_FIXED_INCOME;
    ;	
	
varDecl
    :   ID oracleType ';'
    ;
	
formalParameters
    :   formalParameter (',' formalParameter)*
    ;
formalParameter
    :   ID 'IN'? 'OUT'? oracleType ('DEFAULT' ID)?
    ;	
subBlock:  'BEGIN' stat+ 'END' ';';   
block:  'BEGIN' stat+ 'END' ID ';';   
	
qualifiedName
    :   ID ('.' ID)*
    ;	
	
oracleType : ('INT'|'NUMBER'|'VARCHAR2'|'VARCHAR'|'NVARCHAR2') ('(' DIGIT+ ')')*
			| ('NUMBER') ('(' DIGIT+ ',' DIGIT+ ')')
			| ('DATE')
			| ('BLOB')
			| ('CLOB')
                        | ('BOOLEAN')
			| ('TIMESTAMP')
			| ('REF') ('CURSOR')
			| qualifiedName ('%TYPE')
			| qualifiedName
			;	

stat:   subBlock 
    |   if_stat
    |   insert_stat
    |   delete_stat
    |   update_stat 
    |   select_stat
    |   'RETURN' expr? ';' 
    |   expr ':=' expr ';'  // assignment
    |   expr ';'          // func call
    ;

if_stat: 'IF' expr 'THEN' stat ('ELSIF' stat)? ('ELSE' stat)? 'END' 'IF' ';';
insert_stat: 'INSERT' .*? ';'; 
delete_stat: 'DELETE' .*? ';'; 
update_stat: 'UPDATE' .*? ';'; 
select_stat: 'SELECT' .*? ';'; 

expr:   ID '(' exprList? ')'    # Call   
    |   '-' expr                # Negate
    |   '!' expr                # Not
    |   expr '*' expr           # Mult
    |   expr ('+'|'-') expr     # AddSub
    |   expr '=' expr  			# IfCond
    |   expr '==' expr          # Equal
    |   expr '||' expr          # Contact
    |   ID                      # Var
    |   INT                     # Int
    |   '\'' ID '\''            # Parens
    |   '(' expr ')'            # Parens
    ;

exprList : expr (',' expr)* ;   // arg list	
			
ID  :   Letter (Letter | [0-9] | '_')* ;	
DIGIT : [0-9];
	
fragment
Letter :  [a-zA-Z];

fragment
JavaIDDigit
    :  '\u0030'..'\u0039' |
       '\u0660'..'\u0669' |
       '\u06f0'..'\u06f9' |
       '\u0966'..'\u096f' |
       '\u09e6'..'\u09ef' |
       '\u0a66'..'\u0a6f' |
       '\u0ae6'..'\u0aef' |
       '\u0b66'..'\u0b6f' |
       '\u0be7'..'\u0bef' |
       '\u0c66'..'\u0c6f' |
       '\u0ce6'..'\u0cef' |
       '\u0d66'..'\u0d6f' |
       '\u0e50'..'\u0e59' |
       '\u0ed0'..'\u0ed9' |
       '\u1040'..'\u1049'
   ;	
   
INT :   [0-9]+ ;   
  
WS  :   [ \t\n\r]+ -> skip ;   


SL_COMMENT
    :   '--' .*? '\n' -> skip
    ;
	
COMMENT
    :   '/*' .*? '*/'    -> channel(HIDDEN) // match anything between /* and */
    ;
	
/*   
varDecl
    :   type ID ('=' expr)? ';'
    ;
type:   'float' | 'int' | 'void' ; // user-defined types



K_FLOAT : 'float';
K_INT   : 'int';
K_VOID  : 'void';

fragment
LETTER : [a-zA-Z] ;






*/


test sp

CREATE OR REPLACE 
PACKAGE BODY ANTLR1
AS
FUNCTION F1
  RETURN BOOLEAN
IS
  ASSETTYPE VARCHAR2(10);
BEGIN
  ASSETTYPE := 'X';
  BEGIN
    IF (ASSETTYPE = 'E') THEN
      RETURN FALSE;
    ELSE
      RETURN TRUE;
    END IF;
  END;
  ASSETTYPE := ASSETTYPE || 'YYY';
  F1();
END F1;

FUNCTION F2(
    CUSIPID_IN IN VARCHAR2 ,
    A          IN VARCHAR2)
  RETURN BOOLEAN
IS
  ASSETTYPE VARCHAR2(10);
BEGIN
  --SELECT AUTHOR INTO ASSETTYPE FROM BASELINE WHERE AUTHOR = CUSIPID_IN;
  IF (ASSETTYPE = 'E') THEN
    RETURN FALSE;
  ELSE
    RETURN TRUE;
  END IF;
END F2;
FUNCTION F3(
    CUSIPID_IN IN VARCHAR2 )
  RETURN BOOLEAN
IS
  ASSETTYPE VARCHAR2(10);
BEGIN
  ASSETTYPE := '3';
  --SELECT AUTHOR INTO ASSETTYPE FROM BASELINE WHERE AUTHOR = CUSIPID_IN;
  IF (ASSETTYPE = 'E') THEN
    RETURN FALSE;
  ELSE
    RETURN TRUE;
  END IF;
  F2();
END F3;

FUNCTION F4(
    CUSIPID_IN IN VARCHAR2,
    V_BATCH_MODE2 OUT VARCHAR,    --BATCH WS/CTF PROCESSING MODE OR NOT
    V_BATCH_MODE3    IN OUT VARCHAR, --BATCH WS/CTF PROCESSING MODE OR NOT
    V_WASH_INIT_FLAG IN BOOLEAN DEFAULT FALSE,
    V_ALT_LOT_NUM    IN VARCHAR2 DEFAULT NULL)
  RETURN BOOLEAN
IS
  ASSETTYPE VARCHAR2(10);
  A BOOLEAN;
  
BEGIN
	ASSETTYPE := '4';
  A := F3('XXX');
	/*
  SELECT AUTHOR INTO ASSETTYPE FROM BASELINE WHERE AUTHOR = CUSIPID_IN;
  BEGIN
    UPDATE BASELINE SET ID = 1 WHERE 1 = 0;
  END;
  DELETE FROM BASELINE WHERE 1 = 0;
  IF (ASSETTYPE = 'E') THEN
    RETURN FALSE;
  ELSE
    RETURN TRUE;
  END IF;
  */
END F4;
/*
PROCEDURE TEST1(
    V_BATCH_MODE IN VARCHAR,      --BATCH WS/CTF PROCESSING MODE OR NOT
    V_BATCH_MODE2 OUT VARCHAR,    --BATCH WS/CTF PROCESSING MODE OR NOT
    V_BATCH_MODE3    IN OUT VARCHAR, --BATCH WS/CTF PROCESSING MODE OR NOT
    V_WASH_INIT_FLAG IN BOOLEAN DEFAULT FALSE,
    V_ALT_LOT_NUM    IN VARCHAR2 DEFAULT NULL)
IS
  TEMP_STR VARCHAR2(500);
  TEMP_BL  BOOLEAN;
BEGIN
  TEMP_BL := F1();
  INSERT INTO Z_LARGETABLE2
    ( ID, ID2
    ) VALUES
    ( 5, 2
    );
  TEMP_BL := F1;
  TEMP_BL := IS_FIXED_INCOME('XX');
  --COMM[HGHJGJG]IT;
END TEST1;
*/
END ANTLR1;




/***
 * Excerpted from "The Definitive ANTLR 4 Reference",
 * published by The Pragmatic Bookshelf.
 * Copyrights apply to this code. It may not be used to create training material, 
 * courses, books, articles, and the like. Contact us if you are in doubt.
 * We make no guarantees that this code is fit for any purpose. 
 * Visit http://www.pragmaticprogrammer.com/titles/tpantlr2 for more book information.
***/
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.misc.MultiMap;
import org.antlr.v4.runtime.misc.OrderedHashSet;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import org.stringtemplate.v4.ST;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Set;

public class Test {
    public static void main(String[] args) throws Exception {
        String inputFile = null;
        if ( args.length>0 ) {
        	inputFile = args[0];
        }
        else {
//        inputFile = "src/t.cymbol";
        	inputFile = "src/test1.sp";
        }
        InputStream is = System.in;
        if ( inputFile!=null ) {
            is = new FileInputStream(inputFile);
        }
        ANTLRInputStream input = new ANTLRInputStream(is);
        CymbolLexer lexer = new CymbolLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        CymbolParser parser = new CymbolParser(tokens);
        parser.setBuildParseTree(true);
        
        ParseTree tree = parser.file();
        // show tree in text form
        System.out.println(tree.toStringTree(parser));
        
        // Here's another example that uses StringTemplate to generate output
//        System.out.println(collector.graph.toST().render());
    }
}
分享到:
评论

相关推荐

    ANTLR-V3 ORACLE11G GRAMMAR

    在"ANTLR-V3 ORACLE11G GRAMMAR"中,我们可能会遇到以下关键知识点: 1. **ANTLR 语法**:ANTLR 使用一种称为“扩展巴科斯范式”(EBNF)的表示法来定义语法规则。这些规则由一系列的符号和操作符组成,允许开发者...

    antlr解析sql

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。在SQL解析领域,ANTLR被广泛应用于构建能够理解SQL语句的解析器。这个项目的目标是...

    使用antlrv3实现sql的解析

    在本主题中,“使用antlrv3实现sql的解析”指的是利用ANTLR v3版本来创建一个解析器,该解析器可以理解并解析SQL语句,特别是针对Oracle和Microsoft SQL Server(MSSQL)的语法。 ANTLR工作原理主要包括以下几个...

    java Antlr 4 语法文件合集

    Antlr 4 的核心概念主要包括语法(Grammar)、解析树(Parse Tree)和访问者模式(Visitor Pattern)。语法文件通常以 `.g4` 扩展名结尾,这些文件定义了语言的语法规则。在 grammars-v4-master 压缩包中,你可能会...

    antlr-2.7.7.jar.zip

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种编程语言的编译器和解释器的构建,它能生成Java、C#、Python...

    ANTLR

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,包括SQL解析器、XML处理器以及各类编程语言的...

    antlr-2.7.7.jar和antlr-2.7.6.jar

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种编程语言的编译器和解释器的构建,它能生成Java、C#、Python...

    Antlr4 C++ 计算器

    ANTLR4 是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,包括SQL、Java、C#、JavaScript、Python等。在本项目中,"Antlr4 C++ 计算器"是一个基于...

    antlr-2.7.7.jar

    antlr-2.7.7

    The Definitive ANTLR 4 Reference.pdf_antlr_

    从标题“Definitive ANTLR 4 Reference”和描述“ANTLR 4的权威参考”可以看出,这本书详细介绍了ANTLR 4的所有核心功能和特性,是学习和使用ANTLR 4的重要资源。 ANTLR 4的主要特点包括: 1. **高级语法定义**:...

    The Definitive ANTLR 4 Reference

    In this book, you'll learn how ANTLR automatically builds a data structure representing the input (parse tree) and generates code that can walk the tree (visitor). You can use that combination to ...

    开源项目-antlr-antlr4.zip

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于构建语言、工具和框架,如SQL处理器、Java源码分析器、XML解析器...

    antlr-2.7.7源码

    antlr 2.7.7源码,下载自:http://repo.spring.io/plugins-release/org/antlr/com.springsource.antlr/2.7.7/

    antlr4 .7.1的complete 和 runtime

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种编程语言的解析任务,如构建编译器、解释器、查询处理器以及...

    antlr.jar-2.7.6

    WebLogic是Oracle公司的一款企业级应用服务器,它提供了许多服务,如JMS(Java消息服务)、EJB(Enterprise JavaBeans)、JDBC(Java数据库连接)等。在部署和管理基于Hibernate的Java应用时,ANTLR可能会被用来解析...

    Antlr入门介绍小demo

    ANTLR 入门介绍小 demo ANTLR(ANother Tool for Language Recognition,另一个语言识别工具)是一种强大的解析器生成器,用于读取、处理、执行或翻译结构化的文本或二进制文件。ANTLR 广泛应用于 DSL(领域特定...

    antlr4-master 源码

    ANTLR4(ANTLR Version 4)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,包括SQL解析器、配置文件解析器、DSL(领域特定语言)以及各种编程...

Global site tag (gtag.js) - Google Analytics