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
//在输入字符串末尾加上符号'$'
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; vector
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;