LR语法分析器 北邮 编译原理 实验(2)

2018-12-27 15:56

string token; //存储记号 intcharState = 0; //表示开头字符的类别

while(iter != inputStr.end()) {

if(isalpha(*iter) != 0) charState = 1; else

// 字母

if(isdigit(*iter) != 0) // 数字 charState = 2; else { stringtempIter;

tempIter.push_back(*iter); // 如果在终结符串中可以搜到 if(count(numChar.begin(), numChar.begin()+8, tempIter) != 0) charState = 3; else charState = 4; }

WordElewTemp(-1, \switch(charState) { case 1://标识符 while(*iter == '_' || isalpha(*iter) != 0 || isdigit(*iter) != 0) { token.push_back(*iter); ++iter; } wTemp.style = charNum[\ wTemp.real = token; token.clear(); wordList.push_back(wTemp); break;

case 2://数字 while(isdigit(*iter) != 0) { token.push_back(*iter); ++iter; } if(*iter == '.') { token.push_back(*iter);

}

++iter; } while(isdigit(*iter) != 0) { token.push_back(*iter); ++iter; } wTemp.style = charNum[\ wTemp.real = token; token.clear(); wordList.push_back(wTemp); break;

case 3://操作符 token.push_back(*iter); wTemp.style = charNum[token]; wTemp.real = token; token.clear(); wordList.push_back(wTemp); ++iter; break;

default://出现space 或错误终结符时的处理 if(isspace(*iter) == 0) //when 'iter' belongs to 'space', ignore it. { printf(\ printf(\ } ++iter; break; }//end of switch(charState)

}//end of while(iter != inputStr.end())

//打印词法分析结果

printf(\词法分析过程******************\\n\cout<< \

for(vector::iterator i = wordList.begin(); i != wordList.end(); ++i) { cout<< \}

//在输入字符串末尾加上符号'$'

wordList.push_back(WordEle(charNum[\

/**

* Description: 由文件input.txt读入分析程序所需的的数据 * Arguments: * Returns: */

voidinputData() {

ifstreaminFileStre(\ //读入文件流

if(!inFileStre) { cerr<< \} else { /* 一下遇到一个大问题!花很长时间才解决!!!要牢记!! 字符串流i.str(line) 当line改变再次使用i.str(line)时, 文件读入并不是从头开始,而是保留上次的位置!!! 此时需要清除错误状态!!!!!!!.clear()*/ //每次读入一行,再使用字符串流处理这一行的数据 string line; string word; int number = 0;

istringstreaminStrStre(line); //读入字符串流

getline(inFileStre, line); getline(inFileStre, line); inStrStre.str(line);

while(inStrStre>> word) //read in terminal character. { charNum[word] = number++; numChar.push_back(word); }

getline(inFileStre, line); getline(inFileStre, line); inStrStre.clear(); inStrStre.str(line); //read in non-terminal character. #ifdef DEBUG_ cout<< \ \

#endif

while(inStrStre>> word) { #ifdef DEBUG_ cout<< \ #endif charNum[word] = number++; numChar.push_back(word); }

charNum*\ numChar.push_back(\ charNum[\numChar.push_back(\

getline(inFileStre, line); getline(inFileStre, line); while(line != \ //read in production { inStrStre.clear(); inStrStre.str(line); inStrStre>> word; #ifdef DEBUG_ cout<< \ \ #endif proListL.push_back(charNum[word]); inStrStre>> word; vectorvecTemp; while(inStrStre>> word) { vecTemp.push_back(charNum[word]); } proListR.push_back(vecTemp); getline(inFileStre, line); }

getline(inFileStre, line); getline(inFileStre, line); getline(inFileStre, line); intxTemp; stringyTemp; charsTemp;

formElefEleTemp;

while(line != \ //read in form item

{ inStrStre.clear(); inStrStre.str(line); inStrStre>>xTemp>>yTemp>>sTemp>>fEleTemp.num; #ifdef DEBUG_ cout<< \ \ #endif switch(sTemp) { case 's': fEleTemp.style = SHIFT; break; case 'r': fEleTemp.style = REDUCE; break; case 'g': fEleTemp.style = GOTO; break; case 'a': fEleTemp.style = ACCEPT; break; case 'e': fEleTemp.style = ERROR; break; default: cerr<< \ #ifdef DEBUG_ cout<< \ \ #endif break; } form[make_pair(xTemp, charNum[yTemp])] = fEleTemp; form. getline(inFileStre, line); }//end of while(line != \ }//end of else } /*

* Description: main fuction */

int main(intargc, char *argv[])

//add this pair to the

{ inputData(); printf(\*****************************\\n\

语法分析程序

printf(\ ——volantfish_10211xxx_2010211309\\n\\n\ string inputStr; //待分析输入字符串 cout<< \ getline(cin, inputStr); }

LexiAna(inputStr); //词法分析 GramAna(); //语法分析主程序

return 0;


LR语法分析器 北邮 编译原理 实验(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:(新)某居住小区东区会所钢结构工程施工组织设计 -

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: