词法分析器的设计

2022/6/3 23:20:17

本文主要是介绍词法分析器的设计,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!


一、设计目的 通过设计、编写调试一个词法分析程序,加深对词法分析原理的理解,并掌握对 程序设计语言源程序进行扫描过程中将其分解为各位单词符号的词法分析方法。 二、设计内容 编写一个词法分析程序,从输入的源程序中识别出各个具有独立意义的单词,即 基本字、标识符、常数、运算符、分隔符五大类,并依次输出各个单词的内部编码及 单词符号自身值,遇到错误时可显示“error”,然后跳过错误部分继续显示。 1.词法分析器的功能和输出形式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表 示成以下的二元组(单词种别编码,单词自身值)。本题目中可采用一类符号一个种别 编码的方式。 2.单词的词法规则 <标识符>→ <字母><字母数字串> <字母数字串>→<字母><字母数字串>|<数字><字母数字串>|<下划线><字母数字 串>|ε <无符号整数>→ <数字><数字串> <数字串>→<数字><数字串>|ε <加法运算符>→ + <减法运算符>→ - . . . <大于关系运算符>→ > <大于等于关系运算符>→ >= . . . 3.超前搜索方法 词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a>=”或“a>b”, 当前字符为’>’,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系 运算符呢?显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字 符‘ b’,这时可知应将’>’解释为大于运算符。但此时,超前读了一个字符‘ b’, 所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也 有类似情况。 4.编程思路 以满足以上词法规则要求的 C 语言子集的源程序作为词法分析程序的输入。在词法分析中,自头文件开始扫描源程序字符,一旦发现符合单词定义的字符串时,将它 翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字 符串被分解为具有等长信息的单词符号串,并产生两个表格:常数表和标识符表,他 们分别包含了源程序中的所有常数和标识符。 5.单词种别编码要求 识别保留字:if int for while do return break continue,单词 种别编码为 1。 分隔符: , ; { } ( ) 单词种别编码为 2。 运算符:+ - * 、 = 种别编码为 3。 关系运算符:> < >= <= == != 种别编码为 4。 标识符:种别编码为 5。 常数为无符号整型数,种别编码为 6。 三、功能扩充 若考虑程序中的注释/*......*/,程序如何处理?   主要就是文件输入费点劲
#include "check.h"

void lexical_analyzer(FILE *p){
    character=fgetc(p);
    while(character!=EOF){
        while(character==' '||character=='\t'||character=='\r'||character=='\n'){
            character=fgetc(p);
        }
        if(isalpha(character)){
            char temp[15];
            int k=0;
            while(isalpha(character)||isdigit(character)){
                temp[k]=character;
                character=fgetc(p);
                
                k++;
            }
            temp[k]='\0'; 
            int flag=0;
            for(int i=0;i<8;i++){
                if(strcmp(temp,word[i])==0){
                    printf("(%s,%s)\n",word[8],temp);
                    flag=1;
                    break;
                } 
            }
            if(flag==0){
                printf("(%d,%s)\n",5,temp);
            }
        }
else if(isdigit(character)){
            int k=0;
            int num=0;
            while(isdigit(character)){
                num=num*10+character-'0';
                character=fgetc(p);
                k++;
            }
            if(k>8)
                printf("error\n");
            else
                printf("(%d,%d)\n",6,num);
        }
        else if(character=='>'){
            character=fgetc(p);
            if(character=='='){
                character=fgetc(p);
                printf("(%d,>=)\n",4);
            }
            else{
                printf("(%d,>)\n",4);
            }
        }
else if(character=='<'){
            character=fgetc(p);
            if(character=='='){
                character=fgetc(p);
                printf("(%d,<=)\n",4);
            }
            else{
                printf("(%d,<)\n",4);
            }
        }
        else if(character=='='){
            character=fgetc(p);
            if(character=='='){
                character=fgetc(p);
                printf("(%d,==)\n",4);
            }
            else{
                printf("(%d,=)\n",3);
            }
        }
        else if(character=='!'){
            character=fgetc(p);
            if(character=='='){
                character=fgetc(p);
                printf("(%d,!=)\n",4);
            }
            else{
                printf("error\n");
            }
        }
        else if(character=='+'||character=='-'||character=='*'||character=='/'){
            printf("(%d,%c)\n",3,character);
            character=fgetc(p);
        }
        else{
            int flag;
            flag=0;
            for(int i=0;i<6;i++){
                if(character==separator[i]){
                    printf("(%d,%c)\n",2,character);
                    character=fgetc(p);
                    flag=1;
                    break;
                }
            }
            if(flag==0){
                printf("error\n");
                character=fgetc(p);
            }
        }
    }
}
int main(){     
    FILE *fp = fopen("text.txt", "r");
    if (fp == NULL){
        perror("fopen:");
        system("pause");
        return 0;
    }
    lexical_analyzer(fp);
    system("pause");
}

check.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

const char *word[9] = {"if", "int", "for", "while", "do", "return", "break", "continue","1"};
char separator[7]={',',';','{','}','(',')','2'};
char operator_m[6]={'+','-','*','/','=','3'};
char character;

 

 测试数据自己设计吧,.txt文件放在同一目录下就好

这篇关于词法分析器的设计的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程