当前位置:首页 » 操作系统 » 词法分析器源码

词法分析器源码

发布时间: 2022-05-01 16:55:52

Ⅰ 简易c语言词法分析器的设计与实现。求源代码

这个是编译原理的课程设计吧, 做词法分析这个题目算是最简单的了

  • 只需输入合法词的正则表达式,就可以输出一个确定有限状态自动机(DFA),而DFA的表现形式,往往是一张分析表。

  • 有了词法分析器的自动生成器,则可以避免繁琐的单词识别程序,直接对照分析表即可得出yes or no,

Ⅱ vb.net 词法分析器源代码+编译器源代码,谢谢

其实就是相当于写了一个字典而已,把vb.net中的关键字和自定义的变量名称写成一个字典,在需要的时候可以自动关联出来。
编译器的代码是通用的。
这些都是vs自身完成的功能。

Ⅲ 求一个C语言词法分析器源代码。要求:输入一个.c的源程序,输出该程序中所有变量。

首先做一个字符串数组
char *keyword[] 里面放入所有数据类型关键字,int,double什么的。
然后一行一行处理,找里面的关键字,找到以后顺序往后找,将空格,逗号,等号作为间隔符。将分号作为结束标志。
等号后面到下一个逗号或者分号之间的都忽略掉,如果有括号(大中小),到下一个括号之间的都忽略掉。
如果是long,unsigned,继续分析后面是不是int。
基本就ok了。你要我帮你写源码的话,没那时间。

Ⅳ 求一个C语言词法分析器源代码

我有,这是这学期刚做的,
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool isLetter(char ch){
if ((ch>='A' && ch<='Z') || (ch>='a' && ch<='z')) return true;
else return false;
}

bool isDigit(char ch){
if (ch>='0' && ch<='9') return true;
else return false;
}

bool isP(char ch){
if(ch=='+'||ch=='*'||ch=='-'||ch=='/') return true;
//ch==':'||ch==','||ch=='='||ch==';'||ch=='('||ch==')'
else return false;
}
bool isJ(char ch){
if(ch==','||ch==';'||ch=='.'||ch=='('||ch==')'||ch=='['||ch==']'||ch=='='||ch==':'||ch=='<'||ch=='>'||ch=='{'||ch=='}'||ch=='#') return true;
//
else return false;
}
bool isBlank(char ch){
if(ch==' '||ch=='\t') return true;
else return false;
}

int main(){
string src,ste,s;
char ch0,ch,ch1[2];
char ktt[48][20]={"and","begin","const","div","do","else","end","function","if","integer",
"not","or","procere","program","read","real","then","type","var","while","write","标识符","无符号数",
",",";",":",".","(",")","[","]","..","++","--","+","-","*","/","=","<",">","<>","<="
,">=",":=","{","}","#"};
int pos=0;
FILE *fp;
fp=fopen("d:\\in.txt","r");
ch0=fgetc(fp);
while(ch0!=EOF)
{
//if(ch0!='\t'){src+=ch0;}
src+=ch0;
ch0=fgetc(fp);
}
src+='#';
cout<<src<<endl;
ch=src[pos++];
ste=" ";
for(int j=0;j<47;j++){cout<<j<<ktt[j]<<endl;}
cout<<"词法分析:\n";
while(ch!='#')
{
char str[20];
if(ch!='\n')
{
if(isDigit(ch))
{ //判断常数
int i=0;
while(isDigit(ch)||ch=='.')
{
str[i++]=ch;
//i++;
ch=src[pos++];
}
str[i]='\0';
ste=ste+"|"+"22";
cout<<str;
continue;
}
else if(isLetter(ch))
{ //判断字符
int i=0,j;
while(isLetter(ch)||isDigit(ch))
{
str[i++]=ch;
//i++;
ch=src[pos++];
}
str[i]='\0';
for(j=0;j<21;j++){ //判断是否关键字
int t=strcmp(str,ktt[j]);
if(t==0) {
stringstream ss;
ste+="|";
ss<<ste;ss<<j;
ss>>ste;
break;
}
}
if(j==21){ste=ste+"|"+"21";}
// cout<<" ";
cout<<str;
continue;
}
else if(isP(ch)){ ///判断是否运算符
int i=0,j;
str[i++]=ch;
str[i]='\0';
for(j=34;j<38;j++){
int t=strcmp(str,ktt[j]);
if(t==0) {
stringstream ss;
ste+="|";
ss<<ste;ss<<j;
ss>>ste;
break;
}
}
cout<<str;
ch=src[pos++];
continue;
}
else if(isJ(ch)) //判断是否界符
{
int i=0,j;
while(isJ(ch))
{
str[i++]=ch;
ch=src[pos++];
}
str[i]='\0';
for(j=23;j<47;j++){
int t=strcmp(str,ktt[j]);
if(t==0) {
stringstream ss;
ste+="|";
ss<<ste;ss<<j;
ss>>ste;
break;
}
}
cout<<str;
continue;
}
else if(isBlank(ch))
{
cout<<ch;
ch=src[pos++];
continue;
}
}
else{
cout<<ste<<endl;
ste=" ";
}
ch=src[pos++];
}
return 0;
}

还有运行效果图,和实验报告 ,你要的话留下邮箱

Ⅳ c语言词法分析器、语法分析器、语义分析器源码

bison 网上搜以下, 开源的

Ⅵ 做一个简单的词法分析器, 一:要求能识别C程序中的部分关键字 int, char ,float if,else main, prin

时间:2012-10-30 晚
要求:输入一串字符串,对其进行词法分析,并且按照(<种别>,<字符串/数字>)格式进行输出
种别编码:
符号 种别 符号 种别 符号 种别
begin 1 + 13 <= 22
if 2 - 14 > 23
then 3 * 15 >= 24
while 4 / 16 = 25
do 5 : 17 ; 26
end 6 := 18 ( 27
l(l|d)* 10 < 20 ) 28
数字① 11 <> 21 # 0
①数字的词法正规式如下:( +|-|ε ) dd*(.dd* | ε)( e ( +|-|ε ) dd*|ε)
ps:输入的字符串以“#”结尾
运行环境:VC++6.0
说明:搜索网上的资源,大部分的“数字”部分都是dd*形式,但这次试验要求的是①形式,因而在数字部分做了很大努力。与dd*形式的不同有三个地方——ch是数字时,ch是+后接着是数字形式,ch是-后接着是数字形式。然而由于水平有限,时间较短,每个“加号”或“减号”后必须要在输入数字正负符号,否则会默认“+”“-”为正负符号而不是“加号”“减号”。希望能有简单方法解决这个问题。
源代码:

