简介:本文档为词法分析实验报告,详细记录了实验过程、结果及分析,旨在帮助读者理解词法分析的基本原理和实践方法。
【问题描述】请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,并记录其单词类别及值。输入输出及处理要求如下:
(1)数据结构与语法分析程序接口自行定义;类别码需按以下格式统一定义;
(2)为了方便自动评测,输入的被编译源文件命名为testfile.txt;输出结果文件名为output.txt,每行按照“单词类别码 单词字符/字符串形式”的方式组织。例如:
标识符 IDENFR
else ELSETK
- MINU
= ASSIGN
整形常量 INTCON
switch SWITCHTK
* MULT
; SEMICN
字符常量 CHARCON
case CASETK
/ DIV
, COMMA
字符串 STRCON
default DEFAULTTK
< LSS
( LPARENT
const CONSTTK
while WHILETK
<= LEQ
) RPARENT
int INTTK
for FORTK
> GRE
[ LBRACK
char CHARTK
scanf SCANFTK
>= GEQ
] RBRACK
void VOIDTK
printf PRINTFTK
== EQL
{ LBRACe
main MAINTK
return RETURNTK
!= NEQ
} RBRACE
if IFTK
+ PLUS
: COLON
【输入形式】testfile.txt中的符合文法要求的测试程序。
【输出形式】词法分析结果需输出至output.txt中。
(1)读取字符串时要保持原样,特别是数字。这里的“单词值”实际上是读入的字符串,并非真正的数值。
(2)本次作业只考核正确程序处理,但需要为可能出现的错误情况预留接口。
(3)在后续错误处理任务中需输出行号,在词法分析阶段注意记录该信息。
(4)单词类别及值等重要信息应在词法分析获取后进行记录;当前要求仅用于评测。
【文法定义】请参阅“2020年文法定义”作业查看具体规则。
【样例输入】
```cpp
coNst int cONst1 = 001, const2 = -100;
const char const3 = _;
int change1;
char change3;
int gets1(int var1,int var2)
{
change1 = var1 + var2; return (change1);
}
void main()
{
printf(Hello World);
printf(gets1(10, 20));
}
```
【样例输出】
```cpp
CONSTTK coNst
INTTK int
IDENFR cONst1
ASSIGN =
INTCON 001
COMMA ,
IDENFR const2
ASSIGN =
MINU -
INTCON 100
SEMICN ;
CONSTTK const
CHARTK char
IDENFR const3
ASSIGN =
CHARCON _
SEMICN ;
INTTK int
IDENFR change1
SEMICN ;
CHARTK char
IDENFR change3
SEMICN ;
INTTK int
IDENFR gets1
LPARENT (
INTTK int
IDENFR var1
COMMA ,
INTTK int
IDENFR var2
RPARENT )
LBRACE {
IDENFR change1
ASSIGN =
IDENFR var1
PLUS +
IDENFR var2
SEMICN ;
RETURNTK return
LPARENT (
IDENFR change1
RPARENT )
SEMICN ;
RBRACE }
VOIDTK void
MAINTK main
LPARENT (
RPARENT )
LBRACE {
PRINTFTK printf
LPARENT (
STRCON Hello World
RPARENT )
SEMICN ;
PRINTFTK printf
```