制作一个简单的C语言词法分析程序_用c语言编写词法分析程序-CSDN博客文章浏览阅读322次。C语言的程序中,有很单词多符号和保留字。一些单词符号还有对应的左线性文法。所以我们需要先做出一个单词字符表,给出对应的识别码,然后跟据对应的表格来写出程序。_用c语言编写词法分析程序https://blog.csdn.net/lijj0304/article/details/134078944
前置程序词法分析器参考这个帖子⬆️
递归下降语法分析程序设计与实现-CSDN博客文章浏览阅读127次。制作一个简单的C语言词法分析程序_用c语言编写词法分析程序-CSDN博客文章浏览阅读276次。C语言的程序中,有很单词多符号和保留字。一些单词符号还有对应的左线性文法。所以我们需要先做出一个单词字符表,给出对应的识别码,然后跟据对应的表格来写出程序。_用c语言编写词法分析程序前置程序词法分析器参考这个帖子⬆️。https://blog.csdn.net/lijj0304/article/details/134331022
递归下降实现语法分析可以看这个⬆️
1.程序目标
制作一个LL(1)语法分析程序,程序可以识别词法分析器的输出文件中的二元序列,拼凑出用户输入。通过表驱动程序,实现赋值语句的LL(1)文法的LL(1)分析过程。算式的语法如下:
G[S]: S→V=E E→TE′ E′→ATE′|ε T→FT′ T′→MFT′|ε F→ (E)|i A→+|-M→*|/ V→i
2.程序设计
我根据给定的语法,计算处所需要用到的first集和follow集,接着做select集,然后可以做出LL(1)分析表:
i | + | - | * | / | ( | ) | # | |
---|---|---|---|---|---|---|---|---|
S | S→V=E | |||||||
E | E→TE’ | E→TE’ | ||||||
E’ | E’→ATE’ | E’→ATE’ | E’→ ε | E’→ ε | ||||
T | T→FT’ | T→FT’ | ||||||
T’ | T’→ ε | T’→ ε | T’→MFT’ | T’→MFT’ | T’→ ε | T’→ ε | ||
F | F→i | F→(E) | ||||||
M | M→* | M→/ | ||||||
A | A→+ | A→- | ||||||
V | V→i |
LL(1)的语法分析部分使用栈的思想来实现,定义了一个字符串的栈stack,LL1分析过程中产生的串存储在栈中,同时对于输入串有一个定位指针,栈顶元素和指针指向的字符比对,一样则栈顶元素出栈,指针往后移动。
下面是程序LL(1)分析流程图
3.完整程序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_LEN 1000
char str[MAX_LEN];
char stack[MAX_LEN];
int top = 0;int LL1(char *str, char *stack) {int i = 0;while(str[i] != '#') {if(top < 0) return 0;if(stack[top] == str[i]) {printf("%c -> ", stack[top]);top--;i++;}else if(stack[top] == 'S') {if(str[i] == 'i') {stack[top++] = 'E';stack[top++] = '=';stack[top] = 'V';}else return 0;}else if(stack[top] == 'E') {if(str[i] == 'i') {stack[top++] = 'e';stack[top] = 'T';}else if(str[i] == '(') {stack[top++] = 'e';stack[top] = 'T';}else return 0;}else if(stack[top] == 'e') {if(str[i] == '+') {stack[top++] = 'e';stack[top++] = 'T';stack[top] = 'A';}else if(str[i] == '-') {stack[top++] = 'e';stack[top++] = 'T';stack[top] = 'A';}else if(str[i] == ')' || str[i] == '#') {printf("%c -> ", str[i]);top--;}else return 0;}else if(stack[top] == 'T') {if(str[i] == 'i') {stack[top++] = 't';stack[top] = 'F';}else if(str[i] == '(') {stack[top++] = 't';stack[top] = 'F';}else return 0;}else if(stack[top] == 't') {if(str[i] == '*') {stack[top++] = 't';stack[top++] = 'F';stack[top] = 'M';}else if(str[i] == '/') {stack[top++] = 't';stack[top++] = 'F';stack[top] = 'M';}else if(str[i] == '+' || str[i] == '-' || str[i] == ')' || str[i] == '#') {printf("%c -> ", str[i]);top--;}else return 0;}else if(stack[top] == 'F') {if(str[i] == 'i') stack[top] = 'i';else if(str[i] == '(') {stack[top++] = ')';stack[top++] = 'E';stack[top] = '(';}else return 0;}else if(stack[top] == 'A') {if(str[i] == '+')stack[top] = '+';else if(str[i] == '-')stack[top] = '-';else return 0;}else if(stack[top] == 'M') {if(str[i] == '*')stack[top] = '*';else if(str[i] == '/')stack[top] = '/';else return 0;}else if(stack[top] == 'V') {if(str[i] == 'i') stack[top] = 'i';else return 0;}else return 0;}return 1;
}int main() {for(int m = 1; m <= 4; m++) {printf("test%d:\n", m);char txt[] = "./lexical/analyze";char num[6];sprintf(num, "%d.txt", m);strcat(txt, num);FILE *fp = fopen(txt, "r");char buf[MAX_LEN] = "";char input[MAX_LEN] = "";fgets(buf, MAX_LEN, fp);int i = 0, j = 0;for(int k = 0; k < strlen(buf); k++) {if(buf[k] == '1' && buf[k+1] == ',') {str[i++] = 'i';k += 3;while(1) {if(buf[k] == ')' && buf[k+1] == ' ')break;input[j++] = buf[k++];}continue;}if(buf[k] == ',' && buf[k+1] == ' ') {k += 2;while(1) {if(buf[k] == ')' && buf[k+1] == ' ')break;str[i++] = buf[k];input[j++] = buf[k++];}}}printf("Input scentence: %s\n", input);str[i] = '#';fclose(fp);stack[0] = 'S', top = 0;int flag = LL1(str, stack);if(flag == 1) {printf("end\n");printf("Gramma legal: %s\n", str);}else {printf("error\n");printf("Gramma illegal\n");}}return 0;
}
4.运行测试