#include <stdio.h> //定义I/O库所用的某些宏和变量
#include <string.h> //定义字符串库函数
#include <math.h> //定义数学运算符号库函数
char prog[80],token[8]; //prog:缓冲区;token:一个有意义的字符串
char ch; //ch:当前处理的字符
int syn,p,m,n,f,e;
//syn:类别;p,m,n:计数变量;f,标记数字正负;e,10的次方数
double sum; //sum,数字
char *rwtab[6]={"begin","if","then","while","do","end"};
//基本字表置初值
void main(void) //主函数
{
void scaner(void); //声明函数
p=0;
printf("\n请输入字符串:\n");
do{ //输入的字符放入缓冲区
ch=getchar();
prog[p++]=ch;
}while(ch!='#');
p=0;
do{ //分析词法并输出结果
scaner();
switch(syn)
{
case 11:printf("(%2d,%16g)\n",syn,sum);break;
case -1:printf("输入错误\n");break;
default:printf("(%2d,%16s)\n",syn,token);
}
}while(syn!=0);
}
void scaner(void)
{
for(n=0;n<8;n++) //token初始化
token[n]=NULL;
ch=prog[p++];
while(ch==' ') //如果取消空字符(目前空字符只包括空格)
ch=prog[p++];
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
//如果ch是字母字符
{
m=0;
while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
//如果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; //给出syn值
break;
}
}
else if(ch>='0'&&ch<='9') //数字(1)
{
sum=0;
while(ch>='0'&&ch<='9')
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
if(ch=='.') //有小数点
{
e=-1;
ch=prog[p++];
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum+(ch-'0')*pow(10,e--);
ch=prog[p++];
}
}
}
if(ch=='e'||ch=='E') //有e
{
e=0,f=1;
ch=prog[p++];
if(ch=='+')
{
f=1;
ch=prog[p++];
}
else if(ch=='-')
{
f=-1;
ch=prog[p++];
}
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
e=e*10+ch-'0';
ch=prog[p++];
}
}
e=e*f;
sum=sum*pow(10,e);
}
p--;
syn=11;
}
else switch(ch)
{
case '<':
m=0;
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 '+':
ch=prog[p++];
if(ch>='0'&&ch<='9') //数字(2)
{
sum=0;
while(ch>='0'&&ch<='9')
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
if(ch=='.') //有小数点
{
e=-1;
ch=prog[p++];
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum+(ch-'0')*pow(10,e--);
ch=prog[p++];
}
}
}
if(ch=='e'||ch=='E') //有e
{
e=0,f=1;
ch=prog[p++];
if(ch=='+')
{
f=1;
ch=prog[p++];
}
else if(ch=='-')
{
f=-1;
ch=prog[p++];
}
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
e=e*10+ch-'0';
ch=prog[p++];
}
}
e=e*f;
sum=sum*pow(10,e);
}
p--;
syn=11;
}
else //+
{
syn=13;
p--;
ch=prog[p-1];
token[0]=ch;
}
break;
case '-':
ch=prog[p++];
if(ch>='0'&&ch<='9') //数字(3)
{
sum=0;
while(ch>='0'&&ch<='9')
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
if(ch=='.') //有小数点
{
e=-1;
ch=prog[p++];
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum+(ch-'0')*pow(10,e--);
ch=prog[p++];
}
}
}
if(ch=='e'||ch=='E') //有e
{
e=0,f=1;
ch=prog[p++];
if(ch=='+')
{
f=1;
ch=prog[p++];
}
else if(ch=='-')
{
f=-1;
ch=prog[p++];
}
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
e=e*10+ch-'0';
ch=prog[p++];
}
}
e=e*f;
sum=sum*pow(10,e);
}
sum=-sum;
p--;
syn=11;
}
else //-
{
syn=13;
p--;
ch=prog[p-1];
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;
}
}
试试吧

Ⅶ 谁有词法分析器的源代码谢谢

// 456.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
bool Isnoshow(char ch){ //判断是不是空格、回车、换行符
if(ch=='\n'||ch=='\t'||ch==' ')
return true;
return false;
}

