0916 编程实验一 词法分析程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define _KEY_WOED_END "waiting for your expanding"

typedef struct
{
    int typenum;
    char * word;
}WORD;

char input[255];
char token[255] = "";
int p_input;
int p_token;
char ch;        

char * rwtab[] = {"begin", "if", "then", "while", "do", "end", _KEY_WOED_END};
WORD * scaner();

int main()
{
    int over = 1;
    WORD *oneword;
    oneword=(WORD *)malloc(sizeof(WORD));

    printf("input words:");
    scanf("%[^#]s",input);
    p_input=0;
    printf("您输入的字符串是:%s\n\n",input);
    while(over < 1000 && over != -1)
    {
        oneword = scaner();
        printf("(%d,%s)\n",oneword->typenum,oneword->word);
        over = oneword->typenum;
    }
}

char m_getch(){
    ch=input[p_input];
    p_input=p_input+1;
    return (ch);
}

void getbc()
{
    while(ch==‘ ‘||ch==10){
    ch=input[p_input];
    p_input=p_input+1;
    }
}

void concat()
{
    token[p_token]=ch;
    p_token=p_token+1;
    token[p_token]=‘\0‘;
}

int letter()
{
    if(ch>=‘a‘&&ch<=‘z‘||ch>=‘A‘&&ch<=‘Z‘)return 1;
    else return 0;
}

int digit()
{
    if(ch>=‘0‘&&ch<=‘9‘)
        return 1;
    else
        return 0;
}

int reserve()
{
    int i=0;
    for(i=0;i<7;i++)
    {
        if(!strcmp(rwtab[i],token))
        {
            return i+1;
        }
        i=i+1;
    }
    return 10;
}

void retract()
{
    p_input=p_input-1;
}

WORD * scaner()
{
    WORD * myword;
    myword = (WORD *)malloc(sizeof(WORD));
    myword->typenum = 10;
    myword->word = "";
    p_token=0;
    m_getch();
    getbc();
    if(letter())
    {
        while(letter()||digit())
        {
           concat();
           m_getch();

        }
        retract();
        myword->typenum=reserve();
        myword->word=token;
        return(myword);
    }
    else if(digit())
    {
        while(digit())
        {
            concat();
            m_getch();
        }
        retract();
        myword->typenum=20;
        myword->word=token;
        return(myword);
    }
    else
    {
        switch(ch)
        {
        case ‘=‘:m_getch();
            if(ch==‘=‘)
            {
                myword->typenum=39;
                myword->word="==";
                return(myword);
            }
            retract();
            myword->typenum=21;
            myword->word="=";
            return(myword);
            break;
        case ‘+‘:
            myword->typenum=22;
                myword->word="+";
                return(myword);
                break;
        case ‘-‘:
            myword->typenum=23;
                myword->word="-";
                return(myword);
                break;
        case ‘*‘:
            myword->typenum=24;
            myword->word="*";
            return(myword);
            break;
        case ‘/‘:
            myword->typenum=25;
            myword->word="/";
            return(myword);
            break;
        case ‘(‘:
            myword->typenum=26;
            myword->word="(";
            return(myword);
            break;
        case ‘)‘:
            myword->typenum=27;
            myword->word=")";
            return(myword);
            break;
        case ‘[‘:
            myword->typenum=28;
            myword->word="[";
            return(myword);
            break;
        case ‘]‘:
            myword->typenum=29;
            myword->word="]";
            return(myword);
            break;
        case ‘{‘:
            myword->typenum=30;
            myword->word="{";
            return(myword);
            break;
        case ‘}‘:
            myword->typenum=31;
            myword->word="}";
            return(myword);
            break;
        case ‘,‘:
            myword->typenum=32;
            myword->word=",";
            return(myword);
            break;
        case ‘:‘:
            myword->typenum=33;
            myword->word=":";
            return(myword);
            break;
        case ‘;‘:
            myword->typenum=34;
            myword->word=";";
            return(myword);
            break;
        case ‘>‘:
            myword->typenum=35;
            myword->word=">";
            return(myword);
            break;
        case ‘<‘:
            myword->typenum=36;
            myword->word="<";
            return(myword);
            break;
        case ‘!‘:
            m_getch();
            if(ch==‘=‘)
            {
                myword->typenum=40;
                myword->word="!=";
                return(myword);
            }
            retract();
            myword->typenum=-1;
            myword->word="ERROR";
            return(myword);
            break;
        case ‘\0‘:
            myword->typenum=1000;
            myword->word="OVER";
            return(myword);
            break;
        default:
            myword->typenum=-1;
            myword->word="ERROR";
            return(myword);
            }
        }
    }
时间: 2024-10-10 15:25:13

0916 编程实验一 词法分析程序的相关文章

编程实验一 词法分析程序

#include<stdio.h> #include<stdlib.h> #include<string.h> #define _KEY_WOED_END "waiting for your expanding" //关键字结束标志 typedef struct { int typenum; char * word; }WORD; char input[255]; //输入换缓冲区 char token[255]=""; //单词

(改)编程实验一 词法分析程序

  #include <stdio.h>#include <stdlib.h>#include <string.h> typedef struct node{ char words[255]; struct node *next;}NODE; char word[255];char *word_default[6]={"begin","if","then","while","do&

实验一&#160;&#160;词法分析程序045

实验一  词法分析程序实验 专业 计算机科学与技术   姓名 邹汉辉  学号 201508030045 一.实验目的 1. 编制一个词法分析程序 二. 实验内容和要求 1. 输入:源程序字符串 2. 输出:二元组(种别,单词本身) 3. 待分析语言的词法规则 三. 实验方法.步骤及结果测试 1.  源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c 可执行程序名:cifafenxi.exe 2.  原理分析及流程图 3.  主要程序段及其解释: #include<stdio

实验一词法分析程序

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

实验一 词法分析程序实验

实验一.词法分析程序实验 商业软件工程   蓝海鹏  201506110171 一.        实验目的        编制一个词法分析程序. 二.        实验内容和要求 实验内容: 对字符串表示的源程序 从左到右进行扫描和分解 根据词法规则: 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)*(标识符) 10 >=

0917 实验一 词法分析程序

#include <stdio.h> #include <string.h> #include <iostream.h> #define BEGIN 1 #define IF 2 #define THEN 3 #define WHILE 4 #define DO 5 #define END 6 #define INT 11 #define LT 20 #define LE 21 #define EQ 24 #define NE 22 #define GT 12 #def

0917 实验一词法分析程序

#include <stdio.h>#include <string.h>int Input1(char a){ int i=0; switch(a) { case('+'):  printf("%c\t   13\n",a);i++;break; case('-'):  printf("%c\t   14\n",a);i++;break; case('*'):  printf("%c\t   15\n",a);i++;b

词法分析程序实验报告

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

实验报告一 词法分析程序

实验一.词法分析程序实验 专业:商业软件工程   姓名:卓润峰  学号:201506110202 一.        实验目的 编制一个词法分析程序. 二.        实验内容和要求 1.输入:源程序字符串. 2.输出:二元组(种别,单词本身) 3.待分析语言的词法规则 主要是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析 三.        实验方法.步骤及结果测试 1.     源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c 可执行程序名: