简单词法分析器的实现

用c语言对一个简单的语言的子集编制一个一遍扫描的编译程序


#include <iostream>

#include <string.h>

#include <ctype.h>

char prog[80],token[8];

char ch;

int syn,p,m,n,sum=0;

char *rwtab[6]={"begin","if","then","while","do","end"};

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;

}

}

void main()

{

using namespace std;

p=0;

int i;

printf("\n   please input string:\n");

do{

ch=getchar();

prog[p++]=ch;

}while(ch!=‘#‘);

p=0;

do{

scanner();

switch(syn)

{

case   11:printf("(%d,%d)",syn,sum);

break;

case   -1:printf("ERROR!");

break;

default:

printf("(%d,",syn);

for(i=0;i<strlen(token);i++)

{

printf("%c",token[i]);

}

printf(")");

}

}while(syn!=0);

}

时间: 2024-11-07 08:58:29

简单词法分析器的实现的相关文章

编译原理简单词法分析器(first,follow,分析表)源码下载

编译原理(简单词法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90%E5%99%A8.zip

java实现的简单词法分析器

一个简单的词法分析器 词法分析(Lexical Analysis) 是编译的第一阶段.词法分析器的主要任务是读入源程序的输入字符.将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素.这个词法单元序列被输出到语法分析器进行语法分析. 有关原理的介绍参考http://www.cnblogs.com/yanlingyin/archive/2012/04/17/2451717.html 这里就不多说了. 下面直接代码,相关注释在代码中均已经给出,对字符串的处理完全按照自己的思路编写的.

简单词法分析器实现

编写分析器有两种方法,一种是通过DFA对单词进行识别,二是通过直接编敲代码进行识别. 本程序採用DFA对单词进行识别. DFA的实现方法.大概思想和书上一致,在程序中,则是用二维数组代表状态转换矩阵,用一维数组表示终态. 一个词法编辑要实现的功能主要包含下面几点: 可以识别标识符.keyword.数字和运算符,对凝视进行过滤.同一时候还能识别出程序错误. 使用说明: 本程序的输入由当前文件夹下的in.txt文件读取输入,输出为一系列二元式 #include<stdio.h> #include&

表达式求值:从“加减”到“带括号的加减乘除”的实践过程

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee ● 为什么想做一个表达式求值的程序 最近有一个需求,策划想设置游戏关卡的某些数值,这个数值不是一个常量,而是根据关卡的某些环境数据套上一个计算表达式算出来的.这个需求无法用excel拖表预计算出,因为关卡的环境数据只有在游戏中才能产生,在excel制表时,这些都是未知的.作为程序员,我可以把计算表达式硬编码在代码中,但这个做法有缺陷,如果策划要修改计算表达式的话,只能通过我修改程序并

编译原理(简单自动词法分析器LEX)

编译原理(简单自动词法分析器LEX)源程序下载地址:  http://files.cnblogs.com/files/hujunzheng/%E6%B1%87%E7%BC%96%E5%8E%9F%E7%90%86%E7%AE%80%E5%8D%95LEX%EF%BC%88%E8%AF%8D%E6%B3%95%E8%87%AA%E5%8A%A8%E5%88%86%E6%9E%90%E5%99%A8%EF%BC%89.zip

C词法分析器的Python简单实现

原文引用https://www.dazhuanlan.com/2019/08/25/5d62598fd13ee/ 在学习编译原理的课程设计中,需要设计一个词法分许进程.于是尝试用Python来简单实现C语言词法分析器.其中其实并没有什么具体需要克服的难处,只要将部分的词法分析DFA设计好,实现起来思路便更清晰. ? 1.前言 C语言中我们需要提取出关键字,标识符,分隔符,运算符,不同数据类型的常量.其中标识符.标识符及分隔符的提取更简单,而运算符因为各运算符组合具有不同意义需详细分解,例如:>>

自己动手实现简单编译器之(二)词法分析器和有穷自动机

一:实验指导书 对下述单词表定义的语言设计编制一个词法分析器.单词符号及种别表和词法分析器功能及基本要求如下: (1)单词符号及种别表 单词符号 种别编码 单词值 main 1   int 2   float 3   double 4   char 5   if 6   else 7   do 8   while 9   l(l|d)* 10 内部字符串 ( +|-|ε ) dd*(.dd* | ε)( e ( +|-|ε ) dd*|ε) 20 二进制数值表示 = 21   + 22   -

简易词法分析器

最近开始学习编译器,希望能坚持下去,通过做编译器也把c++练好点,今天花了一天做了一个简单的词法分析器,过几天编译原理书到了后,希望能通过看书得到更好的方法. //learn.cpp #include <iostream> #include "learn.h" #include <fstream> using namespace std; static char *st_line; static int st_line_pos; int length; type

Luence简单实现1

初步认识Luence,简单按照官方文档做了个例子,大牛绕开,仅供小白路过参考.如有错误,欢迎指正批评. 建一个简单工程,并且加入这几个小奶瓶,如下图: 注:版本不同,可能对jdk的需求是不同的,这个需要注意,我在尝试的6.1.0的时候,在jdk1.7下会报错,在java8下就没问题.5.x的在1.7下应该没问题,具体需要自行百度. 然后根据官网例子,稍加修改,如下:本例子基于内存存储 //创建词法分析器 Analyzer analyzer = new StandardAnalyzer(); //