bool Isletter(char ch){ //判断是不是字母
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
return true;
return false;
}
bool Isdigital(char ch){ //判断是不是数字
if(ch>='0'&&ch<='9')
return true;
return false;
}
bool Isunline(char ch){ //判断是不是下划线
if(ch=='_')
return true;
return false;
}
bool Iscacus(char ch){ //判断是不是运算符
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||
ch=='<'||ch=='>'||ch=='&'||ch=='|'||ch=='!'||ch=='=')
return true;
return false;
}
bool Issplits(char ch){ //判断是不是分界符
if(ch=='{'||ch=='}'||ch=='['||ch==']'||ch=='('||
ch==')'||ch==';'||ch==','||ch=='.'||ch==':'||ch=='"')
return true;
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
char b[1000];
ifstream ifile;
ifile.open("d:\\1.txt");
int i=0;
while(ifile.get(b[i])){

{
int a=i+1;
if(ifile.eof()==1) break;
if(Isletter(b[i])||Isunline(b[i]))
cout<<b[i];
else if(Isnoshow(b[i]))
{
if(Isletter(b[i-1])||Isunline(b[i-1]))
cout<<"是标识符"<<endl;
else if( Isdigital(b[i-1]))
cout<<"是数字"<<endl;
else if(Issplits(b[i-1]))
cout<<"是分界符"<<endl;
else if(Iscacus(b[i-1]))
cout<<"是运算符"<<endl;
}
else if(Isdigital(b[i]))
{
if(Isletter(b[i-1])||Isunline(b[i-1]))
cout<<"是标识符"<<endl;
else if(Issplits(b[i-1]))
cout<<b[i-1]<<"是分界符"<<endl;
else if(Iscacus(b[i-1]))
cout<<"是运算符"<<endl;
cout<<b[i];
}
else if(Iscacus(b[i]))//运算符
{
if(Isletter(b[i-1])||Isunline(b[i-1]))
cout<<"是标识符"<<endl;
else if( Isdigital(b[i-1]))
cout<<"是数字"<<endl;
else if(Issplits(b[i-1]))
cout<<"是分界符"<<endl;
cout<<b[i];
}
else if(Issplits(b[i]))//分界符
{
if(Isletter(b[i-1])||Isunline(b[i-1]))
cout<<"是标识符"<<endl;
else if( Isdigital(b[i-1]))
cout<<"是数字"<<endl;
else if(Iscacus(b[i-1]))
cout<<"是运算符"<<endl;
cout<<b[i];
}
i++;
}
}
if(b[i]='/0')
{
if(Isletter(b[i-1])||Isunline(b[i-1]))
cout<<"是标识符"<<endl;
else if( Isdigital(b[i-1]))
cout<<"是数字"<<endl;
else if(Issplits(b[i-1]))
cout<<"是分界符"<<endl;
else if(Iscacus(b[i-1]))
cout<<"是运算符"<<endl;

}

ifile.close();
return 0;
}

Ⅷ 怎么理解token,tokenize,tokenizer.

1、一种解释

token:令牌
tokenize:令牌化
tokenizer:令牌解析器

2、另一种翻译是:token可以翻译为“标记”,tokenize可以翻译为“标记解析”或“解析标记”,tokenizer可以翻译为“标记解析器”。

在编写词法分析器(Lexer)或语法分析器(Parser)的时候,除了Lexer和Parser这两个词会经常使用外,tokenize和tokenizer也会经常出现,基本上所有涉及到词法解析的源码都会用到tokenize。

在邱仲潘译的《Mastering Java 2》有这儿一段:

StreamTokenizer类根据用户定义的规则,从输入流中提取可识别的子串和标记符号,这个过程称为令牌化 ([i]tokenizing[/i]),因为流简化为了令牌符号。令牌([i]token[/i])通常代表关键字、变量名、字符串、直接量和大括号等 语法标点。

Ⅸ 求编译原理的词法分析器源码

