c语言语法分析器

#include <stdio.h>
#include <string.h>
char prog[800], token[20];
char ch;
int syn,p,m,n,sum;
char * rwtab[6]= {"begin","if","then","while","do","end"};

main()
{
      p=0;
      printf("\n 请输入字符串: \n");
      do{
                 ch=getchar();
                 prog[p++]=ch;
      }while (ch!=‘#‘);
      p=0;
      do{
          scaner();
          switch(syn)
                  {
                     case 11: printf("\n(%d,%d)",syn,sum); break;
                     case -1: printf("\n(%s,出错!)",token);break;
                     default: printf("\n(%d,%s)",syn, token);
                  }
       }while (syn!=0);
       printf("\n  分析成功 \n");
           p=0;
    scaner();
     E();
     if (syn==0)
              printf("\n 没有错误. \n");
     else     printf("\n  出现错误. \n");
}

scaner()
{
        for (n=0;n<20;n++) token[n]=NULL;
        m=0;
        sum=0;
        ch=prog[p++];
        while (ch==‘ ‘) {ch=prog[p++];}
        if (ch>=‘a‘&& ch<=‘z‘)
           {while (ch>=‘a‘&& ch<=‘z‘||ch>=‘0‘ && ch<=‘9‘)
                  {
                   token[m++]=ch;
                   ch=prog[p++];
                  }

            syn=10;p--;
            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++];}
             syn=11;p--;
            }
          else
                switch(ch)
                {
                  case ‘<‘: token[m++]=ch;
                            ch=prog[p++];
                            if (ch==‘>‘) {syn=21;token[m++]=ch;}
                            else if (ch==‘=‘) {syn=22;token[m++]=ch;}
                                 else {syn=20;p--;}
                            break;

                  case ‘>‘: m=0; token[m++]=ch;
                            ch=prog[p++];
                            if (ch==‘=‘){syn=24;token[m++]=ch;}
                            else {syn=23;p--;}
                            break;
                  case ‘:‘: m=0; token[m++]=ch;
                            ch=prog[p++];
                            if (ch==‘=‘){syn=18;token[m++]=ch;}
                            else {syn=17;p--;}
                            break;
                 case ‘+‘: syn=13;token[0]=ch;break;
                  case ‘-‘: syn=14;token[0]=ch;break;
                  case ‘*‘: syn=15;token[0]=ch;break;
                  case ‘/‘: syn=16;token[0]=ch;break;
                  case ‘=‘: syn=25;token[0]=ch;break;
                  case ‘;‘: syn=26;token[0]=ch;break;
                  case ‘(‘: syn=27;token[0]=ch;break;
                  case ‘)‘: syn=28;token[0]=ch;break;
                  case ‘#‘: syn=0; token[0]=ch;break;
                  default: syn=-1;token[0]=ch;
                }
}

E()
{printf("E ");
    T();
    E1();

}

E1()
{printf("E1 ");
    if (syn==13) {
        scaner();
        T();
        E1();
    }
    else {
        if (syn!=28 && syn!=0) error();
    }
} 

T()
{printf("T ");
    F();
    T1();
}

T1()
{printf("T1 ");
    if (syn==15) {
        scaner();
        F();
        T1();
    }
    else {
        if (syn!=28 && syn!=0 && syn!=13) error();
    }
}

F()
{printf("F ");
    if (syn==27) {
        scaner();
        E();
        if(syn==28) scaner();
        else error();
    }
    else if (syn==11 || syn==10) scaner();

}
error()
{
    printf("\n (%d,%s)错误地方! \n",syn, token);
}

时间: 2024-12-13 03:17:44

c语言语法分析器的相关文章

自己动手写编译器之Tiny语言语法分析器的实现

接着上一篇文章介绍的Tiny语言的词法分析的实现,本文将介绍Tiny语言的语法分析器的实现. 1 Tiny语言的语法 下图是Tiny在BNF中的文法, 文法的定义可以看出,INNY语言有以下特点: 1 程序共有5中语句:if语句,repea语句,read语句,write语法和assign语句. 2 if语句以end作为结束符号,if语句和repeat语句允许语句序列作为主体. 3 输入/输出由保留字read和write开始.read语句一次只读出一个变量,而write语句一次只写出一个表达式.

