javacc学习笔记:javacc基础语法学习

coverImg

学习资料

  • Apache Calcite教程 -目录(博客):https://blog.csdn.net/QXC1281/article/details/89070285
  • github地址:https://github.com/quxiucheng/apache-calcite-tutorial/tree/a7d63273d0c7585fc65ad250c99a67a201bcb8b5

代码拉下来后看这个工程,里面带上了README.md:

null

这部分带有javacc语法学习,吹爆


哪些应用在使用javacc?

来源:https://javacc.github.io/javacc/#introduction

null


语法二义性解决

void S():{}
{
    IFStat()
    |
    E();
}
void IFStat():{}
{
    "if" "(" E() ")"
    S()
    (
        "else" S();
    )?
}

描述:

if E if E S else S 

存在两种解释:

if E
   if E
     S
   else
     S   

以及

if E
   if E
     S
else
   S

可以借助LOOKAHEAD(K)关键字解决:

// 词法分析执行完if-S之后先找slse,找到则匹配最近的if,否则执行后面的语句
void S():{}
{
    IFStat()
    |
    E();
}
void IFStat():{}
{
    "if" "(" E() ")"
    S()
    (
        LOOKAHEAD(1)
        "else" S();
    )?
}

javacc语法

javacc官方资料:

  • javacc官网:https://javacc.github.io/javacc/

定义 Tokens

// TOKEN 块定义了词法规则。
TOKEN :
{
    // 每个 <...> 定义一个 token,并指定其匹配的字符串。
    < SELECT: "select" >
    | < UPDATE: "update" >
    | < DELETE: "delete" >
}

java代码

java代码块用{}声明

// 定义java代码块
// void javaCodeDemo(): {}:定义了一个名为 javaCodeDemo 的非终结符。
void javaCodeDemo():
{}
{  // {}:大括号内的内容是 Java 代码块,这里的代码会在解析过程中执行。
    {
        int i = 0;
        System.out.println(i);
    }
}

java函数

使用 JAVACODE 声明

// JAVACODE 关键字声明 Java 函数,并可以在解析过程中调用这些函数。
JAVACODE void print(Token t){
    System.out.println(t);
}

条件

if语句

// if语句
void ifExpr():
{}
{
    // [...]:表示可选部分(0次或1次)。
    [
        // <SELECT>:匹配一个标记为 SELECT 的 token。
        // {...}:包含 Java 代码块,在匹配到 SELECT 后执行。
        <SELECT>
        {
            System.out.println("if select");
        }
    ]

    // 循环,出现一次
    (<SELECT>)?
}

if else语句

// if - else
void ifElseExpr():
{}
{
    // (...):表示一组选择项。
    (
        // |:表示“或”的关系。
        <SELECT> {System.out.println("if else select");}
        |
        <UPDATE>  {System.out.println("if else update");}
        |
        <DELETE>  {System.out.println("if else delete");}
        |
        {
           System.out.println("other");
        }
    )
}

循环

while 0~n:

// while 0~n
void while1Expr():{
}
{
    // (<SELECT>)*:表示 SELECT 标记可以出现 0 次或多次。
    (<SELECT>)*
}

while 1~n:

// while 1~n
void while2Expr():{
}
{
    // (<SELECT>)+:表示 SELECT 标记必须至少出现 1 次,可以出现多次。
    (<SELECT>)+
}

正则表达式

1、[]: 内容可选

[ "a" | "b" ]  // a 或 b 可以出现 0 次或 1 次

2、+: 内容出现一次或者多次

("a")+  // "a" 必须至少出现 1 次

3、*: 内容出现0次或者多次

("a")*  // "a" 可以不出现,也可以出现多次

4、?: 内容出现0次或者一次

("a")?  // "a" 可以出现 0 次或 1 次

5、|: 或

"a" | "b"  // 匹配 "a" 或者 "b"

6、(): 优先级改变或者整体操作

("a" | "b") "c"  // 先匹配 "a" 或 "b",然后匹配 "c"

整理者:长路 时间:2024.10.29

评论区请在客户端页面查看