2013-04-14 19:24:23Morris
[編譯器][作業] Run DFA
[程式作業二] 滿分100分
Input: a file named DFA and
Output:vaild or error
input範例檔1:DFA1.txt
(a,b)
(1,2)(*3,4,5)(0)
(*3,4,5)(*5)(*4,5)
(*4,5)(*5)(*5)
(*5)(0)(0)
輸入之token:abaab
輸出:error
----------------
Input範例檔2:DFA2.txt
(a,b)
(1,2,3)(*1,2,3,4)(*2,3,4)
(*2,3,4)(*1,2,3,4)(*2,3,4)
(*1,2,3,4)(*1,2,3,4)(*2,3,4)
輸入之token:abaab
輸出:vaild
分數計算:
完成測試檔1
完成測試檔2
完成隱藏測試檔
才能得分 否則一律0分計算
程式繳交期限 4/19 午夜12點
遲交一律0分
"抄襲者"與"被抄襲者"以0分計算
題目說明:
從檔案中讀入 DFA 訊息,然後給定一個字串S,問能不能被 DFA 所接受。
格式說明:
檔案中的 DFA 訊息,第一行為字母集,接著為每個狀態的轉換。
與上一篇編譯器作業一輸出雷同
接著在螢幕中鍵入一個字串,詢問可不可以被接受。
Input: a file named DFA and
Output:vaild or error
input範例檔1:DFA1.txt
(a,b)
(1,2)(*3,4,5)(0)
(*3,4,5)(*5)(*4,5)
(*4,5)(*5)(*5)
(*5)(0)(0)
輸入之token:abaab
輸出:error
----------------
Input範例檔2:DFA2.txt
(a,b)
(1,2,3)(*1,2,3,4)(*2,3,4)
(*2,3,4)(*1,2,3,4)(*2,3,4)
(*1,2,3,4)(*1,2,3,4)(*2,3,4)
輸入之token:abaab
輸出:vaild
分數計算:
完成測試檔1
完成測試檔2
完成隱藏測試檔
才能得分 否則一律0分計算
程式繳交期限 4/19 午夜12點
遲交一律0分
"抄襲者"與"被抄襲者"以0分計算
題目說明:
從檔案中讀入 DFA 訊息,然後給定一個字串S,問能不能被 DFA 所接受。
格式說明:
檔案中的 DFA 訊息,第一行為字母集,接著為每個狀態的轉換。
與上一篇編譯器作業一輸出雷同
接著在螢幕中鍵入一個字串,詢問可不可以被接受。
而我沒上那門課,也沒旁聽,因此格式是不是這樣值得思考。
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <cstring>
#include <algorithm> //std::find
using namespace std;
int main() {
fstream fin("DFA1.txt");
string buf;
vector<char> sigma;
map<string, int> str2num;
//<sigma>
getline(fin, buf);
for(int i = 1; i < buf.length(); i += 2)
sigma.push_back(buf[i]);
//</sigma>
//<read table>
int table[1000][sigma.size()], tsize = 0;
int acceptTable[1000] = {};
memset(table, 0, sizeof(table));
while(getline(fin, buf)) {
string left, right;
int pos = buf.find(")"), prev;
left = buf.substr(0, pos+1);
prev = pos;
int &x = str2num[left];
if(x == 0) x = ++tsize;
if(left[1] == '*') acceptTable[x] = 1;
for(int i = 0; i < sigma.size(); i++) {
pos = buf.find(")", prev+1);
right = buf.substr(prev+1, pos-prev);
prev = pos;
int &y = str2num[right];
if(y == 0) y = ++tsize;
table[x][i] = y;
if(right[1] == '*') acceptTable[y] = 1;
}
}
//</read table>
fin.close();
cout << "¿é¤J¤§token:";
cin >> buf;
int error = 0, nowState = 1, nextState;
for(int i = 0; i < buf.length(); i++) {
int sigmaIdx = find(sigma.begin(), sigma.end(), buf[i])-sigma.begin();
if(sigmaIdx >= sigma.size()) {//not found char
error = 1;
break;
}
nextState = table[nowState][sigmaIdx];
if(nextState == 0) {//no state translate
error = 1;
break;
}
nowState = nextState;
}
cout << "¿é¥X:";
if(error) {
puts("error");
} else {
error = !acceptTable[nowState];
if(error)
puts("error");
else
puts("vaild");
}
return 0;
}