24h購物| | PChome| 登入
2013-04-14 19:24:23| 人氣1,265| 回應0 | 上一篇 | 下一篇

[編譯器][作業] Run DFA

推薦 0 收藏 0 轉貼0 訂閱站台

[程式作業二]  滿分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 訊息,第一行為字母集,接著為每個狀態的轉換。
與上一篇編譯器作業一輸出雷同

接著在螢幕中鍵入一個字串,詢問可不可以被接受。
而我沒上那門課,也沒旁聽,因此格式是不是這樣值得思考。

#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;
}
 

台長: Morris
人氣(1,265) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: 其他題目 |
此分類下一篇:[計算機組織] 期中考古題
此分類上一篇:[編譯器][作業][2014Update] NFA to DFA

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文