词法分析和语法分析(例子)
让我们以一个简单的例子来说明词法分析和语法分析的过程,假设我们有一个非常基础的编程语言片段:
x = 3 + 5
词法分析(Lexical Analysis):
- 读取源代码: 系统首先读取这行代码的字符流。
- 分割和识别词法单元:
x
被识别为一个标识符(Identifier)。=
被识别为赋值运算符(Assignment Operator)。3
被识别为整型字面量(Integer Literal)。+
被识别为加法运算符(Addition Operator)。5
再次被识别为整型字面量。- 代码中的空白字符(如空格)和换行符在词法分析阶段通常会被忽略,除非它们在某些语言中具有特殊意义。
输出的词法单元序列可能是:[Identifier('x'), AssignmentOperator('='), IntegerLiteral('3'), AdditionOperator('+'), IntegerLiteral('5')]
。
语法分析(Syntactic Analysis):
接下来,语法分析器会根据这些词法单元构建抽象语法树(AST):
-
应用语法规则:
- 可能的规则之一是表达式语句的结构,比如
assignment_statement -> identifier '=' expression
。 expression
又可以细分为更简单的结构,如expression -> term '+' term
,其中term
可以是integer_literal
。
- 可能的规则之一是表达式语句的结构,比如
-
构建抽象语法树:
- 根据上述规则,构造出的AST可能如下
( assignment ├── identifier: 'x' └── expression ├── term │ └── integer_literal: '3' └── addition_operator: '+' └── term └── integer_literal: '5' )
在这个过程中,语法分析器确保了表达式x = 3 + 5
符合语言的语法规则,形成了一个有效的赋值语句结构。如果不符合规则,比如写成x = 3 + + 5
,语法分析器就会报告错误,指出多余的运算符。
ANTLR4
ANTLR4 是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于 构建领域特定语言(DSL)。以下是一个使用ANTLR4构建简单DSL的示例,这个DSL用于执行基本的算术运算。
步骤 1: 定义语法规则 (Calculator.g4)
首先,你需要定义你的DSL的语法规则。创建一个名为Calculator.g4
的文件,并输入以下内容:
grammar Calculator; expr: expr op=('+'|'-') expr # AddSub | expr op=('*'|'/') expr # MulDiv | INT # Number | '(' expr ')' # Parens ; op: '+' | '-'; INT: [0-9]+; WS: [ \t\r\n]+ -> skip;
这个规则定义了一个简单的四则运算表达式的解析规则,包括加减乘除和括号。
详细版:定义 Calculator.g4grammar Calculator; /* * Parser Rules */ calculation: expression EOF; expression : expression '+' term # Addition | expression '-' term # Subtraction | term # BaseExpression ; term : term '*' factor # Multiplication | term '/' factor # Division | factor # BaseTerm ; factor : INT # IntegerNumber | '(' expression ')' # Parentheses ; /* * Lexer Rules */ INT: [0-9]+ ; WS: [ \t\r\n]+ -> skip ; /* * Parser Rule Definitions (if any custom behavior is needed) */ ...
标签:分析,term,语法分析,expr,Calculator,词法,expression From: https://www.cnblogs.com/wxdlut/p/18206825