# 编译原理 **Repository Path**: mushan_1900/compilation-principle ## Basic Information - **Project Name**: 编译原理 - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 0 - **Created**: 2021-12-27 - **Last Updated**: 2024-12-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: 编译原理, 武汉理工大学 ## README # 武汉理工大学 编译原理 ### 介绍 本代码适用于 武汉理工大学 编译原理课程实验中的四个实验 四个文件夹对应四个实验:NFA转DFA、词法分析实验、语法分析实验、正规式转化为NFA ### NFA转DFA 输入: ``` const int const1 = 1, 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)); } ``` 输出: ``` X X-a->0 X-b->1 Y Y-a->0 Y-b->1 0 0-a->0 0-b->2 1 1-a->0 1-b->1 2 2-a->0 2-b->Y ``` 转换逻辑参考链接:[Here](https://blog.csdn.net/weixin_43655282/article/details/108963761) ### 词法分析实验 输入: ``` const int const1 = 1, 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)); } ``` 输出: ``` CONSTTK const INTTK int IDENFR const1 ASSIGN = INTCON 1 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 LPARENT ( IDENFR gets1 LPARENT ( INTCON 10 COMMA , INTCON 20 RPARENT ) RPARENT ) SEMICN ; RBRACE } ``` ### 正规式转化为NFA 输入: ``` (a|b)*abb ``` 输出: ``` X X - ~ ->3 Y 0 0-a->1 1 1-b->2 2 2-b->Y 3 3-~->0 3-a->3 3-b->3 ``` ### 语法分析 输入: ``` const int const1 = 1, 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\n"); printf(gets1(10, 20)); } ``` 输出: ``` CONSTTK const INTTK int IDENFR const1 ASSIGN = INTCON 1 <无符号整数> <整数> 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\n <字符串> RPARENT ) <写语句> SEMICN ; <语句> PRINTFTK printf LPARENT ( IDENFR gets1 LPARENT ( INTCON 10 <无符号整数> <整数> <因子> <项> <表达式> COMMA , INTCON 20 <无符号整数> <整数> <因子> <项> <表达式> <值参数表> RPARENT ) <有返回值函数调用语句> <因子> <项> <表达式> RPARENT ) <写语句> SEMICN ; <语句> <语句列> <复合语句> RBRACE } <主函数> <程序> ```