1.手工编写法构造词法分析程序: (1)跳过源程序中的空格字符; (2)从源程序字符序列中识别出单词符号,并把该单词符号相应的种别枚举值送入全局变量SYM中; (3)如果取来的单词为标识符,则把它存入全局变量ID中,为了区分保留字和标识符,设置了一张保留字WORD,用二分法查找保留字,识别诸如if、end等保留字; (4)如果取来的单词为字符常量,则将该字符的ASCII序号存入全局变量NUM中; (5)同时将所有识别结果写入out.txt文件。 2.利用自动机识别单词的工作原理构造词法分析程序 模仿自动机识别单词的工作过程来实现词法分析程序,输出要求同上。
时间: 2024-02-10 16:20:14 浏览: 42
对于第一个问题,我可以给你一些思路:
1. 首先读入源程序文件。
2. 针对每个字符进行处理,跳过空格字符。
3. 对于其他字符,判断是否可以构成单词符号。
4. 如果可以构成单词符号,根据保留字表和标识符表判断其种别并存入全局变量SYM。
5. 如果是标识符,将其存入全局变量ID中。
6. 如果是字符常量,将其ASCII码存入全局变量NUM中。
7. 将识别结果写入out.txt文件。
对于第二个问题,你可以考虑使用正则表达式或者自动机的方法实现识别单词符号。具体实现步骤可以参考以下思路:
1. 定义单词符号的正则表达式,比如标识符的正则表达式为[a-zA-Z][a-zA-Z0-9]*,字符常量的正则表达式为'.'。
2. 读入源程序文件,并且将其转换为字符流。
3. 定义一个状态机,每个状态对应一个单词符号的正则表达式。
4. 对于每个字符,根据当前状态和该字符转移状态。
5. 如果当前状态对应一个单词符号的结束状态,则根据保留字表和标识符表判断其种别并存入全局变量SYM。
6. 如果是标识符,将其存入全局变量ID中。
7. 如果是字符常量,将其ASCII码存入全局变量NUM中。
8. 将识别结果写入out.txt文件。
希望以上思路能够对你有所帮助!
相关问题
用emu8086编写一个从键盘输入英文字符,显示其二进制ASCII码的汇编语言源程序
好的,以下是用emu8086编写的从键盘输入英文字符,显示其二进制ASCII码的汇编语言源程序:
```
;程序名称:ASCII码显示程序
;作者:AI助手
;编写时间:2021年1月1日
.stack 100h ;定义堆栈空间大小
.data ;定义数据段
msg1 db '请输入一个英文字符:$'
msg2 db '输入字符的ASCII码为:$'
char db 0 ;定义一个字节变量char用于存储输入的字符
.code ;定义代码段
main proc ;定义主程序
;显示提示信息
mov ah, 09h ;设置显示字符串功能号
lea dx, msg1 ;将要显示的字符串的地址传送到dx寄存器
int 21h ;调用21h中断显示字符串
;接收输入字符
mov ah, 01h ;设置字符输入功能号
int 21h ;调用21h中断接收输入字符
mov char, al ;将输入的字符存储到char变量中
;显示ASCII码
mov ah, 09h ;设置显示字符串功能号
lea dx, msg2 ;将要显示的字符串的地址传送到dx寄存器
int 21h ;调用21h中断显示字符串
mov ah, 02h ;设置字符输出功能号
mov dl, char ;将输入的字符传送给dl寄存器
int 21h ;调用21h中断输出字符
;转换为二进制
mov ax, 0 ;寄存器ax清零
mov bl, char ;将输入的字符传送给bl寄存器
mov cx, 8 ;循环8次
read_bit:
shr bl, 1 ;将bl右移一位
adc ax, 0 ;将进位标志ADC加到ax寄存器中
shl ax, 1 ;将ax左移一位
loop read_bit ;循环读取每一位二进制数
;显示二进制数
mov ah, 02h ;设置字符输出功能号
mov dl, ' ' ;将空格字符传送给dl寄存器
int 21h ;调用21h中断输出字符
mov ah, 02h ;设置字符输出功能号
mov bl, 8 ;循环次数为8次
print_bit:
mov al, ah ;将ah寄存器的值传送给al寄存器
and al, 00000001b ;将al寄存器的值与00000001b按位与运算
add al, '0' ;将al寄存器的值加上'0'字符
mov dl, al ;将al寄存器的值传送给dl寄存器
int 21h ;调用21h中断输出字符
shr ah, 1 ;将ah右移一位
dec bl ;循环次数减一
jnz print_bit ;如果循环次数不为0就跳转到print_bit处
;退出程序
mov ah, 4ch ;设置程序退出功能号
int 21h ;调用21h中断退出程序
main endp ;结束主程序
end main ;程序结束标志
```
上述程序在接收输入字符后将其转换为二进制数并输出。程序执行时,先提示用户输入一个英文字符,然后接收用户输入的字符,接着显示输入字符的ASCII码,最后将输入字符的二进制数以空格隔开的形式输出,程序运行完成后自动退出。
用c编写一个函数,把源程序文件中每行末尾多余的空白字符全都删去
好的,这个问题是关于编程的,我可以回答。以下是一个示例函数,可以删除给定源程序文件中每行末尾的所有空格字符。
```c
#include <stdio.h>
#include <string.h>
void remove_trailing_spaces(char *filename) {
FILE *file = fopen(filename, "r+");
if (!file) {
printf("Failed to open file: %s\n", filename);
return;
}
char line[4096];
while (fgets(line, sizeof(line), file)) {
char *end = line + strlen(line) - 1;
while (end >= line && (*end == ' ' || *end == '\t' || *end == '\n')) {
end--;
}
*(end+1) = '\0';
fseek(file, -(strlen(line)-(end-line)), SEEK_CUR);
fputs(line, file);
fflush(file);
}
fclose(file);
}
```
你可以将源程序文件的路径传递给 `remove_trailing_spaces()` 函数,然后它会用修改后的内容重写文件。注意,这个函数只会移除行末尾的空格和制表符,不会删除行首或行中的空格。