词法分析2

#include <stdio.h>
#include <string.h>
#define max 100
char a[max],b[8],ch;
int syn,p,m,n,sum;
char word[][6]={"begin","if","then","while","do","end"};
void mor()
{
    sum=0;
    ch=a[p++];
    m=0;
    while((ch==‘ ‘)||(ch==‘\n‘)||(ch==‘\t‘))
        ch=a[p++];
    if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
    {
        while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
        {
            b[m++]=ch;
            ch=a[p++];
        }
        p--;
        syn=10;
        for(n=0;n<6;n++)
           if(strcmp(b,word[n])==0)
           {
               syn=n+1;
               break;
           }
    }
    else if((ch>=‘0‘)&&(ch<=‘9‘))
    {
       while((ch>=‘0‘)&&(ch<=‘9‘))
       {
           sum=sum*10+ch-‘0‘;
           ch=a[p++];
       }
       p--;
       syn=11;
    }
    else
    {
        switch(ch)
        {
        case ‘+‘:
            syn=13;
            b[m++]=ch;
            break;
        case ‘-‘:
            syn=14;
            b[m++]=ch;
            break;
        case ‘*‘:
            syn=15;
            b[m++]=ch;
            break;
        case ‘/‘:
            syn=16;
            b[m++]=ch;
            break;
        case ‘:‘:
            b[m++]=ch;
            ch=a[p++];
            if(ch==‘=‘)
            {
                syn=18;
                b[m++]=ch;
            }
            else
            {
                syn=18;
                p--;
            }
            break;
        case ‘<‘:
            b[m++]=ch;
            ch=a[p++];
            if(ch==‘=‘)
            {
                syn=21;
                b[m++]=ch;
            }
            else
            {
                syn=20;
                p--;
            }
            break;
        case ‘>‘:
            b[m++]=ch;
            ch=a[p++];
            if(ch==‘=‘)
            {
                syn=24;
                b[m++]=ch;
            }
            else
            {
                syn=23;
                p--;
            }
            break;
        case ‘=‘:
            syn=25;
            b[m++]=ch;
            break;
        case ‘;‘:
            syn=26;
            b[m++]=ch;
            break;
        case ‘(‘:
            syn=27;
            b[m++]=ch;
            break;
        case ‘)‘:
            syn=28;
            b[m++]=ch;
            break;
        case ‘#‘:
            syn=0;
            b[m++]=ch;
            break;
        case ‘!‘:
            syn=-2;
            break;
        default:
            syn=-1;
            break;
        }
    }
    b[m++]=‘\0‘;
}
main()
{
    p=0;
    printf("请输入一段程序段,便于词法分析(以!作为结束符):");
    do{
        scanf("%c",&a[p++]);
    }while(a[p-1]!=‘!‘);
    p=0;
    do{
        mor();
        switch(syn)
        {
            case 11:
                printf("( %-5d%10d )\n",syn,sum);
                break;
            case -1:
                printf("你输入一个错的字符\n");
                return 0;
                break;
            case -2:
                break;
            default:
                printf("( %-5d%10s )\n",syn,b);
                break;
        }
    }while(syn!=-2);
}
时间: 2024-12-26 08:15:38

词法分析2的相关文章

词法分析实验报告

词法分析实验报告 一.        实验目的 编制一个词法分析器,通过该词法分析程序的设计实例,进一步了解词法分析程序构造的一些细节. 二.        实验内容和要求 实验内容: 对字符串表示的源程序,从左到右进行扫描和分解.根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,若发现词法错误,则返回出错信息. 实验要求: 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三. 实验方法.步骤及结果测试 源程序名:压缩包文件(rar或zip)中源程序

词法分析

词法分析 #include<stdio.h> #include<string.h> void main() { int i=0,j,k=0,state=1,f=0,linenum=1; char a[11][10]={"const","var","call","begin","if","while","do","odd",&

实验报告-词法分析.c

实验一.词法分析程序 商业软件工程   简梓茵  201506110132 一.        实验目的   熟悉词法分析的形式. 二.        实验内容和要求 对输入的每个关键字或者字符进行词法分析,给出该关键字对应的排序序号 三.        实验方法.步骤及结果测试   1.      源程序名:wordanalyse.c 2.      原理分析及流程图 3.      主要程序段及其解释: #include <stdio.h> #include <string.h>

实验一词法分析程序

一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c  cifafenxi.exe 2.      原理分析及流程图 3.      主要程序段及其解释: do { scanf("%s\n",input); i=0; while(input[i]

词法分析程序实验报告

实验一词法分析实验 商业软件工程2班  黄铭坤  201506110147 一.        实验目的        编制一个词法分析程序. 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:词法分析.c 可执行程序名:词法分析.exe 2.      原理分析及流程图 (1)   关键字: begin  if  then  while  do  end (2) 

词法分析程序新

词法分析程序的功能:提示用户输入一段需分析的源程序,然后程序读入该源程序的字符串进行词法分析,最后输出词法分析的结果显示在屏幕上.符号与种别码对照表:单词符号 种别码 单词符号 种别码begin     1        :          17if           2        :=        18then      3        <          20while      4       <=        22do         5 end       6    

词法分析程序(编译原理)

一:词法分析程序的功能: 输入单词串,以'begin'开始,以'#'结束.如果是文法正确的句子,则输出成功的信息:'输入单词串成功',否则返回错误提示. 例: 输入 begin a:=345 end # 输出 输入单词串成功 二:符号与种码对照表 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 <  20 while 4 <= 21 do 5 <>  22 end 6 >  23 l(l|d)* 10 >= 24 dd*

简单的词法分析程序

词法分析程序完成的是编译第一阶段的工作,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析. 我写的简单代码实现如下: #include<stdio.h>#include<string.h>#define N 80char word[6][10]={"begin","if","then","while","do","end"};vo

第十九篇 js高级知识---词法分析和AO 链

上面一篇文章说了js的作用域链,这一节算是对上面的延申,有一个典型的例子,首先看原来的一段代码: var name = "test"; function t() { var b = 1; if (b === 1) { var name = "test1"; } else { var name = "test2"; } console.log(name); } t(); 这段代码的结果是test1 这个肯定是没有什么问题了,但是如果把代码作如下修改