/* 我上编译原理课时的第一次作业就是这个,flex源码. */
%{
#include<math.h>
int num_lines=0;
%}
DIGIT [0-9]
ID [a-zA-Z_][a-zA-Z0-9]*
%%
"#include" {
printf("<包含头文件,请手动合并文件\\>\n");
fprintf(yyout,"<包含头文件,请手动合并文件\\>\n");
}
{DIGIT}+ {
printf("(3整数, \"%s\")\n", yytext);
fprintf(yyout,"(3整数, \"%s\")\n", yytext);
}
{DIGIT}+"."{DIGIT}* {
printf("(3浮点数, \" %s\")\n",yytext);
fprintf(yyout,"(3浮点数, \" %s\")\n",yytext);
}
auto |
break |
case |
char |
const |
continue |
default |
do |
double |
else |
enum |
extern |
float |
for |
goto |
if |
int |
long |
register |
return |
short |
signed |
sizeof |
static |
struct |
switch |
typedef |
union |
unsigned |
void |
volatile |
while {
fprintf(yyout,"(1, \"%s\")\n",yytext);
fprintf(yyout,"(1, \"%s\")\n",yytext);
}
{ID} {
printf("(2, \"%s\")\n",yytext);
fprintf(yyout,"(2, \"%s\")\n",yytext);
}
"+" |
"++" |
"+=" |
"-" |
"--" |
"-=" |
"->" |
"*" |
"**" |
"*=" |
"/" |
"/=" |
"=" |
"==" |
">" |
">>" |
">=" |
">>=" |
"<" |
"<<" |
"<=" |
"<<=" |
"!" |
"!=" |
"%" |
"%=" |
"&" |
"&&" |
"&=" |
"|" |
"||" |
"|=" |
"^" |
"^=" {
printf("(4, \"%s\")\n",yytext);
fprintf(yyout,"(4, \"%s\")\n",yytext);
}
"{" |
"}" |
"(" |
")" |
";" |
"," |
"'" |
"\"" |
"." |
"?" |
"[" |
"]" |
"\\" |
":" {
printf("(5, \"%s\")\n",yytext);
fprintf(yyout,"(5, \"%s\")\n",yytext);
}
\n {
++num_lines;
}
"/*"[^(*/)\n]*"*/"
(" ")+
[\t]+
. {
printf("(不能识别字符, \"%s\")\n",yytext);
fprintf(yyout,"(不能识别字符, \"%s\")\n",yytext);
}
%%
main(argc,argv)
int argc;
char **argv;
{
++argv,--argc;
if(argc>0)
yyin=fopen(argv[0],"r");
else
yyin=stdin;
yyout=fopen("output.txt","w");
yylex();
fclose(yyout);
}
int yywrap()
{
return 1;
}

/* 附:我们第一次作业的要求。
实验一:用高级语言编写词法分析器(用lex生成)一、实验目的:编制一个识别C语言子集的词法分析器。从输入的源程序中,识别出各个具有独立意义的记号,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个记号的内部编码及记号符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)二、实验过程和指导:(一)准备:1.阅读课本有关章节,明确语言的词法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。2.初步编制好程序。3.准备好多组测试数据。(二)程序要求:程序输入/输出示例:如源程序为C语言。输入如下一段:main(){ int a,b; a = 10; b = a + 20;}要求输出如下:(2,”main”)(5,”(“)(5,”)“)(5,”{“)(1,”int”)(2,”a”)(5,”,”)(2,”b”)(5,”;”)(2,”a”)(4,”=”)(3,”10”)(5,”;”)(2,”b”)(4,”=”)(2,”a”)(4,”+”)(3,”20”)(5,”;”)(5,”)“}
要求(满足以下要求可获得70%该题的得分):识别保留字:if、int、for、while、do、return、break、continue其他的都识别为标识符;常数为无符号整形数;运算符包括:+、-、*、/、=、>、<、>=、<=、!=分隔符包括:,、;、{、}、(、)以上为参考,具体可自行增删。 三、实验检查:1.程序:输入:测试数据(以文件形式);输出:二元组(以文件形式)。2.实验报告:(1)功能描述:该程序具有什么功能?(2)状态转换图。(2)程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图、程序总体执行流程图。(4)源程序代码。(5)实验过程记录:出错次数、出错严重程度、解决办法摘要。(6)实验总结:你在编程过程中花时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题?遇到了哪些难题?你是怎么克服的?你对你的程序的评价?你的收获有哪些?

另可附加:关键字 有符号数 符号表填写 行号记录,等
*/

热点内容
微指令的编译方法有哪一些 发布:2024-10-05 19:02:10 浏览:884
android离线定位 发布:2024-10-05 18:36:40 浏览:858
ipad4密码忘记怎么办 发布:2024-10-05 18:36:07 浏览:237
黑莓加密天线 发布:2024-10-05 18:30:07 浏览:849
编程入行年龄 发布:2024-10-05 18:29:24 浏览:538
服务器地址访问不到 发布:2024-10-05 18:20:55 浏览:689
手机解锁忘记密码多少钱 发布:2024-10-05 18:14:25 浏览:785
linux乱码问题 发布:2024-10-05 18:00:25 浏览:543
访客仪需要电脑做服务器吗 发布:2024-10-05 17:57:57 浏览:10
怎么在u盘设置密码 发布:2024-10-05 17:55:23 浏览:580