CMM语法分析(C++实现)

来源:互联网 发布:网络侦探练哪些 编辑:程序博客网 时间:2024/06/05 05:37

语法分析,采用递归下降实现(本人觉得LL(1)看着太麻烦了),使用

构造了一个树节点的类用来存储(本来没写,后来不知道怎么打印语法树就写了下,写了之后还是不清楚怎么打印语法树—_—,现在看来太蠢了,不知道那位仁兄有更好的方法赐教一下)

文法:(该文发修改自一位仁兄,现在找不到链接了,若原作者或之情人士看到请提醒我)

(该文发规定较为严格,对于if-else必须使用if(条件){语句},{}不能省略)

program->stmt-sequence
stmt-sequence->{statement}
statement->declare-stmt|assign-stmt|write-stmt|read-stmt|if-stmt|while-stmt
declare-stmt->type-specifier identifier(= exp);
assign-stmt->identifier = exp;
identifier->ID{'['INTNUM']'}
write-stmt->write exp;
read-stmt->read identifier;
if-stmt->if'('condition')''{'stmt-sequence'}'(else'{'stmt-sequence'}')
while-stmt->while'('condition')''{'stmt-sequence'}'
condition->exp comparision-op exp
comparision-op-><|>|==|<>
exp->(+|-)term{addop term}
addop->+|-
term->facter{mulop factor}
mulop->*|/
factor->INTNUM|REALNUM|'('exp')'|identifier
type-specifier->int|real

SynTree.h

#ifndef __SynTree__Test__#define __SynTree__Test__#include <stdio.h>#include <string>using namespace std;class SynTree{public:SynTree(void);~SynTree(void);static SynTree* create();bool init();void setNBro(SynTree *brother);SynTree* getNBro();void setFChild(SynTree *child);SynTree* getFChild();void setContent(string newContent);string getContent();static SynTree* getTheHead();private:SynTree *nBro;//下一个兄弟节点SynTree *fChild;//第一个子节点static SynTree *theHead;string content;};#endif // !__SynTree__Test__
SynTree.cpp

#include "SynTree.h"using namespace std;SynTree* SynTree::theHead = SynTree::create();SynTree::SynTree(){}SynTree::~SynTree(){delete nBro;delete fChild;nBro = NULL;fChild = NULL;}SynTree* SynTree::create(){SynTree *pRet = new SynTree();if(pRet && pRet->init()){return pRet;}else{delete pRet;pRet = NULL;return NULL;}}bool SynTree::init(){bool bRet = false;do{nBro = NULL;fChild = NULL;content = "";bRet = true;}while(0);return bRet;}void SynTree::setNBro(SynTree *brother){this->nBro = brother;}SynTree* SynTree::getNBro(){return nBro;}void SynTree::setFChild(SynTree *child){this->fChild = child;}SynTree* SynTree::getFChild(){return this->fChild;}void SynTree::setContent(string newContent){this->content = newContent;}string SynTree::getContent(){return this->content;}SynTree* SynTree::getTheHead(){return theHead;}
Task3.h

