# lrparser **Repository Path**: godelgnis/lrparser ## Basic Information - **Project Name**: lrparser - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2021-12-21 - **Last Updated**: 2024-06-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 词法说明 本实验只实现了部分简单的C语言语法成分,包括赋值语句、分支语句和循环语句。 赋值语句的语法为:变量=表达式; 分支语句的语法为:if(条件){ 语句串 } 循环语句的语法为:while(条件){ 语句串 } ---- ### 上下文无关文法描述 ``` E → main()T T → {F} F → G | B | C G → =A A → SA' A'→ +SA' | -SA' |ε S → HS' S' → *H | /H |ε H → (S) | id B → if(D)T C → while(D)T D → A>=A | A<=A | A==A | A!=A ``` --- ### 单词种别码方案 |单词符号|种别码|单词符号|种别码| |:-----:|:---:|:----:|:---:| | main | 1 | [ | 28 | | int | 2 | ] | 29 | | Char | 3 | { | 30 | | if | 4 | } | 31 | | else | 5 | , | 32 | | for | 6 | : | 33 | | while | 7 | ; | 34 | |letter | (letter | id)* | 10 | > | 35 | |digit | digit* | 20 | < | 36 | | = | 21 | >= | 37 | | + | 22 | <= | 38 | | - | 23 | == | 39 | | * | 24 | != | 40 | | / | 25 | # | 0 | | ( | 26 | ERROR| -1 | | ) | 27 | ---- ### 主要实现思路 1. 词法分析的主要算法思想 词法分析主要就是一个扫描算法。将当前项目文件夹下的input.txt中读取源程序,将其中的字符串提取出来,然后将对字符串放到一个字符数组中进行分析。先跳过字符串数组中的空白字符,然后从取到的第一个非空白字符开始,如果该字符是字母或者数字,则继续向下标增大的方向移动,将取到的非空白字符放到token数组中,直到遇到空白字符或者非数字字符或者字母字符,则停止,然后判断是否是关键字,给扫描到的单词赋相应的值;如果该字符不是字母或者数字,则通过一个switch语句,识别该单词是属于哪一类型单词,错误单词也有相应的种别码,即-1。最后给识别到的单词赋值,然后将扫描到的单词返回。词法分析结果会保存在当前项目文件夹下的output.txt中 2. 语法分析算法思想 语法语义分析是一个递归下降的过程。需要写一个match(word)方法,当单词匹配 返回true并扫描下一个单词,否则返回false并报错,并将错误定位。开始分析时,需要根据定义好的语法规则写好匹配语句,匹配好程序头之后,就进入语句块的分析,然后进入语句串的分析,最后进入语句的分析。语句块分析需要匹配左右花括号,语句串分析需要将各个语句分开进行分析,单个语句的语法分析则需要根据定义好的语法规则进行匹配,分成赋值语句、判断语句和循环语句进行分析,在判断语句和循环语句中可以递归执行语句块分析方法。 3. 语义分析 在语法分析的过程中可以同时进行语义的分析,需要创建好一个存放四元式的列表,在进行语法分析时,根据分析得到的操作符,参数1,参数2 和结果存放到四元式列表中,当遇到条件语句时需要生成一个条件为真的四元式和条件为假的四元式,四元式的出口初始化为0,当后面递归分析结束后,将得到的出口回填到相应的四元式中去。