两周自制脚本语言-第5天 设计语法分析器

第5天 设计语法分析器 5.1 Stone语言的语法 代码清单 5.1 Stone 语言的语法定义 primary : "(" expr ")" | NUMBER | IDENTIFIER | STRING factor : "-" primary | primary expr : factor { OP factor } block : "{" [ statement ] { (";" | EOL) [

Github Pages 代码语法高亮支持的语言和语法分析器

Github Pages 现只支持使用 Rouge 来代码语法高亮了. 从 Rouge 项目 中摘录支持的语言和语法分析器如下,以便查阅. apache: extend previous fix to apache and cmake lexers apiblueprint: Add a lexer for API Blueprint apple_script: utf-8 rampage biml: Initial BIML syntax highlighting support c: mak

构造可配置词法语法分析器生成器(下)

本文为笔者原创,转载请注明出处 http://blog.csdn.net/xinghongduo mylex & xparser mylex & xparser是笔者实现的类似于Lex和Yacc的词法语法分析器生成器,它接受正则表达式定义的词法规则和BNF定义的语法规则,自动构造对应的以C为宿主语言的词法分析器源程序mylex.h, mylex.c和语法分析器源程序xparser.h, xparser.c. mylex & xparser特点如下: 轻量无依赖:构造器的主要代码仅2

小白天堂之编写词法语法分析器何其简单(一)

写小白天堂系列的文章算是从这一篇开始吧,但是写这个词法语法分析器实在是因为编译原理老师扣啊,哎,没办法,只能直接写代码,当时正好将Javascript的语法基本撸了一边,所以就决定写一个JS的词法语法分析器,嗯,当然这个写哪种编程语法的分析器都一样,最多是在词法分析器中有点区别,他们的语法分析器几乎都是一样的,构造First集,Follow集,然后就是构建出预测分析表M基本就OK了,如果你还想增加Select集也可以,虽然这个东西可以不写,但是有些教科书上却讲了这个东西. 也许上面说的东西,有些

构造可配置词法语法分析器生成器(上)

本文为笔者原创,转载请注明出处 http://blog.csdn.net/xinghongduo 前言 源程序在被编译为目标程序需要经过如下6个过程:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成.词法分析和语法分析是编译过程的初始阶段,是编译器的重要组成部分,早期相关理论和工具缺乏的环境下,编写词法语法分析器是很繁琐的事情.上世纪70年代,贝尔实验室的M. E. Lesk,E. Schmidt和Stephen C. Johnson分别为Unix系统编写了词法分析器生成器Le

构造可配置词法语法分析器生成器(中)

本文为笔者原创,转载请注明出处 http://blog.csdn.net/xinghongduo   语法分析器 语法分析器(grammar parser)是编译器的核心部分之一,它的作用是检测词法分析器返回的token序列是否符合文法定义的规则.一个完整的语法分析器除了检测语法正确性外还要包含对出错的处理以及错误恢复等功能. 文法和文法类型 文法是定义一个语言的所有规则的集合,形式上定义为四元组G={VT,VN,S,P},其中: VT是非空有限符号集合,它的每个符号称为终结符,文法产生的语言由

基于语法分析器GOLD Parser开发的数学表达式计算器

最近发现一款文法分析神器,看完官网(http://goldparser.org/)的介绍后感觉很犀利的样子,于是就拿来测试了一番,写了一个数学表达式分析的小程序,支持的数学运算符如下所示:常规运算:+ - * / ^ sqrt sqrt2(a,b) pow2(a) pow(a,b)三角函数:sin cos tan cot asin acos atan acot指数对数:log2(a) log10(a) ln(a) logn(a,b) e^最大最小:max(a,b,...) min(a,b,...

编译原理 - 实验三 - 递归下降语法分析器的调试及扩展

一. 语法分析介绍 语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备.执行语法分析任务的程序叫语法分析程序或语法分析器. 二. 所实现的语义分析和代码生成程序能处理什么语句 (1)简单变量的声明语句 (2)表达式语句 (3)if语句. (4)while语句 (5)for语句 (6)write语句 (7)read语句 (8)do语句. (9)处理过程调用和返回 三.实验过程 ①用VC