第一范文网 - 专业文章范例文档资料分享平台

编译原理实验报告——词法分析器(内含源代码)

来源:用户分享 时间:2025/6/5 21:38:12 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

{

int j=0;

sr=0; /*全局变量sr是str[]的指示器*/ do {

if(set[j]==' '|| set[j]=='\\n') {

while(set[j]==' ' || set[j]=='\\n') /*扫描到有连续的空格或换行符*/

{ if(set[j]=='\\n') line++;

j++; }

str[sr]=' '; /*用一个空格代替扫描到的连续空格和换行符放入str[]*/ sr++;

} else {

str[sr]=set[j]; /*若当前字符不为空格或换行符就直接放入str[]*/ sr++; j++; }

}while(set[j]!='\\0'); str[sr]='\\0'; }

char GetChar() /*把字符读入全局变量ch中,指示器sr前移*/ {

ch=str[sr]; sr++;

return(str[sr-1]); }

void GetBC() /*开始读入符号,直至第一个不为空格*/ {

while(ch==' ') {

ch=GetChar(); } }

void Concat() /*把ch中的字符放入strtaken[]*/ {

strtaken[to]=ch;

to++; /*全局变量to是strtaken的指示器*/

strtaken[to]='\\0'; }

int IsLetter() /*判断是否为字母*/ {

if((ch>='a' && ch<='z')||(ch>='A' && ch<='Z')) return(1); else return(0); }

int IsDigit() /*判断是否为数字*/ {

if(ch>='0' && ch<='9') return(1); else return(0); }

int Reserve() /*对strtaken中的字符串查找保留字表,若是则返回它的编码,否则返回-*/ {

int i,k=0; for(i=0;i<=12;i++) {

if(stricmp(strtaken,keyword[i].name)==0) { k=1;

Words[dcount].num=keyword[i].kind; strcpy(Words[dcount].letters,\);

dcount++;

return(keyword[i].kind); } } if(k!=1) return(-1); }

void Retract() /*指示器sr回调一个字符位置,把ch置为空*/ { sr--; ch=' '; }

int InsertId() {

int i,k; for(i=0;i

k=strcmp(strtaken,sign[i]); if(k==0) return(i); }

strcpy(sign[id],strtaken); /*插入标识符*/ Words[dcount].num=13;

strcpy(Words[dcount].letters,strtaken); id++;dcount++;

return(id-1); }

int InsertConst() {

int i,k;

for(i=0;i

k=strcmp(strtaken,constant[i]); if(k==0) return(i); }

strcpy(constant[st],strtaken);/*插入常数*/

Words[dcount].num=14;

strcpy(Words[dcount].letters,strtaken);

st++;dcount++; return(st-1); }

void analysis() {

int value;

reflesh(); /*清空strtaken数组*/

pre1(); /*预处理,使注释内容换成单个空格,放回set[]中*/

pre2(); /*预处理,使set[]中连续的空格置换成单个空格,并把set[]的内容放到str[]中*/ sr=0;

GetChar(); /*把字符读入全局变量ch中,指示器sr前移*/ GetBC(); /*读取第一个字符*/

while(ch!='\\0') /*当不等于结束符,继续执行*/ {

if(IsLetter())//标识符和关键字判定

{

while(IsLetter() || IsDigit()) /*若第一个是字符,继续读取,直到出现空格*/ {

Concat();

GetChar(); /*把字符读入全局变量ch中,指示器sr前移*/ }

Retract(); /*指示器sr回调一个字符位置,把ch置为空*/ value=Reserve(); /*对strtaken中的字符串查找保留字表,若是则返回它的编码,否则返回-*/

if(value==-1) /*如果返回值是-,那就是标识符,把它输出*/ {

InsertId(); /*插入标识符*/ }

reflesh(); }

else if(IsDigit())

{

while(IsDigit()) /*否则,若第一个是数字,继续读取,直到出现空格*/ {

Concat(); /*把ch中的字符放入strtaken[]*/ GetChar(); }

Retract(); /*指示器sr回调一个字符位置,把ch置为空*/ InsertConst(); /*插入常数,返回类型为int*/ //printf(\ //getchar(); reflesh(); } else

switch(ch) /*否则,若是下面的符号*/ {

case'+': case'-': case'(': case')': case',': case';': case'=': case'>':

case'<':

编译原理实验报告——词法分析器(内含源代码).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c39dna4rs6r9gaia48856_3.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top