天天看点

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

满意答案

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

tigerlalala

推荐于 2018.05.06

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

采纳率:56%    等级:13

已帮助:14843人

||我有,这是这学期刚4102做的,

#include

#include

#include

#include

#include

#include

using namespace std;

bool isLetter(char ch){

if ((ch>='A' && ch<='Z') ||1653 (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=='#') 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<

ch=src[pos++];

ste=" ";

for(int j=0;j<47;j++){cout<

cout<

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<

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<

ss>>ste;

break;

}

}

if(j==21){ste=ste+"|"+"21";}

// cout<

cout<

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<

ss>>ste;

break;

}

}

cout<

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<

ss>>ste;

break;

}

}

cout<

continue;

}

else if(isBlank(ch))

{

cout<

ch=src[pos++];

continue;

}

}

else{

cout<

ste=" ";

}

ch=src[pos++];

}

return 0;

}

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

162分享举报