目標任務
實現 ll(1)分析中控制程式(表驅動程式);完成以下描述算術表示式的 ll(1)文法的 ll(1)分析程式。
g[e]: e→te'
e'→ate' |ε
t→ft'
t'→mft' |ε
f→ (e)|i
a→+|-
m→*|/
說明:終結符號 i 為使用者定義的簡單變數,即識別符號的定義。
// compiler3.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include #include using namespace std;
string ll1_table[7][8];
char vn[7] = ; //非終結符,e'轉化為x,t'轉化為y
char vt[8] = ; //終結符
int find_vn(char s) //查詢非終結符
return -1;
}int find_vt(char c) //查詢終結符
} return -1;
}void zaobiao()
ll1_table[0][0] = "e→tx";
ll1_table[0][5] = "e→tx";
ll1_table[1][1] = "x→atx";
ll1_table[1][2] = "x→atx";
ll1_table[1][6] = "e→";
ll1_table[1][7] = "e→";
ll1_table[2][0] = "t→fy";
ll1_table[2][5] = "t→fy";
ll1_table[3][1] = "y→";
ll1_table[3][2] = "y→";
ll1_table[3][3] = "y→mfy";
ll1_table[3][4] = "y→mfy";
ll1_table[3][6] = "y→";
ll1_table[3][7] = "y→";
ll1_table[4][0] = "f→i";
ll1_table[4][5] = "f→(e)";
ll1_table[5][1] = "a→+";
ll1_table[5][2] = "a→-";
ll1_table[6][3] = "m→*";
ll1_table[6][4] = "m→/";}/*
測試用例1:
12, i
21, +
12, c
32, /
12, i
*//*
測試用例2:
28, (
12, i
22, -
12, i
29, )
23, *
28, (
12, i
21, +
12, i
29, )
*/int main()
input[num] = read[i + 2];
num++;
} input[num] = '#';
input[num + 1] = '\0';
printf("\n表示式為:%s\n", input);
// cin >> input; //輸入需要匹配的表示式
stacka;
a.push('#');
a.push('e');
zaobiao();
/* for (int i = 0; i < 7; i++) 輸出ll(1)表
cout << endl;
}*/int tag = 0;
while (!empty(a))
cout << endl;
}else
}else //終結符號
else
}} cout << "成功匹配!"
}
CSUFT 編譯原理實驗二LL(1)文法分析
1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 10using namespace std 1112 char a 20 分析棧 13char b 20 剩餘串 14char v1 2...
編譯原理之證明LL 1 文法
ll 1 文法的證明方法 乙個文法g是ll 1 的,當且僅當g的任意兩個不同的產生式a 滿足下面的條件 1.不存在終結符號a使得 和 都能夠推導出以a開頭的串。2.和 中最多只有乙個可以推導出空串。3.如果 那麼 不能推導出任何以follow a 中某個終結符號開頭的串。類似的,如果 那麼 不能推導...
LL 1 文法判斷
ll 1 文法判斷 題型 1.判斷該文法是否是ll 1 文法?2.若是,給出它的ll 1 分析表,否則說明理由。概念 對於產生式 a 1.如果 均不能推導出 空語句 則 first first 2.和 至多有乙個能推導出 3.如果 經過0步或多步可以推導出 則 first follow a 關鍵 求...