zoukankan      html  css  js  c++  java
  • 编译原理语法分析程序(最左推导)

    文法G2的最左推导和最右推导

    G2

    E->E+T | E-T | T

    T->T*F | T/F | F

    F->(E) | n

    G2的终结符集合VT

    +,-,*,/,(,),

    G2的非终结符集合VN

    E,T,F,n

    句子3+2*4最左推导

    E

     

     

     

    E

    +

    T

     

     

    F

    +

    T

     

     

    N

    +

    T

     

     

    N

    +

    T

    *

    F

    N

    +

    F

    *

    F

    N

    +

    N

    *

    F

    N

    +

    N

    *

    N

    句子3+2*4最右推导:

    E

     

     

     

    E

    +

    T

     

     

    E

    +

    T

    *

    F

    E

    +

    T

    *

    N

    E

    +

    F

    *

    N

    E

    +

    N

    *

    N

    F

    +

    N

    *

    N

    N

    +

    N

    *

    N

    语法树:

     代码实现:

     本人笔记的课程作业程序,不要抄袭
    1
    #include <iostream> 2 #include<string> 3 4 using namespace std; 5 string expr; 6 int step; 7 void analyze(int left,int right,char start); 8 9 int main() 10 { 11 cout << "please input a correct expression "; 12 getline(cin,expr); 13 analyze(0,expr.size(),'E'); 14 return 0; 15 } 16 void analyze(int left,int right,char start) 17 { 18 switch(start){ 19 case 'E':{ 20 int bracnt = 0; 21 bool binope = false; // flag of + or - 22 for(int i=right-1;i>=left;--i){ 23 if(expr[i] == '(')bracnt++; 24 if(expr[i] == ')')bracnt--; 25 if(!bracnt){ 26 if(expr[i]=='+' || expr[i]=='-'){ 27 binope = true; 28 cout << "step " << step << " : "; 29 cout << start << "->" << start << expr[i] << 'T' << endl; 30 step++; 31 analyze(left,i,'E'); 32 analyze(i+1,right,'T'); 33 break; 34 } 35 } 36 } 37 if(!binope){ 38 cout << "step " << step << " : "; 39 cout << start << "->" << 'T' << endl; 40 step++; 41 analyze(left,right,'T'); 42 } 43 break; 44 } 45 case 'T':{ 46 int bracnt = 0; 47 bool binope = false; // flag of * or / 48 for(int i=right-1;i>=left;--i){ 49 if(expr[i] == '(')bracnt++; 50 if(expr[i] == ')')bracnt--; 51 if(!bracnt){ 52 if(expr[i]=='*' || expr[i]=='/'){ 53 binope = true; 54 cout << "step " << step << " : "; 55 cout << start << "->" << start << expr[i] << 'F' << endl; 56 step++; 57 analyze(left,i,'T'); 58 analyze(i+1,right,'F'); 59 break; 60 } 61 } 62 } 63 if(!binope){ 64 cout << "step " << step << " : "; 65 cout << start << "->" << 'F' << endl; 66 step++; 67 analyze(left,right,'F'); 68 } 69 break; 70 } 71 case 'F':{ 72 if(expr[left] == '('){ 73 cout << "step " << step << " : "; 74 cout << start << "->" << "(E)" << endl; 75 step++; 76 analyze(left+1,right,'E'); 77 } 78 else{ 79 cout << "step " << step << " : "; 80 cout << start << "->" << "n" << endl; 81 step++; 82 } 83 break; 84 } 85 default:break; 86 } 87 }
  • 相关阅读:
    Spring配置数据源
    记创业
    RSA 加解密转换
    log4net使用
    dom对象
    number对象,bom对象
    math对象和date对象
    js 数组对象,数组的使用
    wamp环境下外网访问自己电脑自己写的网站
    (线性结构)循环链表的初始化,增删减除结点。新手的了解
  • 原文地址:https://www.cnblogs.com/CreatorKou/p/8613304.html
Copyright © 2011-2022 走看看