
学习资料
- Apache Calcite教程 -目录(博客):https://blog.csdn.net/QXC1281/article/details/89070285
- github地址:https://github.com/quxiucheng/apache-calcite-tutorial/tree/a7d63273d0c7585fc65ad250c99a67a201bcb8b5
代码拉下来后看这个工程,里面带上了README.md:

这部分带有javacc语法学习,吹爆
哪些应用在使用javacc?
来源:https://javacc.github.io/javacc/#introduction

语法二义性解决
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
评论区请在客户端页面查看