好的!学习 ANTLR4 和语法分析时,确实需要掌握一些关键的"单词"(术语)。这些术语不仅用于 ANTLR4,在整个编译原理和语言处理领域都很常见。
让我为你系统性地讲解这些核心术语:
1. 语言结构相关术语
程序结构术语
| 术语 | 英文 | 含义 | 示例 |
|---|
| Program | Program | 完整的程序 | int x = 5; print(x); |
| Statement | Statement | 语句,执行一个动作 | x = 10; if (x > 5) {...} |
| Expression | Expression | 表达式,产生一个值 | x + 5 calculate(10) |
| Declaration | Declaration | 声明,引入新标识符 | int x; function foo() {} |
| Definition | Definition | 定义,包含实现的声明 | int x = 5; function foo() { return 1; } |
具体语句类型
| 术语 | 含义 | G4 规则示例 |
|---|
| Assignment | 赋值语句 | assignment : ID '=' expr ';' ; |
| IfStatement | 条件语句 | ifStatement : 'if' '(' expr ')' stmt ('else' stmt)? ; |
| WhileStatement | 循环语句 | whileStatement : 'while' '(' expr ')' stmt ; |
| ReturnStatement | 返回语句 | returnStatement : 'return' expr? ';' ; |
| VariableDeclaration | 变量声明 | varDecl : type ID ('=' expr)? ';' ; |
| FunctionDeclaration | 函数声明 | funcDecl : 'function' ID '(' params? ')' block ; |
2. 表达式相关术语
表达式类型
| 术语 | 含义 | 示例 |
|---|
| AdditiveExpr | 加减表达式 | a + b, x - y |
| MultiplicativeExpr | 乘除表达式 | a * b, x / y |
| RelationalExpr | 关系表达式 | a > b, x <= y |
| EqualityExpr | 相等性表达式 | a == b, x != y |
| LogicalExpr | 逻辑表达式 | a && b, `x | | y` |
| UnaryExpr | 一元表达式 | -x, !flag |
| PrimaryExpr | 基本表达式 | 字面量、变量、括号表达式 |
表达式组件
| 术语 | 含义 | 示例 |
|---|
| Literal | 字面量 | 42, "hello", true |
| Identifier | 标识符 | 变量名、函数名 |
| Operator | 运算符 | +, -, *, /, = |
| Operand | 操作数 | 运算符作用的表达式 |
3. 语法分析核心术语
解析相关术语
| 术语 | 英文 | 含义 |
|---|
| Parse Tree | Parse Tree | 解析树,显示语法结构 |
| AST | Abstract Syntax Tree | 抽象语法树,简化后的解析树 |
| Context | Context | 上下文,表示规则匹配的信息 |
| Production | Production | 产生式,语法规则的右边部分 |
| Alternative | Alternative | 备选分支,用 ` | ` 分隔的选项 |
规则设计术语
| 术语 | 含义 | 示例 |
|---|
| Left Recursion | 左递归 | expr : expr '+' term ; |
| Right Recursion | 右递归 | list : element listRest ; |
| Direct Recursion | 直接递归 | 规则直接引用自身 |
| Indirect Recursion | 间接递归 | 通过其他规则间接引用自身 |
4. ANTLR4 特定术语
文件结构术语
| 术语 | 含义 |
|---|
| Grammar | 语法定义 |
| Lexer Rule | 词法规则(大写开头) |
| Parser Rule | 语法规则(小写开头) |
| Fragment | 片段规则,不生成独立 Token |
动作相关术语
| 术语 | 含义 |
|---|
| Listener | 监听器模式,自动遍历 |
| Visitor | 访问者模式,手动控制遍历 |
| Action | 嵌入的动作代码 |
| Label | 标签,用 # 标记分支 |
5. 完整术语表:从简单到复杂
初级术语(必须掌握)
// 基本程序结构
program : statement+ ;
statement : expressionStmt | declarationStmt | controlStmt ;
expression : term (('+' | '-') term)* ;
term : factor (('*' | '/') factor)* ;
中级术语
// 控制流和声明
controlStmt : ifStmt | whileStmt | forStmt | returnStmt ;
declarationStmt : varDecl | funcDecl ;
compoundStmt : block | switchStmt ;
// 表达式类型
additiveExpr : multiplicativeExpr (('+' | '-') multiplicativeExpr)* ;
relationalExpr : additiveExpr (('<' | '>' | '<=' | '>=') additiveExpr)* ;
logicalExpr : equalityExpr (('&&' | '||') equalityExpr)* ;
高级术语
// 复杂语言特性
classDecl : 'class' ID classBody ;
interfaceDecl : 'interface' ID interfaceBody ;
lambdaExpr : '(' paramList? ')' '->' expression ;
generics : '<' type (',' type)* '>' ;
annotation : '@' ID ( '(' elementValuePairs? ')' )? ;
6. 学习路径建议
第一阶段:基础术语
先掌握这些核心概念:
- Program - 程序
- Statement - 语句
- Expression - 表达式
- Declaration - 声明
- Assignment - 赋值
第二阶段:控制结构
// 学习这些语句类型
ifStatement : 'if' '(' condition ')' thenPart elsePart? ;
whileStatement : 'while' '(' condition ')' body ;
forStatement : 'for' '(' init? ';' condition? ';' update? ')' body ;
第三阶段:表达式层次
理解表达式的优先级层次:
expression : logicalOrExpr ;
logicalOrExpr : logicalAndExpr ('||' logicalAndExpr)* ;
logicalAndExpr : equalityExpr ('&&' equalityExpr)* ;
equalityExpr : relationalExpr (('==' | '!=') relationalExpr)* ;
// ... 继续向下
7. 实际应用示例
简单语言的完整术语应用
grammar MiniLanguage;
// 程序结构
program: (functionDecl | statement)+ EOF;
// 声明相关
functionDecl: 'func' ID '(' paramList? ')' block;
paramList: param (',' param)*;
param: type ID;
// 语句类型
statement: varDecl | assignment | ifStmt | whileStmt | returnStmt | exprStmt;
varDecl: 'var' type ID ('=' expression)? ';';
assignment: ID '=' expression ';';
ifStmt: 'if' '(' expression ')' statement ('else' statement)?;
whileStmt: 'while' '(' expression ')' statement;
returnStmt: 'return' expression? ';';
exprStmt: expression ';';
// 表达式层次
expression: logicalOrExpr;
logicalOrExpr: logicalAndExpr ('||' logicalAndExpr)*;
logicalAndExpr: equalityExpr ('&&' equalityExpr)*;
equalityExpr: relationalExpr (('==' | '!=') relationalExpr)*;
relationalExpr: additiveExpr (('<' | '>' | '<=' | '>=') additiveExpr)*;
additiveExpr: multiplicativeExpr (('+' | '-') multiplicativeExpr)*;
multiplicativeExpr: unaryExpr (('*' | '/' | '%') unaryExpr)*;
unaryExpr: ('!' | '-') unaryExpr | primaryExpr;
primaryExpr: literal | ID | '(' expression ')' | functionCall;
// 其他
functionCall: ID '(' argList? ')';
argList: expression (',' expression)*;
block: '{' statement* '}';
type: 'int' | 'float' | 'string' | 'bool';
literal: INT | FLOAT | STRING | BOOL;
8. 记忆技巧
分类记忆法
- 结构类:Program, Statement, Expression
- 声明类:Declaration, Definition, Parameter
- 控制类:If, While, For, Return
- 表达式类:Additive, Multiplicative, Logical
层次记忆法
Program
├── Declaration (函数、变量声明)
├── Statement (可执行语句)
│ ├── Control (if/while/for)
│ ├── Assignment (赋值)
│ └── ExpressionStmt (表达式语句)
└── Expression (产生值的代码)
├── Logical (逻辑运算)
├── Relational (关系运算)
├── Additive (加减)
└── Multiplicative (乘除)
这些术语是理解和使用 ANTLR4 的基础。建议你通过实际编写语法规则来熟悉它们,比如尝试为一个小型语言定义语法,在实践中掌握这些概念。
本文由 jxxxy 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。