#include <iostream> #include <string.h> #include <ctype.h> char prog[80],token[8]; char ch; int syn,p,m,n,kk,sum=0; char *rwtab[6]={"begin","if","then","while","do","end"}; int lrparser(); int yucu(); int statement(); int expression(); int term(); int factor(); void scanner() { m=0; for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==‘ ‘)ch=prog[p++]; if(isalpha(ch))//字母字符 { while(isdigit(ch)||isalpha(ch))//字母或数字字符 { token[m++]=ch; ch=prog[p++]; } token[m++]=‘\0‘;p--;syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else if(isdigit(ch))//数字字符 { sum=0; while(isdigit(ch))//shuzi { sum=sum*10+ch-‘0‘; ch=prog[p++]; } p--; syn=11; } else switch(ch) { case ‘<‘: m=0; token[m++]=ch; ch=prog[p++]; if(ch==‘>‘) { syn=22; token[m++]=ch; } else 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=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; } } int lrparser()//分析语句串开始结束 { //scanner();//读取下一个单词符号 if(syn==1) { scanner(); yucu(); if(syn==6) { scanner(); if(syn==0&&(kk==0)) printf("Success!"); } else{ if(kk!=1) printf("lose end!"); kk=1; } } else{ printf("lose begin!"); kk=1; } return 1; } int yucu() { statement(); while(syn==26)//分号, { scanner(); statement(); } return 1; } int statement()//赋值语句分析 { if(syn==10)//标示符 { scanner(); if(syn==18)//赋值号:= { scanner(); expression(); } else{printf(":=错误!");kk=1;} } return 1; } int expression() { term(); while(syn==13||syn==14) { scanner(); term(); } return 1; } int term()//运算符识别 { factor(); while(syn==15||syn==16) { scanner(); factor(); } return 1; } int factor() { if(syn==11||syn==10) scanner(); else if(syn==27) { scanner(); expression(); if(syn==28) scanner(); else { printf("‘)‘ERROR!"); kk=1; } } else { printf("biaodashicuowu"); } return 1; } void main() { p=0; printf("\n please input string:\n"); do{ ch=getchar(); prog[p++]=ch; }while(ch!=‘#‘); p=0; scanner(); lrparser(); |
简单语法分析器实现
时间: 2024-10-13 10:08:01
简单语法分析器实现的相关文章
小白天堂之编写词法语法分析器何其简单(一)
写小白天堂系列的文章算是从这一篇开始吧,但是写这个词法语法分析器实在是因为编译原理老师扣啊,哎,没办法,只能直接写代码,当时正好将Javascript的语法基本撸了一边,所以就决定写一个JS的词法语法分析器,嗯,当然这个写哪种编程语法的分析器都一样,最多是在词法分析器中有点区别,他们的语法分析器几乎都是一样的,构造First集,Follow集,然后就是构建出预测分析表M基本就OK了,如果你还想增加Select集也可以,虽然这个东西可以不写,但是有些教科书上却讲了这个东西. 也许上面说的东西,有些
构造可配置词法语法分析器生成器(下)
本文为笔者原创,转载请注明出处 http://blog.csdn.net/xinghongduo mylex & xparser mylex & xparser是笔者实现的类似于Lex和Yacc的词法语法分析器生成器,它接受正则表达式定义的词法规则和BNF定义的语法规则,自动构造对应的以C为宿主语言的词法分析器源程序mylex.h, mylex.c和语法分析器源程序xparser.h, xparser.c. mylex & xparser特点如下: 轻量无依赖:构造器的主要代码仅2
一、存储过程中使用事务的简单语法
一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : Create Procedure MyProcedure( @Param1 nvarchar(10),@param2 nvarchar(10))ASBeginSet NOCOUNT ON;Set XACT_ABORT ON;Begin TranDelete from table1 where name=’
构造可配置词法语法分析器生成器(上)
本文为笔者原创,转载请注明出处 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
语法分析器自动生成工具一览
Lex/Yacc 它生于Unix,是最经典的词法\语法分析器,是经典教材中的示例御用工具.现在它也支持在Windows上生成(安装环境),然而其所生成语法分析器的语言仅有C语言. Flex/Bison 与前者类似,Bison与Yacc有很高的兼容性.生成语言为C.C++和Java. CoCo/R 较早的一个语法分析器生成工具.其生成语法分析器的语言极其之多,包括C#. Java. C++.F#.VB.Net.Oberon等等. ANTLR 作为翻译程序的一部分,你可以使用简单的操作符和动作来参数
LR(1)语法分析器生成器(生成Action表和Goto表)java实现(二)
本来这次想好好写一下博客的...结果耐心有限,又想着烂尾总比断更好些.于是还是把后续代码贴上.不过后续代码是继续贴在BNF容器里面的...可能会显得有些臃肿.但目前管不了那么多了.先贴上来吧hhh.说不定哪天觉得羞耻又改了呢.参考资料建议参考<编译器设计>一书. 目前完成进度 : 目前已经完成了表驱动,通过函数输出这个Action 和 Goto表.然后使用者就可以根据两个表来进行LR(1)语法分析.且经过比对,发现和书上的例子(括号语法)是完全吻合的. 1 package cn.vizdl.L