#ifndef __Task3__Test__#define __Task3__Test__#include <stdio.h>#include "WordList.h"#include <string.h>#include "SynTree.h"using namespace std;class Task3{public:Task3(void);~Task3(void);void stmtSequence();//处理程序void statement(SynTree *nowTree);//处理句子void declareStmt(SynTree *nowTree);//处理声明语句void assignStmt(SynTree *nowTree);//处理赋值语句void writeStmt(SynTree *nowTree);//处理write语句void readStmt(SynTree *nowTree);//处理read语句void ifStmt(SynTree *nowTree);//处理if语句void whileStmt(SynTree *nowTree);//处理while语句void identifier(SynTree *nowTree);//处理标识符以及标识符数组void exp(SynTree *nowTree);//处理算术表达式void condition(SynTree *nowTree);//处理判断式void comparisionOp(SynTree *nowTree);//处理判断式符号void addop(SynTree *nowTree);//处理+和-void term(SynTree *nowTree);//处理算术表达式中的乘和除void mulop(SynTree *nowTree);//处理*和/void factor(SynTree *nowTree);//处理算术表达式中的因子void typeSpecifier(SynTree *nowTree);//处理声明符号中的类型void printSynTree();void printNBro(SynTree *tree);void printFChild(SynTree *tree);private:WordList *nowWordList;//指向当前处理的wordlistbool flag;SynTree *stmtFlag;//记录到哪个语句};#endif // !__Task3__Test__
Task3.cpp
#include "Task3.h"#include <iostream>#include <cctype>using namespace std;Task3::Task3(){nowWordList = WordList::getHead();stmtFlag = SynTree::create();}Task3::~Task3(){}void Task3::stmtSequence(){while(nowWordList->getNext() != NULL){if(nowWordList->getNext()->getType() == NOTE|| nowWordList->getNext()->getType() == NOTE_WRONG){if(nowWordList->getNext()->getNext() != NULL){nowWordList->setNext(nowWordList->getNext()->getNext());}else{nowWordList->setNext(NULL);}}nowWordList = nowWordList->getNext();}WordList *flag = WordList::create();nowWordList = WordList::getHead()->getNext();SynTree *fTree = SynTree::getTheHead();fTree->setContent("程序");fTree->setFChild(stmtFlag);bool flagForTree = true;while(nowWordList != NULL && nowWordList->getType() != 0){if(flagForTree){flagForTree = false;}else{SynTree *nextTree = SynTree::create();stmtFlag->setNBro(nextTree);stmtFlag = nextTree;}this->statement(stmtFlag);}}void Task3::statement(SynTree *nowTree){SynTree *nextTree = SynTree::create();nowTree->setFChild(nextTree);switch (nowWordList->getType()){case IF:nowTree->setContent("if语句");this->ifStmt(nextTree);break;case WHILE:nowTree->setContent("while语句");this->whileStmt(nextTree);break;case READ:nowTree->setContent("read语句");this->readStmt(nextTree);break;case WRITE:nowTree->setContent("while语句");this->writeStmt(nextTree);break;case INT:case REAL:nowTree->setContent("声明语句");this->declareStmt(nextTree);break;case IDENTIFER:nowTree->setContent("赋值语句");this->assignStmt(nextTree);break;default:cout<<"第"<<nowWordList->getLine()<<"行出现错误,未知的表达式\n";nowWordList = nowWordList->getNext();break;}}void Task3::declareStmt(SynTree *nowTree){SynTree *cTree = SynTree::create();nowTree->setFChild(cTree);nowTree->setContent("数据类型");this->typeSpecifier(cTree);SynTree *nextTree = SynTree::create();nowTree->setNBro(nextTree);if(nowWordList->getType() == IDENTIFER){nextTree->setContent("标识符");SynTree *next_2_Tree = SynTree::create();nextTree->setFChild(next_2_Tree);this->identifier(next_2_Tree);if(nowWordList->getType() == SEMI){SynTree *next_3_Tree = SynTree::create();nextTree->setNBro(next_3_Tree);next_3_Tree->setContent(";");nowWordList = nowWordList->getNext();//无错时在这里处理要输出的东西}else if(nowWordList->getType() == ASG){SynTree *next_3_Tree = SynTree::create();nextTree->setNBro(next_3_Tree);next_3_Tree->setContent("=");SynTree *next_4_Tree = SynTree::create();next_3_Tree->setNBro(next_4_Tree);next_4_Tree->setContent("运算表达式");SynTree *next_4_child_tree = SynTree::create();next_4_Tree->setFChild(next_4_child_tree);nowWordList = nowWordList->getNext();this->exp(next_4_child_tree);if(nowWordList->getType() == SEMI){nowWordList = nowWordList->getNext();SynTree *next_5_Tree = SynTree::create();next_4_Tree->setNBro(next_5_Tree);next_5_Tree->setContent(";");//无错时在这里处理要输出的东西}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少;\n";return;}}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少;\n";return;}}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,类型名后应该跟标识符\n";return;}}void Task3::assignStmt(SynTree *nowTree){SynTree *now_child = SynTree::create();nowTree->setContent("变量");nowTree->setFChild(now_child);this->identifier(now_child);SynTree *next_1 = SynTree::create();nowTree->setNBro(next_1);if(nowWordList->getType() == ASG){next_1->setContent("=");SynTree *next_2 = SynTree::create();next_1->setNBro(next_2);next_2->setContent("算术表达式");SynTree *next_2_c = SynTree::create();next_2->setFChild(next_2_c);nowWordList = nowWordList->getNext();this->exp(next_2_c);SynTree *next_3 = SynTree::create();next_2->setNBro(next_3);if(nowWordList->getType() == SEMI){nowWordList = nowWordList->getNext();next_3->setContent(";");//无错时在这里处理要输出的东西}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少;\n";return;}}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少=\n";return;}}void Task3::identifier(SynTree *nowTree){nowTree->setContent(nowWordList->getContent());SynTree *next_1 = SynTree::create();if(nowWordList->getNext()->getType() == LEFT_INDEX){nowTree->setNBro(next_1);next_1->setContent("[");SynTree *next_2 = SynTree::create();next_1->setNBro(next_2);nowWordList = nowWordList->getNext()->getNext();int toInt = atoi(nowWordList->getContent().c_str());if(nowWordList->getType()==INT_VAL && toInt>=0){next_2->setContent(nowWordList->getContent());SynTree *next_3 = SynTree::create();next_2->setNBro(next_3);if(nowWordList->getNext()->getType() == RIGHT_INDEX){nowWordList = nowWordList->getNext()->getNext();//无错时在这里处理要输出的东西next_3->setContent("]");}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少]\n";nowWordList = nowWordList->getNext();return;}}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,数组下标应输入正整数\n";return;}}else{nowWordList = nowWordList->getNext();}}void Task3::ifStmt(SynTree *nowTree){nowTree->setContent("if");SynTree *next_1 = SynTree::create();nowTree->setNBro(next_1);if(nowWordList->getNext()->getType() == LEFT_BRA){nowWordList = nowWordList->getNext()->getNext();next_1->setContent("(");SynTree *next_2 = SynTree::create();next_1->setNBro(next_2);next_2->setContent("判断语句");SynTree *next_2_c = SynTree::create();next_2->setFChild(next_2_c);this->condition(next_2_c);SynTree *next_3 = SynTree::create();next_2->setNBro(next_3);if(nowWordList->getType() == RIGHT_BRA){next_3->setContent(")");SynTree *next_4 = SynTree::create();next_3->setNBro(next_4);nowWordList = nowWordList->getNext();if(nowWordList->getType() == LEFT_BOUNDER){next_4->setContent("{");SynTree *next_5 = SynTree::create();next_4->setNBro(next_5);next_5->setContent("语句");SynTree *next_5_c = SynTree::create();next_5->setFChild(next_5_c);bool flagForn = true;nowWordList = nowWordList->getNext();while(nowWordList->getType() != RIGHT_BOUNDER && nowWordList->getType() != 0){if(flagForn){flagForn = false;}else{SynTree *next_5_c_n = SynTree::create();next_5_c->setNBro(next_5_c_n);next_5_c = next_5_c_n;}this->statement(next_5_c);}SynTree *next_6 = SynTree::create();next_5->setNBro(next_6);next_6->setContent("}");if(nowWordList->getNext()->getType() == ELSE){SynTree *next_7 = SynTree::create();next_6->setNBro(next_7);next_7->setContent("else");SynTree *next_8 = SynTree::create();next_7->setNBro(next_8);nowWordList = nowWordList->getNext();if(nowWordList->getNext()->getType() == LEFT_BOUNDER){next_8->setContent("{");SynTree *next_9 = SynTree::create();next_8->setNBro(next_9);next_9->setContent("句子");SynTree *next_9_c = SynTree::create();next_9->setFChild(next_9_c);bool flagFora = true;nowWordList = nowWordList->getNext()->getNext();while(nowWordList->getType() != RIGHT_BOUNDER && nowWordList->getType() != 0){if(flagFora){flagFora = false;}else{SynTree *next_9_c_n = SynTree::create();next_9_c->setNBro(next_9_c_n);next_9_c = next_9_c_n;}this->statement(next_9_c);}nowWordList = nowWordList->getNext();//无错时在这里处理要输出的东西SynTree *next_10 = SynTree::create();next_9->setNBro(next_10);next_10->setContent("}");}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少{\n";return;}}else{nowWordList = nowWordList->getNext();//无错时在这里处理要输出的东西}}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少{\n";return;}}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少)\n";return;}}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少(\n";return;}}void Task3::whileStmt(SynTree *nowTree){nowTree->setContent("while");SynTree *next_1 = SynTree::create();nowTree->setNBro(next_1);if(nowWordList->getNext()->getType() == LEFT_BRA){next_1->setContent("(");SynTree *next_2 = SynTree::create();next_1->setNBro(next_2);next_2->setContent("判断语句");SynTree *next_2_c = SynTree::create();next_2->setFChild(next_2_c);nowWordList = nowWordList->getNext()->getNext();this->condition(next_2_c);SynTree *next_3 = SynTree::create();next_2->setNBro(next_3);if(nowWordList->getType() == RIGHT_BRA){next_3->setContent(")");SynTree *next_4 = SynTree::create();next_3->setNBro(next_4);nowWordList = nowWordList->getNext();if(nowWordList->getType() == LEFT_BOUNDER){next_4->setContent("{");SynTree *next_5 = SynTree::create();next_4->setNBro(next_5);next_5->setContent("句子");SynTree *next_5_c = SynTree::create();next_5->setFChild(next_5_c);bool flagFora = true;nowWordList = nowWordList->getNext();while(nowWordList->getType() != RIGHT_BOUNDER && nowWordList->getType() != 0){if(flagFora){flagFora = false;}else{SynTree *next_5_c_n = SynTree::create();next_5_c->setNBro(next_5_c_n);next_5_c = next_5_c_n;}this->statement(next_5_c);}nowWordList = nowWordList->getNext();//无错时在这里处理要输出的东西SynTree *next_6 = SynTree::create();next_5->setNBro(next_6);next_6->setContent("}");}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少{\n";return;}}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少)\n";return;}}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少(\n";return;}}void Task3::writeStmt(SynTree *nowTree){nowTree->setContent("write");SynTree *next_1 = SynTree::create();nowTree->setNBro(next_1);next_1->setContent("算术表达式");SynTree *next_1_c = SynTree::create();next_1->setFChild(next_1_c);nowWordList = nowWordList->getNext();this->exp(next_1_c);SynTree *next_2 = SynTree::create();next_1->setNBro(next_2);if(nowWordList->getType() == SEMI){next_2->setContent(";");nowWordList = nowWordList->getNext();//无错时在这里处理要输出的东西}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少;\n";return;}}void Task3::readStmt(SynTree *nowTree){nowTree->setContent("read");SynTree *next_1 = SynTree::create();nowTree->setNBro(next_1);next_1->setContent("标识符");SynTree *next_1_c = SynTree::create();next_1->setFChild(next_1_c);nowWordList = nowWordList->getNext();this->identifier(next_1_c);SynTree *next_2 = SynTree::create();next_1->setNBro(next_2);if(nowWordList->getType() == SEMI){next_2->setContent(";");nowWordList = nowWordList->getNext();//无错时在这里处理要输出的东西}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少;\n";return;}}void Task3::typeSpecifier(SynTree *nowTree){if(nowWordList->getType() == INT){//无错时在这里处理要输出的东西nowTree->setContent("int");}else if(nowWordList->getType() == REAL){//无错时在这里处理要输出的东西nowTree->setContent("real");}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,错误的声明关键字\n";return;}nowWordList = nowWordList->getNext();}void Task3::condition(SynTree *nowTree){nowTree->setContent("算术表达式");SynTree *now_c = SynTree::create();nowTree->setFChild(now_c);this->exp(now_c);SynTree *next_1 = SynTree::create();nowTree->setNBro(next_1);next_1->setContent("判断符号");SynTree *next_1_c = SynTree::create();next_1->setFChild(next_1_c);this->comparisionOp(next_1_c);SynTree *next_2 = SynTree::create();next_1->setNBro(next_2);next_2->setContent("算术表达式");SynTree *next_2_c = SynTree::create();next_2->setFChild(next_2_c);this->exp(next_2_c);}void Task3::comparisionOp(SynTree *nowTree){switch (nowWordList->getType()){case 46://无错时在这里处理要输出的东西nowTree->setContent("<");break;case 47://无错时在这里处理要输出的东西nowTree->setContent(">");break;case 48://无错时在这里处理要输出的东西nowTree->setContent("<>");break;case 54://无错时在这里处理要输出的东西nowTree->setContent("==");break;default:cout<<"第"<<nowWordList->getLine()<<"行出现错误,错误的比较符\n";return;break;}nowWordList = nowWordList->getNext();}void Task3::addop(SynTree *nowTree){if(nowWordList->getType() == ADD){//无错时在这里处理要输出的东西nowTree->setContent("+");}else if(nowWordList->getType() == SUB){//无错时在这里处理要输出的东西nowTree->setContent("-");}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,应该是+或-\n";return;}nowWordList = nowWordList->getNext();}void Task3::term(SynTree *nowTree){nowTree->setContent("算式因子");SynTree *now_c = SynTree::create();nowTree->setFChild(now_c);this->factor(now_c);SynTree *next = SynTree::create();bool flagFora = true;while(nowWordList->getType() == MUL|| nowWordList->getType() == DIV){if(flagFora){nowTree->setNBro(next);flagFora = false;}else{SynTree *next_n = SynTree::create();next->setNBro(next_n);next = next_n;}next->setContent(nowWordList->getContent());nowWordList = nowWordList->getNext();SynTree *next_nn = SynTree::create();next->setNBro(next_nn);next_nn->setContent("算式因子");next = next_nn;SynTree *next_c = SynTree::create();next->setFChild(next_c);this->factor(next_c);}}void Task3::mulop(SynTree *nowTree){if(nowWordList->getType() == MUL){//无错时在这里处理要输出的东西nowTree->setContent("*");}else if(nowWordList->getType() == DIV){//无错时在这里处理要输出的东西nowTree->setContent("/");}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,应该是*或/\n";return;}nowWordList = nowWordList->getNext();}void Task3::factor(SynTree *nowTree){if(nowWordList->getType() == INT_VAL){//无错时在这里处理要输出的东西nowTree->setContent(nowWordList->getContent());}else if(nowWordList->getType() == REAL_VAL){//无错时在这里处理要输出的东西nowTree->setContent(nowWordList->getContent());}else if(nowWordList->getType() == IDENTIFER){nowTree->setContent("变量名");SynTree *now_c = SynTree::create();nowTree->setFChild(now_c);this->identifier(now_c);//无错时在这里处理要输出的东西return;}else if(nowWordList->getType() == LEFT_BRA){nowTree->setContent("(");SynTree *next_1 = SynTree::create();nowTree->setNBro(next_1);nowWordList = nowWordList->getNext();next_1->setContent("算术表达式");SynTree *next_1_c = SynTree::create();next_1->setFChild(next_1_c);this->exp(next_1_c);SynTree *next_2 = SynTree::create();next_1->setNBro(next_2);if(nowWordList->getType() == RIGHT_BRA){//无错时在这里处理要输出的东西next_2->setContent(")");}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,缺少)\n";return;}}else{cout<<"第"<<nowWordList->getLine()<<"行出现错误,不合适的表达式\n";return;}nowWordList = nowWordList->getNext();}void Task3::exp(SynTree *nowTree){if(nowWordList->getType() == ADD || nowWordList->getType() == SUB){nowTree->setContent(nowWordList->getContent());SynTree *next = SynTree::create();nowTree->setNBro(next);nowTree = next;nowWordList = nowWordList->getNext();}nowTree->setContent("式1");SynTree *now_c = SynTree::create();nowTree->setFChild(now_c);this->term(now_c);SynTree *next = SynTree::create();bool flagFora = true;while(nowWordList->getType() == ADD || nowWordList->getType() == SUB){if(flagFora){nowTree->setNBro(next);flagFora = false;}else{SynTree *next_n = SynTree::create();next->setNBro(next_n);next = next_n;}next->setContent(nowWordList->getContent());SynTree *next_nn = SynTree::create();next->setNBro(next_nn);next = next_nn;next->setContent("式1");SynTree *next_c = SynTree::create();next->setFChild(next_c);nowWordList = nowWordList->getNext();this->term(next_c);}}void Task3::printSynTree(){SynTree *headFlag = SynTree::getTheHead();this->printNBro(headFlag);}void Task3::printNBro(SynTree *tree){while(tree != NULL){cout<<tree->getContent();this->printFChild(tree);tree = tree->getNBro();}}void Task3::printFChild(SynTree *tree){tree = tree->getFChild();cout<<"\n";this->printNBro(tree);}

其中stmtSequence、statement、declareStmt、assignment、writeStmt、ReadStmt、ifStmt、whileStmt、identifier、exp、condition、comparisionOp、addop、term、mulop、factor、typeSpecifier为处理文法中每个式子的函数。

printSynTree、printNBro、printFChild为打印语法树的函数(不建议使用)。



0 0
原创粉丝点击