caclite parser代码生成详解

caclite parser代码生成详解

本文代码均已上传到gitee
caclite的parser代码生成分为如下两个步骤

image.png

生成Parse.jj

文件目录如下

├── pom.xml
└── src
    ├── main
    │   ├── codegen
    │   │   ├── config.fmpp
    │   │   ├── includes
    │   │   │   ├── compoundIdentifier.ftl
    │   │   │   └── parserImpls.ftl
    │   │   └── templates
    │   │       └── Parser.jj

添加calcite dependency

        
            org.apache.calcite
            calcite-core
        

配置drill-fmpp-maven-plugin插件如下

            
                org.apache.drill.tools
                drill-fmpp-maven-plugin
                
                    
                        
                            src/main/codegen/config.fmpp
                            ${project.build.directory}/generated-sources/fmpp
                            src/main/codegen/templates
                        
                        generate-fmpp-sources
                        validate
                        
                            generate
                        
                    
                
            

codegen 模块的文件都拷贝自对应版本的calclite core/src/main/codegen路径 https://github.com/apache/calcite/tree/main/core/src/main/codegen

然后把https://github.com/apache/calcite/blob/main/core/src/main/codegen/default_config.fmpp 中的parser属性与config.fmpp中的parser属性合并。就可以通过mvn package命令生成Parser.jj了。当然,如果有定制化修改的需求,也可以在这个阶段修改config.fmpp

image.png

Parser.jj生成java代码

文件目录如下

├── pom.xml
├── src
│   ├── main
│   │   ├── codegen
│   │   │   └── Parser.jj

Parser.jj就是我们上一步生成的Parser.jj,如果有什么想要的定制化修改,也可以在这个步骤改入到Parser.jj中。

添加calcite dependency

        
            org.apache.calcite
            calcite-core
        

配置javacc-maven-plugin如下

            
                org.codehaus.mojo
                javacc-maven-plugin
                
                    
                        javacc
                        
                            javacc
                        
                        
                            ${project.basedir}/src/main/codegen
                            
                                **/Parser.jj
                            
                        
                    
                
            

生成代码

image.png

无Parser.jj定制化修改,一步生成

如果不需要对Parser.jj进行定制化修改,那么可以通过连续运行两个插件来生成代码,这里给出pom文件样例,不再赘述

            
                org.apache.drill.tools
                drill-fmpp-maven-plugin
                
                    
                        
                            src/main/codegen/config.fmpp
                            ${project.build.directory}/generated-sources/fmpp
                            src/main/codegen/templates
                        
                        generate-fmpp-sources
                        validate
                        
                            generate
                        
                    
                
            
            
                org.codehaus.mojo
                javacc-maven-plugin
                
                    
                        javacc
                        
                            javacc
                        
                        
                            ${project.build.directory}/generated-sources/fmpp
                            
                                **/Parser.jj
                            
                            2
                            false
                        
                    
                    
                        javacc-test
                        generate-test-sources
                        
                            javacc
                        
                        
                            ${project.build.directory}/generated-test-sources/fmpp
                            ${project.build.directory}/generated-test-sources/javacc
                            
                                **/Parser.jj
                            
                            false
                            true
                            true
                        
                    
                
            

你可能感兴趣的:(caclite parser代码生成详解)