编译原理end

举报
兔老大 发表于 2021/04/22 00:50:49 2021/04/22
【摘要】 #include<bits/stdc++.h>using namespace std; const int max_word = 505;//关键字 const char keyWord[13][20] = {"main","if","else","do","while","for","switch","case","int","double","float","...

  
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int max_word = 505;
  4. //关键字
  5. const char keyWord[13][20] = {"main","if","else","do","while","for","switch",
  6. "case","int","double","float","long","void"};
  7. //单词表
  8. struct Word{
  9. char value[20];//单词值
  10. int type;//单词种类
  11. int line;//行号
  12. }w[max_word];
  13. //四元式
  14. struct si_Yuan{
  15. string op;//运算符
  16. string s1;
  17. string s2;
  18. string res;//结果
  19. }sy[105];
  20. //文件流
  21. FILE *fin,*fout;
  22. int line = 1;
  23. char token[12];//存放单词
  24. int flag = 0;//判断是否获取字符
  25. int flag1 = 0,flag2;//flag1判断是否项已经产生miss错误;
  26. int e = 0;//错误个数
  27. int sy_num = 0;//四元式的个数
  28. string op,s1,ss1,s2,res,res1,res2,op2,op1;
  29. int op_num = 0,op_num1 = 0;//运算符的个数
  30. int sy_id;//四元式的序号
  31. string var[300];//已经声明的变量
  32. int var_num = 0;//声明变量的个数
  33. int sent_id;//判断if,while语句
  34. string equ[300];//=
  35. int a,b,c;
  36. int equ_num = 1; //=个数
  37. int cnt = 0,token_num = 0;//当前字符
  38. int row = 1;//当前行数
  39. char ch;
  40. char ch1;
  41. int word_num = 0;//单词的总个数
  42. int word_cnt = 0;
  43. string temp;
  44. char str_int[20];
  45. stack<string>word_stack;//保存
  46. stack<string>op_stack;
  47. //程序
  48. void S();
  49. void P();//(){分程序}
  50. void P1();//分程序
  51. void A();//变量说明部分
  52. void B();//语句部分
  53. void B1();
  54. int C();//变量说明
  55. void D();//标识符表
  56. void D1();
  57. void E();//标识符
  58. void F();//字母
  59. void G();//数字
  60. void H();//语句
  61. void I();//赋值语句
  62. void J();//条件语句
  63. void K();//循环语句
  64. int L();//关系运算符
  65. void M();//表达式
  66. void M1();
  67. void N();//项
  68. void N1();
  69. int O();//加法运算符
  70. int Q();//乘法运算符
  71. void R();//常量
  72. void S();//无符号整数
  73. void T();//数字序列
  74. void W();//复合语句
  75. void X();//条件
  76. void Y();//语句1
  77. void Z();//因子
  78. //构造四元式
  79. void siYuan(string op,string s1,string s2,string res)
  80. {
  81. sy[sy_num].op =op;
  82. sy[sy_num].s1=s1;
  83. sy[sy_num].s2=s2;
  84. sy[sy_num].res=res;
  85. sy_num++;
  86. }
  87. void printFour()//输出四元式
  88. {
  89. ofstream out("sy.txt");
  90. int i;
  91. for(i=0;i<sy_num;i++)
  92. {
  93. cout<<i<<":\t("<<sy[i].op<<",\t"<<sy[i].s1<<",\t"<<sy[i].s2<<",\t"<<sy[i].res<<")"<<endl;
  94. out<<i<<":\t("<<sy[i].op<<",\t"<<sy[i].s1<<",\t"<<sy[i].s2<<",\t"<<sy[i].res<<")"<<endl;
  95. }
  96. }
  97. void error(string err)//报错,定位到错误行
  98. {
  99. cout<<"第"<<w[word_cnt].line<<"行出错!\t";
  100. cout<<err<<"\n";
  101. e++;
  102. }
  103. //检查变量是否被声明
  104. void is_say(string a)
  105. {
  106. int i;
  107. for(i=1;i<=var_num;i++)
  108. {
  109. if(a.compare(var[i])==0)
  110. {
  111. break;
  112. }
  113. }
  114. if(i>var_num)
  115. {
  116. cout<<"第 "<<w[word_cnt].line<<" 行出错!\t";
  117. cout<<w[word_cnt].value<<" 没有被声明 !"<<endl;
  118. e++;
  119. }
  120. }
  121. void init_token(){
  122. int i;
  123. for(i = 0;i < 12;i++){
  124. token[i] = NULL;
  125. }
  126. }
  127. int judge_token(){
  128. init_token();
  129. if(flag == 0){
  130. ch = getc(fin);
  131. }
  132. flag = 1;
  133. while(ch == ' ' || ch == '\t' || ch == '\n'){
  134. if(ch == '\n'){
  135. row++;
  136. }
  137. ch=getc(fin);
  138. }
  139. token_num = 0;
  140. if((ch>='a' && ch <= 'z') || (ch >= 'A' &&ch <= 'Z')){
  141. //可能为标识符或者变量名
  142. while((ch>='a' && ch <= 'z') || (ch >= 'A' &&ch <= 'Z') || (ch >= '0' && ch <= '9')){
  143. token[token_num++] = ch;
  144. ch = getc(fin);
  145. }
  146. token[token_num++] = '\0';
  147. for(int i = 0;i <13;i++){
  148. if(strcmp(token,keyWord[i]) == 0){
  149. //3为关键词
  150. return 3;
  151. }
  152. }
  153. //2为标识符
  154. return 2;
  155. }
  156. //是数字
  157. else if(ch >= '0' && ch <= '9'){
  158. while((ch >= '0'&& ch <= '9') || ch == '.'){
  159. token[token_num++] = ch;
  160. ch = getc(fin);
  161. }
  162. return 1;
  163. }
  164. else{
  165. token[token_num++] = ch;
  166. switch(ch){
  167. case '(': ch = getc(fin); return 16;
  168. case ')': ch = getc(fin); return 17;
  169. case '{': ch = getc(fin); return 33;
  170. case '}': ch = getc(fin); return 34;
  171. case '+':
  172. ch = getc(fin);
  173. if(ch == '+'){
  174. token[token_num++] = ch;
  175. ch = getc(fin);
  176. return 29;
  177. }
  178. else{
  179. return 18;
  180. }
  181. case '-':
  182. ch = getc(fin);
  183. if(ch == '-'){
  184. token[token_num++] = ch;
  185. ch = getc(fin);
  186. return 30;
  187. }
  188. else{
  189. return 19;
  190. }
  191. case '*':
  192. ch = getc(fin);
  193. if(ch == '/'){
  194. token[token_num++] = ch;
  195. ch = getc(fin);
  196. return 32;
  197. }
  198. else{
  199. return 20;
  200. }
  201. case '/':
  202. ch = getc(fin);
  203. if(ch == '*'){
  204. token[token_num++] = ch;
  205. ch = getc(fin);
  206. return 31;
  207. }
  208. else{
  209. return 21;
  210. }
  211. //这里要重新编码
  212. case '=':
  213. ch = getc(fin);
  214. if(ch == '='){
  215. token[token_num++] = ch;
  216. ch = getc(fin);
  217. return 23;
  218. }
  219. else{
  220. return 22;
  221. }
  222. case '>':
  223. ch = getc(fin);
  224. if(ch == '='){
  225. token[token_num++] = ch;
  226. ch = getc(fin);
  227. return 24;
  228. }
  229. else{
  230. return 23;
  231. }
  232. case '<':
  233. ch = getc(fin);
  234. if(ch == '='){
  235. token[token_num++] = ch;
  236. ch = getc(fin);
  237. return 26;
  238. }
  239. else{
  240. return 25;
  241. }
  242. case ';': ch = getc(fin); return 27;
  243. case '"': ch = getc(fin); return 28;
  244. case '!':
  245. ch = getc(fin);
  246. if(ch == '='){
  247. token[token_num++] = ch;
  248. ch = getc(fin);
  249. return 37;
  250. }
  251. else{
  252. return 36;
  253. }
  254. case '#': ch = getc(fin); return -2;
  255. case ',': ch = getc(fin); return 35;
  256. case EOF: return -1;
  257. default: ch = getc(fin); return -10;
  258. }
  259. }
  260. }
  261. void getWord(){
  262. int temp;
  263. while(1){
  264. temp = judge_token();
  265. if(temp==-1){
  266. break;
  267. }
  268. switch(temp){
  269. case -10:
  270. //cout<<"第 "<<row<<" 行出现错误."<<endl;
  271. error("word has a mistake");
  272. w[word_num].type = -1;
  273. strcat(w[word_num].value," ");
  274. word_num++;
  275. break;
  276. case -1:
  277. return;
  278. default:
  279. w[word_num].type = temp;
  280. w[word_num].line = row;
  281. strcpy(w[word_num].value,token);
  282. word_num++;
  283. //cout<<"<"<<temp<<","<<token<<">"<<endl;
  284. break;
  285. }
  286. }
  287. }
  288. //程序
  289. void S(){
  290. if(strcmp("main",w[word_cnt].value)){
  291. error("miss main");
  292. word_cnt--;
  293. }
  294. word_cnt++;
  295. if(strcmp("(",w[word_cnt].value)){
  296. error("miss (");
  297. word_cnt--;
  298. }
  299. word_cnt++;
  300. if(strcmp(")",w[word_cnt].value)){
  301. error("miss )");
  302. word_cnt--;
  303. }
  304. word_cnt++;
  305. if(strcmp("{",w[word_cnt].value)){
  306. error("miss {");
  307. word_cnt--;
  308. }
  309. word_cnt++;
  310. P();
  311. if(strcmp("}",w[word_cnt].value)){
  312. error("miss }");
  313. word_cnt--;
  314. }
  315. op = "#";
  316. s1 = "";
  317. s2 = "";
  318. res = "";
  319. siYuan(op,s1,s2,res);
  320. cout<<"There are "<<e<<" mistakes in total."<<endl;
  321. }
  322. //分程序
  323. void P(){
  324. A();//变量说明部分
  325. if(strcmp(";",w[word_cnt].value)){
  326. error("miss ;");
  327. word_cnt--;
  328. }
  329. word_cnt++;
  330. B();//语句部分
  331. }
  332. //变量说明部分
  333. void A(){
  334. if(C()){
  335. var[++var_num] = w[word_cnt].value;
  336. D();
  337. }
  338. else{
  339. D();
  340. }
  341. }
  342. //变量说明
  343. int C(){
  344. if(strcmp(w[word_cnt].value,"int")){
  345. error("miss int");
  346. return 0;
  347. }
  348. word_cnt++;
  349. return 1;
  350. }
  351. //标识符表
  352. void D(){
  353. if(w[word_cnt].type != 2){
  354. error("denoter has a error");
  355. }
  356. word_cnt++;
  357. D1();
  358. }
  359. //子标识符表
  360. void D1(){
  361. if(strcmp(w[word_cnt].value,";") == 0){
  362. return;
  363. }
  364. if(strcmp(w[word_cnt].value,",")){
  365. error("miss ,");
  366. word_cnt--;
  367. }
  368. word_cnt++;
  369. var[++var_num] = w[word_cnt].value;
  370. if(w[word_cnt].type!=2){
  371. error("denoter has a error");
  372. }
  373. word_cnt++;
  374. D1();
  375. }
  376. //语句部分
  377. void B(){
  378. H();
  379. B1();
  380. }
  381. //子语句部分
  382. void B1(){
  383. if(strcmp(w[word_cnt].value,";") == 0){
  384. word_cnt++;
  385. H();
  386. B1();
  387. }
  388. else if(strcmp(w[word_cnt].value,"}") == 0){
  389. return;
  390. }
  391. else{
  392. error("miss ;");
  393. }
  394. }
  395. //语句
  396. void H(){
  397. cout<<"H()"<<endl;
  398. cout<<w[word_cnt].value<<endl;
  399. if(w[word_cnt].type == 2){
  400. op_num = 0;
  401. is_say(w[word_cnt].value);
  402. word_stack.push(w[word_cnt].value);
  403. word_cnt++;
  404. I();
  405. }
  406. else if(strcmp(w[word_cnt].value,"if") == 0){
  407. op_num = 0;
  408. J();
  409. }
  410. else if(strcmp(w[word_cnt].value,"while") == 0){
  411. op_num = 0;
  412. a = sy_num;
  413. K();
  414. op = "go";
  415. s1 = "";
  416. s2 = "";
  417. stringstream sss;//int 转 string
  418. sss<<a;
  419. sss>>res;
  420. siYuan(op,s1,s2,res);
  421. //修改while跳转的序号
  422. stringstream sss2;
  423. sss2<<sy_num;
  424. sss2>>sy[sent_id].res;
  425. }
  426. else{
  427. error("extra fuhao");
  428. }
  429. }
  430. //赋值语句
  431. void I(){
  432. if(strcmp(w[word_cnt].value,"=") == 0){
  433. word_cnt++;
  434. //word_stack.push(w[word_cnt].value);
  435. M();
  436. if(e > 0){
  437. return;
  438. }
  439. if(op_stack.size() > 0){
  440. op = op_stack.top();
  441. op_stack.pop();
  442. s2 = word_stack.top();
  443. word_stack.pop();
  444. s1 = word_stack.top();
  445. word_stack.pop();
  446. res = word_stack.top();
  447. word_stack.pop();
  448. siYuan(op,s1,s2,res);
  449. }
  450. else{
  451. s1 = word_stack.top();
  452. word_stack.pop();
  453. res = word_stack.top();
  454. word_stack.pop();
  455. siYuan("=",s1,"",res);
  456. }
  457. }
  458. else{
  459. error("miss = ");
  460. word_cnt--;
  461. }
  462. }
  463. //if语句
  464. void J(){
  465. cout<<"J()"<<endl;
  466. if(strcmp(w[word_cnt].value,"if")){
  467. error("miss if");
  468. word_cnt--;
  469. }
  470. word_cnt++;
  471. if(strcmp(w[word_cnt].value,"(")){
  472. error("miss (");
  473. word_cnt--;
  474. }
  475. word_cnt++;
  476. //word_stack.push(w[word_cnt].value);
  477. X();//条件
  478. sent_id = sy_num;
  479. if(op_stack.size() > 0 && e == 0){
  480. op = op_stack.top();
  481. op_stack.pop();
  482. s2 = word_stack.top();
  483. word_stack.pop();
  484. s1 = word_stack.top();
  485. word_stack.pop();
  486. siYuan(op,s1,s2,res);
  487. }
  488. if(strcmp(w[word_cnt].value,")")){
  489. error("miss )");
  490. word_cnt--;
  491. }
  492. word_cnt++;
  493. //四元式置为空
  494. op = "";
  495. s1 = "";
  496. s2 = "";
  497. res = "";
  498. Y();//语句1
  499. stringstream ss;
  500. ss<<sy_num+1;
  501. ss>>sy[sent_id].res;
  502. sent_id = sy_num;
  503. op = "go";
  504. s1 = "";
  505. s2 = "";
  506. res = "";
  507. siYuan(op,s1,s2,res);
  508. if(strcmp(w[word_cnt].value,"else")){
  509. error("miss else");
  510. word_cnt--;
  511. }
  512. word_cnt++;
  513. Y();
  514. stringstream ss2;
  515. ss2<<sy_num;
  516. ss2>>sy[sent_id].res;
  517. }
  518. //while语句
  519. void K(){
  520. cout<<"K()"<<endl;
  521. if(strcmp(w[word_cnt].value,"while")){
  522. error("miss while");
  523. word_cnt--;
  524. }
  525. word_cnt++;
  526. if(strcmp(w[word_cnt].value,"(")){
  527. error("miss (");
  528. word_cnt--;
  529. }
  530. word_cnt++;
  531. //word_stack.push(w[word_cnt].value);
  532. X();
  533. sent_id = sy_num;
  534. if(op_stack.size()>0 && e == 0){
  535. op = op_stack.top();
  536. op_stack.pop();
  537. s2 = word_stack.top();
  538. word_stack.pop();
  539. s1 = word_stack.top();
  540. word_stack.pop();
  541. siYuan(op,s1,s2,res);
  542. }
  543. //cout<<w[word_cnt].value<<endl;
  544. if(strcmp(w[word_cnt].value,")")){
  545. error("miss )");
  546. word_cnt--;
  547. }
  548. word_cnt++;
  549. if(strcmp(w[word_cnt].value,"do")){
  550. error("miss do");
  551. word_cnt--;
  552. }
  553. word_cnt++;
  554. Y();
  555. }
  556. void X(){
  557. cout<<"X()"<<endl;
  558. M();
  559. if(op_stack.size() > 0 && e == 0){
  560. op = op_stack.top();
  561. op_stack.pop();
  562. s2 = word_stack.top();
  563. word_stack.pop();
  564. s1 = word_stack.top();
  565. word_stack.pop();
  566. stringstream ss;
  567. ss << op_num;
  568. res = "t"+ss.str();
  569. word_stack.push(res);
  570. siYuan(op,s1,s2,res);
  571. }
  572. if(strcmp(w[word_cnt].value,">") == 0){
  573. op = "<=";
  574. }
  575. else if(strcmp(w[word_cnt].value,">=") == 0){
  576. op = "<";
  577. }
  578. else if(strcmp(w[word_cnt].value,"<") == 0){
  579. op = ">=";
  580. }
  581. else if(strcmp(w[word_cnt].value,"<=") == 0){
  582. op = ">";
  583. }
  584. else if(strcmp(w[word_cnt].value,"==") == 0){
  585. op = "!=";
  586. }
  587. else if(strcmp(w[word_cnt].value,"!=") == 0){
  588. op = "==";
  589. }
  590. //cout<<w.value<<" "<<w.type<<endl;
  591. if(!L()){
  592. error("miss relation operator");
  593. word_cnt--;
  594. }
  595. op_stack.push(op);
  596. word_cnt++;
  597. //word_stack.push(w[word_cnt].value);
  598. //sent_id = sy_num;
  599. M();
  600. }
  601. //表达式
  602. void M(){
  603. cout<<"M()"<<endl;
  604. N();
  605. M1();
  606. }
  607. //子表达式
  608. void M1(){
  609. cout<<"M1()"<<endl;
  610. cout<<w[word_cnt].value<<endl;
  611. if(strcmp(w[word_cnt].value,";") == 0 || strcmp(w[word_cnt].value,")") == 0
  612. || L() || strcmp(w[word_cnt].value,"}") == 0 || strcmp(w[word_cnt].value,"else") == 0){
  613. return;
  614. }
  615. else if(!O()){
  616. error("miss + or -");
  617. //word_cnt--;
  618. }
  619. else{
  620. op_stack.push(w[word_cnt].value);
  621. word_cnt++;
  622. //word_stack.push(w[word_cnt].value);
  623. op_num++;
  624. //getWord();
  625. //strcpy(b[b_num++].bds,new_w.value);
  626. N();
  627. M1();
  628. if(op_stack.size() > 1 && e == 0){
  629. op = op_stack.top();
  630. op_stack.pop();
  631. s2 = word_stack.top();
  632. word_stack.pop();
  633. s1 = word_stack.top();
  634. word_stack.pop();
  635. stringstream ss;
  636. ss << op_num;
  637. res = "t"+ss.str();
  638. word_stack.push(res);
  639. siYuan(op,s1,s2,res);
  640. }
  641. }
  642. }
  643. //项 ,消除左递归
  644. void N(){
  645. cout<<"N()"<<endl;
  646. Z();
  647. N1();
  648. }
  649. void N1(){
  650. cout<<"N1()"<<endl;
  651. cout<<w[word_cnt].value<<endl;
  652. //后根符号集,关系运算符 ; )
  653. if(strcmp(w[word_cnt].value,";") == 0 || strcmp(w[word_cnt].value,")") == 0
  654. || strcmp(w[word_cnt].value,"}") == 0 || strcmp(w[word_cnt].value,"else") == 0 || L() || O()){
  655. return;
  656. }
  657. else if(!Q()){
  658. error("miss * or /");
  659. //分号出错转到语句
  660. //word_cnt--;
  661. }
  662. //word_cnt++;
  663. else{
  664. op_num++;
  665. op_stack.push(w[word_cnt].value);
  666. word_cnt++;
  667. //word_stack.push(w[word_cnt].value);
  668. Z();
  669. N1();
  670. if(op_stack.size() > 1 && e == 0){
  671. op = op_stack.top();
  672. op_stack.pop();
  673. s2 = word_stack.top();
  674. word_stack.pop();
  675. s1 = word_stack.top();
  676. word_stack.pop();
  677. stringstream ss;
  678. ss << op_num;
  679. res = "t"+ss.str();
  680. word_stack.push(res);
  681. siYuan(op,s1,s2,res);
  682. }
  683. }
  684. }
  685. //因子
  686. void Z(){
  687. //cout<<w.value<<" "<<w.type<<endl;
  688. //非数字或标识符
  689. cout<<"Z()"<<endl;
  690. if(w[word_cnt].type!=1 && w[word_cnt].type!=2 &&strcmp(w[word_cnt].value,"(")){
  691. error("expression has a error");
  692. return;
  693. }
  694. //标识符
  695. if(w[word_cnt].type == 1||w[word_cnt].type == 2){
  696. if(w[word_cnt].type == 2){
  697. is_say(w[word_cnt].value);
  698. }
  699. word_stack.push(w[word_cnt].value);
  700. word_cnt++;
  701. //equ[equ_num++] = w.value;
  702. return;
  703. }
  704. else if(strcmp(w[word_cnt].value,"(") == 0){
  705. word_cnt++;
  706. //word_stack.push(w[word_cnt].value);
  707. M();
  708. if(e == 0){
  709. op = op_stack.top();
  710. op_stack.pop();
  711. s2 = word_stack.top();
  712. word_stack.pop();
  713. s1 = word_stack.top();
  714. word_stack.pop();
  715. stringstream ss;
  716. ss << op_num;
  717. res = "t"+ss.str();
  718. word_stack.push(res);
  719. siYuan(op,s1,s2,res);
  720. }
  721. if(strcmp(w[word_cnt].value,")") == 0){
  722. word_cnt++;
  723. return;
  724. }
  725. else{
  726. error("miss )");
  727. }
  728. }
  729. return;
  730. }
  731. //语句1
  732. void Y(){
  733. cout<<"Y()"<<endl;
  734. if(strcmp(w[word_cnt].value,"{") == 0){
  735. word_cnt++;
  736. B();
  737. //cout<<w.value<<endl;
  738. if(strcmp(w[word_cnt].value,"}")){
  739. error("miss }");
  740. }
  741. word_cnt++;
  742. return;
  743. }
  744. else{
  745. H();//语句
  746. return;
  747. }
  748. }
  749. //关系运算符
  750. int L(){
  751. if(((w[word_cnt].type > 22 && w[word_cnt].type <= 26) || w[word_cnt].type == 37)){
  752. return 1;
  753. }
  754. return 0;
  755. }
  756. //加法运算符
  757. int O(){
  758. if(w[word_cnt].type == 18 || w[word_cnt].type == 19){
  759. return 1;
  760. }
  761. return 0;
  762. }
  763. //乘法运算符
  764. int Q(){
  765. if(w[word_cnt].type == 20 || w[word_cnt].type == 21){
  766. return 1;
  767. }
  768. return 0;
  769. }
  770. int main(){
  771. fin = fopen("compiler.txt","r");
  772. getWord();
  773. S();
  774. if(e==0)
  775. {
  776. printFour();
  777. }
  778. else
  779. {
  780. cout<<"\nSorry,can not generate siYuan."<<endl;
  781. }
  782. return 0;
  783. }
  784. /*
  785. */

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/103976954

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。