实验一、词法分析实验

 

实验一、词法分析实验

商业软件工程   苏伟祥  201506110160

一、实验目的

编制一个此法分析程序

二、实验内容需求

输入源程序字符串

输出二元组(种别,单词本身)

待分析语言的词法规则

三、实验方法、步骤以及结果测试

1.源文件名:

2.原理分析及流程图

3.主要程序及解释

 

do{
        scanf("%c",&ch);
        prog[p++]=ch;
    }while(ch!='#');
    p=0;
    printf("词法分析结果如下:\n");
    do{
        sum=0;
        for(m=0;m<8;m++)
            token[m++]= NULL;
        ch=prog[p++];
        m=0;
        while((ch==' ')||(ch=='\n'))
            ch=prog[p++];
        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
        {
            while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
            {
                token[m++]=ch;
                ch=prog[p++];
            }
            p--;
            syn=10;
            for(n=0;n<6;n++)
                if(strcmp(token,rwtab[n])==0)
                {
                    syn=n+1;
                    break;
                }
        }
        else if((ch>='0')&&(ch<='9'))
        {
            while((ch>='0')&&(ch<='9'))
            {
                sum=sum*10+ch-'0';
                ch=prog[p++];
            }
            p--;
            syn=11;
        }
        else
        {
            switch(ch)
            {
            case '<':
                token[m++]=ch;
                ch=prog[p++];
                if(ch=='=')
                {
                    syn=22;
                    token[m++]=ch;
                }
                else
                {
                    syn=20;
                    p--;
                }
                break;
            case '>':
                token[m++]=ch;
                ch=prog[p++];
                if(ch=='=')
                {
                    syn=24;
                    token[m++]=ch;
                }
                else
                {
                    syn=23;
                    p--;
                }
                break;
            case '+':
                token[m++]=ch;
                ch=prog[p++];
                if(ch=='+')
                {
                    syn=17;
                    token[m++]=ch;
                }
                else
                {
                    syn=13;
                    p--;
                }
                break;

            case '-':
                token[m++]=ch;
                ch=prog[p++];
                if(ch=='-')
                {
                    syn=29;
                    token[m++]=ch;
                }
                else
                {
                    syn=14;
                    p--;
                }
                break;

            case '!':
                ch=prog[p++];
                if(ch=='=')
                {
                    syn=21;
                    token[m++]=ch;
                }
                else
                {
                    syn=31;
                    p--;
                }
                break;

            case '=':
                token[m++]=ch;
                ch=prog[p++];
                if(ch=='=')
                {
                    syn=25;
                    token[m++]=ch;
                }
                else
                {
                    syn=18;
                    p--;
                }
                break;

            case '*':
                syn=15;
                token[m++]=ch;
                break;

            case '/':
                syn=16;
                token[m++]=ch;
                break;

            case '(':
                syn=27;
                token[m++]=ch;
                break;

            case ')':
                syn=28;
                token[m++]=ch;
                break;

            case '{':
                syn=5;
                token[m++]=ch;
                break;

            case '}':
                syn=6;
                token[m++]=ch;
                break;

            case ';':
                syn=26;
                token[m++]=ch;
                break;

            case '\"':
                syn=30;
                token[m++]=ch;
                break;

            case '#':
                syn=0;
                token[m++]=ch;
                break;

            case ':':
                syn=17;
                token[m++]=ch;
                break;

            default:
                syn=-1;
                break;
            }

            token[m++]='\0';
        }

 

4.运行结果及分析

 

还是比较符合预期的,但是偶尔会出现意外情况 比如说输入x,输出的却是xf,种别码也不对。

原因可能是读取的时候出现了一些小错,但是检查很多遍后代码也没有错。

四、实验总结

通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言直接编写此法分析程序。另外,也让我重新熟悉了C语言的相关内容,加深了对C语言的用途的理解。

转载于:https://www.cnblogs.com/swxvico/p/5943715.html

【问题描述】 请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,记录其单词类别和单词值,输入输出及处理要求如下: (1)数据结构和与语法分析程序的接口请自行定义;类别码需按下表格式统定义; (2)为了方便进行自动评测,输入的被编译源文件统命名为testfile.txt(注意不要写错文件名);输出的结果文件统命名为output.txt(注意不要写错文件名),结果文件中每行按如下方式组织: 单词类别码 单词的字符/字符串形式(中间仅用个空格间隔) 单词的类别码请统按如下形式定义: 单词名称 类别码 单词名称 类别码 单词名称 类别码 单词名称 类别码 标识符 IDENFR else ELSETK - MINU = ASSIGN 整形常量 INTCON switch SWITCHTK * MULT ; SEMICN 字符常量 CHARCON case CASETK / DIV , COMMA 字符串 STRCON default DEFAULTTK < LSS ( LPARENT const CONSTTK while WHILETK GRE [ LBRACK char CHARTK scanf SCANFTK >= GEQ ] RBRACK void VOIDTK printf PRINTFTK == EQL { LBRACE main MAINTK return RETURNTK != NEQ } RBRACE if IFTK + PLUS : COLON 【输入形式】testfile.txt中的符合文法要求的测试程序。 【输出形式】要求将词法分析结果输出至output.txt中。 【特别提醒】(1)读取的字符串要原样保留着便于输出,特别是数字,这里输出的并不是真正的单词值,其实是读入的字符串,单词值需另行记录。 (2)本次作业只考核对正确程序的处理,但需要为今后可能出现的错误情况预留接口。 (3)在今后的错误处理作业中,需要输出错误的行号,在词法分析的时候注意记录该信息。 (4)单词的类别和单词值以及其他关注的信息,在词法分析阶段获取后,后续的分析阶段会使用,请注意记录;当前要求的输出只是为了便于评测,完成编译器中无需出现这些信息,请设计为方便打开/关闭这些输出的方案。 【文法定义】请到“2020年文法定义(用于查看文法,不计入成绩)”作业中查看文法 【样例输入】 coNst int cONst1 = 001, 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 001 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 ; PRINT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值