Antlr4学习 —— 关键的"单词"(术语)
in 默认分类 with 0 comment

好的!学习 ANTLR4 和语法分析时,确实需要掌握一些关键的"单词"(术语)。这些术语不仅用于 ANTLR4,在整个编译原理和语言处理领域都很常见。

让我为你系统性地讲解这些核心术语:

1. 语言结构相关术语

程序结构术语

术语英文含义示例
ProgramProgram完整的程序int x = 5; print(x);
StatementStatement语句,执行一个动作x = 10; if (x > 5) {...}
ExpressionExpression表达式,产生一个值x + 5 calculate(10)
DeclarationDeclaration声明,引入新标识符int x; function foo() {}
DefinitionDefinition定义,包含实现的声明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 TreeParse Tree解析树,显示语法结构
ASTAbstract Syntax Tree抽象语法树,简化后的解析树
ContextContext上下文,表示规则匹配的信息
ProductionProduction产生式,语法规则的右边部分
AlternativeAlternative备选分支,用 `` 分隔的选项

规则设计术语

术语含义示例
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. 学习路径建议

第一阶段:基础术语

先掌握这些核心概念:

  1. Program - 程序
  2. Statement - 语句
  3. Expression - 表达式
  4. Declaration - 声明
  5. 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
├── Declaration (函数、变量声明)
├── Statement (可执行语句)
│   ├── Control (if/while/for)
│   ├── Assignment (赋值)
│   └── ExpressionStmt (表达式语句)
└── Expression (产生值的代码)
    ├── Logical (逻辑运算)
    ├── Relational (关系运算)
    ├── Additive (加减)
    └── Multiplicative (乘除)

这些术语是理解和使用 ANTLR4 的基础。建议你通过实际编写语法规则来熟悉它们,比如尝试为一个小型语言定义语法,在实践中掌握这些概念。