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

求一个C语言词法分析器源代码,第1张

我有,这是这学期刚做的谈昌,

#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","procedure","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=0j<47j++){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=0j<21j++){ //判断是否关键字

int t=strcmp(str,ktt[j])

if(t==0) {

stringstream ss

ste+="|"

ss<<stess<<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=34j<38j++){

int t=strcmp(str,ktt[j])

if(t==0) {

stringstream ss

ste+="|"

ss<<stess<<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=23j<47j++){

int t=strcmp(str,ktt[j])

if(t==0) {

stringstream ss

ste+="|"

ss<<stess<<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

}

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

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

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

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12483042.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存