約 2,701,194 件
https://w.atwiki.jp/m_shige1979/pages/1446.html
GET、POSTリクエストパラメータの取得 概要 GETパラメータはurlのqueryより取得し、POSTパラメータはrequest.addListenerを用意して取得する しかし、"["などのものは変換されてくるので別の方法で取得する方がよい。 サンプル index.js // サーバ、ルーティング、リクエストメソッドのモジュールを読み込み var server = require("./server"); var router = require("./router"); var request = require("./request"); var requestHandlers = require("./requestHandlers"); // リクエストのハンドラを設定 var handle = {} handle["/"] = requestHandlers.start; handle["/start"] = requestHandlers.start; handle["/upload"] = requestHandlers.upload; // ハンドラパラメータを追加 server.start(router.route, handle, request); server.js var http = require("http"); var url = require("url"); var util = require( util ); function start(route, handle, param) { function onRequest(request, response) { var pathname = url.parse(request.url).pathname; var query = url.parse(request.url).query; // GETリクエストを取得 var _p = ""; if (query != undefined) { _p = query + " "; } // POSTリクエスト取得 request.setEncoding("utf8"); request.addListener("data", function(postDataChunk) { _p += postDataChunk; console.log("Received POST data chunk " + postDataChunk + " ."); }); request.addListener("end", function() { // リクエストパラメータ取得 var _req_data = param.req_data(_p); console.log("Request for " + pathname + " received."); console.log("Request for RequestString = " + _p + " received."); console.log(util.inspect(_req_data, false, null)); console.log(""); // ルーティング route(handle, pathname, response, _req_data); }); } http.createServer(onRequest).listen(8888); console.log("Server has started."); } exports.start = start; router.js function route(handle, pathname, response, _req_data) { console.log("About to route a request for " + pathname); if (typeof handle[pathname] === function ) { handle[pathname](response, _req_data); } else { console.log("No request handler found for " + pathname); response.writeHead(404, {"Content-Type" "text/plain"}); response.write("404 Not found"); response.end(); } } exports.route = route; requestHandlers.js var exec = require("child_process").exec; function start(response, _req_data) { console.log("Request handler start was called."); var body = html + head + meta http-equiv="Content-Type" content="text/html; + charset=UTF-8" / + /head + body + form action="/upload?zzz=111 xxx=666" method="post" + input type="text" name="text1" / + input type="text" name="text2" / + input type="text" name="text3[aaa]" / + input type="text" name="text3[bbb]" / + input type="checkbox" name="text4" checked/ + input type="submit" value="Submit text" / + /form + /body + /html ; response.writeHead(200, {"Content-Type" "text/html"}); response.write(body); response.end(); } function upload(response, _req_data) { console.log("Request handler upload was called."); response.writeHead(200, {"Content-Type" "text/plain"}); response.write("Hello Upload"); response.write("aaa=" + _req_data[ text1 ]); response.end(); } exports.start = start; exports.upload = upload; request.js function req_data(queryString) { var _param = {}; // リクエストを取得 var _list = (new String(queryString)).split( ); for(var _key in _list){ var _col = _list[_key].split("="); _param[_col[0]] = _col[1]; } return _param; } exports.req_data = req_data; 結果 コマンド D \Tools\Works\nodejs_test\sample09 node index.js Server has started. Request for /start received. Request for RequestString = aaa=111 b=444 received. { aaa 111 , b 444 , undefined } About to route a request for /start Request handler start was called. Request for /favicon.ico received. Request for RequestString = received. { undefined } About to route a request for /favicon.ico No request handler found for /favicon.ico Received POST data chunk text1=111 text2=222 text3%5Baaa%5D=333 text3%5Bbbb%5D=444 text4=on . Request for /upload received. Request for RequestString = zzz=111 xxx=666 text1=111 text2=222 text3%5Baaa%5D=333 text3%5Bbbb%5D=444 text4=on received. { zzz 111 , xxx 666 , text1 111 , text2 222 , text3%5Baaa%5D 333 , text3%5Bbbb%5D 444 , text4 on } About to route a request for /upload Request handler upload was called. Request for /favicon.ico received. Request for RequestString = received. { undefined } About to route a request for /favicon.ico No request handler found for /favicon.ico 画面 GETパラメータを指定して表示 POSTデータを設定 一部のPOSTデータを画面に表示
https://w.atwiki.jp/modelbase/pages/19.html
更新日2011-09-03[ Alloy Analyzer ] / [ 抽象によるソフトウェア設計/付録 A 練習問題 解答例 ] sig Node {adjs set Node} pred acyclic () { adjs = ~adjs -- 非反射的 no iden adjs -- 全域的 Node in adjs.Node } run acyclic for 4
https://w.atwiki.jp/commusoccerfb/pages/417.html
ONODERA FC 小野寺FC 所属リーグ:神奈川県社会人サッカーリーグ2部Aブロック(8部相当) ホームタウン:神奈川県/横浜市 公式サイト 公式YouTube 公式Twitter 公式Instagram 公式Facebook
https://w.atwiki.jp/bayashidayo/pages/16.html
The basic wireless model in ns この無線モデルは本質的にはMNを中心に成り立ち、その上さらなる特徴として、 マルチホップAd-hocネットワークや無線ネットワークなどのシミュレーションを 許す。MNもオブジェクトは分割オブジェクトです。C++の MobileNode../ns-2/mobilenode.hはNode../ns-2/node.hに由来する。 Nodeの詳 細はチャプター5を参照。したがってMNは与えられたトポロジー内を動く能力、 無線チャンネルから信号を受信し送信する能力のような、無線とMNの機能を付加 した標準的な Nodeオブジェクトです。もっとも、これらの間のメジャーな違い は、 MNは他のnodeかmobilenodeにLinksする手段によって接続されないことです。 このセクションでは、MNの内部の、ルーティングメカニズム、AODV,DSDV,TORAや DSRのルーティングプロトコル、MNにおいてチャネルアクセスを許可するネット ワークスタックの作成、それぞれのスタック構成の簡単な記述、トレースのサポ ートと、無線シミュレーションの移動/トラフィックシナリオの作成を説明する でしょう。 16.1.1Mobilenode creating wireless topology? 16.1.2Creating Node movements? 16.1.3Network Components in a mobilenode? 16.1.4Different MAC layer protocols for mobile networking? 16.1.5Different types of Routing Agents in mobile networking? 16.1.6Trace Support? 16.1.7Revised format for wireless traces?16.1.7.1Explanation of new trace format? 16.1.8Generation of node-movement and traffic-connection for wireless scenarios?16.1.8.1MobileNode Movement? 16.1.8.2Generating traffic pattern files?
https://w.atwiki.jp/monozukiclub/pages/668.html
ONODERA FC 小野寺FC 公式ホームページ 所属リーグ:神奈川県社会人サッカーリーグ2部Bブロック(8部相当) 法人名:(株)LEOC 代表者:小野寺裕司 創立年:1983年 活動区域/ホームタウン:神奈川県/横浜市 クラブカラー:緑/紺 ホームスタジアム:三ツ沢公園球技場(15,454人) 練習グラウンド:LEOCトレーニングセンター アカデミー(育成): クラブマスコット:- ユニフォームサプライヤー:Soccer Junky 監督:佐藤一樹 公式SNS Tweets by leocfc2019
https://w.atwiki.jp/amazonapp/pages/127.html
NodeBeat この商品はAmazon商品紹介機能をご利用いただけません。 期間 2015/4/7 コメント 名前
https://w.atwiki.jp/remixmatome/pages/263.html
メンバー登録 2010/12/26 作風・スタイル:音声、映像共にクオリティが高い。 またdinoderp氏自身の素材もアップしており、よくYTPMV素材として多く使われている。 ニコニコへの動画転載:あり(http //www.nicovideo.jp/watch/sm19420036など) 主な作品
https://w.atwiki.jp/todo314/pages/145.html
Scalable Similarity Estimation in Social Networks Closeness, Node Labels, and Random Edge Lengths Edith Cohen, Daniel Delling, Fabian Fuchs, Andrew V. Goldberg, Moises Goldszmidt, Renato F. Werneck COSN 2013 背景 直径が小さいグラフで最短路を求める意味はあるのか? そこを考えよう! 概要 最短路ベースの頂点間関連性 RWR, SimRank, Resistance dsitance, … この論文 色々提案して、その計算、既存の関連性との比較 神か ADS π_vu Dijkstra rank vにとってuは何番目に近い? $$ \Phi_{ u}(v) $$ vにとってuより近い頂点の集合 N_d(v) vから距離d以下の頂点集合 All-Distance Sketch (ADS) $$ \mbox{ADS}(v) = \{ (u, d_{uv}) | r(u) k_r^{\mbox{th}}(\Phi_{ u}(v)) \} $$ rで頂点に[0,1]の乱数を割当 $$ k_r^{\mbox{th}} $$ rで並べてk番目に小さいやつ ADS(v)って何? vを決めて 距離が小さい順に見ていく 今のところのk番目よりr値が小さかったら集合につっこむ 大体近いのだけど、遠いのも入れておく サイズの期待値 O(klog n) 計算 O(|E|klog n) あとは2-hop boundを出せてるよ! 実際は距離小さいので微妙… Closeness similarity 距離を使って関連性を作りたい!! 一個目S_{α,β} d(u,i)とd(v,i)のmaxの合計みたいな感じ 二個目J_{α,β} max{d(u,i), d(v,i)}/min{d(u,i), d(v,i)}の合計みたいな感じ α、βはある性質を満たす関数 距離は実際の距離とDijkstra rankの2パターン この使い分けも議論(神か いくつかの指標の一般化に対応している ADSで推定する これも保証有り Randomized edge length REL distance 辺の重みを指数分布で設定 距離の期待値 = REL 実際にはMoonte-Carlo法 関連性をちゃんと反映されている ロバスト性が測れるから ADSを適用 実験 データセット ちょっと大きめ ラベルサイズ小さなあ ground truth 内容による類似性 TF-IDFとか… Query Distributionを考えよう! Uniform Hops 各距離を一様に Semantic 類似性の大きさが一様に 比較手法 Adamic-Adar, hops, distance, RWR ADSは爆速な割には、他のに追随している COSN shortest distance similarity 2013-12-12 17 28 41 (Thu)
https://w.atwiki.jp/nodejs-kai/pages/17.html
【重要】IISへの通信方法の設定 vario=require( socket.io ).listen(app); io.configure(function(){ io.set( transports , [ xhr-polling ]); io.set( polling duration ,100); }); 上記のconfigureが必要iisNodeが直接のWebSocket対応していないため。 【設定】描画エンジンの切り替え app.configure(function(){ ( views ,+ /views );app.set( view engine , jade );(());(());();((+ /public →NG WebMatrix上でejs形式で作成する際には下記手順を踏む ①node_modules配下の.bin,expressフォルダを別ディレクトリに移送 ②cmd上でカレントディレクトリを移送した.binに移動した後下記コマンド実行(firstappプロジェクト作成の場合) express -t ejs firstapp //expressでejs形式でひな形生成 cd firstapp npm install -d //firstappにnpmをインストールする。 ③.bin配下に作成されたfirstappディレクトリを適当なディレクトリに移送後、WebMatrixでサイトを開く>サイトとしてのフォルダーで開く 【設定】ejsのコメントアウト % /* コメント */ % MongoLabのDBへの接続 cd mongo.exeの存在するディレクトリ(環境変数設定しろ。) mongo.exe ds045087.mongolab.com 45087/chatdb -u Admin -p <パス>
https://w.atwiki.jp/sodex/pages/13.html
正規表現 R|S RS R* R+ のパーサ regex.h #ifndef _REGEX_INCLUDE_CHECK #define _REGEX_INCLUDE_CHECK #include iostream using namespace std; #define eleft e.child.left #define eright e.child.right #define ech e.ch enum op_t { e_union, e_concat, e_closure, e_pclosure, e_empty, e_char }; struct Leaf { op_t op; /* * if op == "char", then the param of this union is character * else , then the param of this union is the struct that represents * a left tree and a right tree. */ union Entity { char ch; struct { Leaf *left; Leaf *right; } child; } e; }; class Stree { char current; char *inspectedStr, *baseStr; Leaf *root; void perror(const char * ptr); char getNextCurrent(); char getBackCurrent(); void setNextCurrent(); Leaf* growTree(Leaf* left, Leaf* right, op_t op); Leaf* regexp(); Leaf* regItr1(); Leaf* regItr2(); Leaf* regItr3(); void showItem(Leaf *leaf, int count); public Stree(char *setch) { inspectedStr = setch; baseStr = setch; current = *(inspectedStr); root = regexp(); } Leaf* getRoot() { return root; } void showAll(); }; #endif Regex.cpp #include "regex.h" inline char Stree getNextCurrent() { return *(inspectedStr+1); } inline char Stree getBackCurrent() { if (baseStr (inspectedStr-1)) return \0 ; return *(inspectedStr-1); } inline void Stree setNextCurrent() { current = *(++inspectedStr); } /* * This function is mainly dealing with "union". */ Leaf* Stree regexp() { Leaf *xLeaf, *yLeaf; xLeaf = regItr1(); if (current == | ) { setNextCurrent(); yLeaf = regexp(); xLeaf = growTree(xLeaf, yLeaf, e_union); } return xLeaf; } /* * This function is mainly dealing with "concat". */ Leaf* Stree regItr1() { Leaf *xLeaf, *yLeaf; xLeaf = regItr2(); if (xLeaf == NULL) return NULL; if (current != \0 current != | current != ) ) { yLeaf = regItr1(); xLeaf = growTree(xLeaf, yLeaf, e_concat); } return xLeaf; } Leaf* Stree regItr2() { Leaf *xLeaf; xLeaf = regItr3(); if (xLeaf == NULL) return NULL; if (current == * ) { xLeaf = growTree(xLeaf, NULL, e_closure); setNextCurrent(); } else if (current == + ) { xLeaf = growTree(xLeaf, NULL, e_pclosure); setNextCurrent(); } return xLeaf; } Leaf* Stree regItr3() { Leaf *xLeaf = new Leaf(); xLeaf- eleft = NULL; xLeaf- eright = NULL; if (current == ( ) { setNextCurrent(); xLeaf = regexp(); if (current != ) ) perror("parse error"); else setNextCurrent(); } else if (isalpha(current)) { xLeaf- op = e_char; xLeaf- ech = current; setNextCurrent(); } else { if (current == | ) { xLeaf- op = e_empty; setNextCurrent(); } else if (getBackCurrent() == | ){ xLeaf- op = e_empty; setNextCurrent(); } else if (current == \0 ) { return NULL; } else { perror("sentence error"); } } return xLeaf; } Leaf* Stree growTree(Leaf *left, Leaf *right, op_t op) { Leaf *leaf = new Leaf(); leaf- op = op; leaf- eleft = left; leaf- eright = right; return leaf; } void Stree showAll() { showItem(root, 0); } void Stree showItem(Leaf *leaf, int count) { if (leaf == NULL) return; if (leaf- op != e_char) { for (int i=0; i =count; i++) cout " "; cout "left" endl; showItem(leaf- eleft, count+1); } for (int i=0; i =count; i++) cout " "; switch (leaf- op) { case e_union cout | ; break; case e_concat break; case e_closure cout * ; break; case e_pclosure cout + ; break; case e_empty cout "empty" endl;; return; case e_char cout leaf- ech endl;; return; } cout endl; for (int i=0; i =count; i++) cout " "; cout "right" endl; showItem(leaf- eright, count+1); } void Stree perror(const char * ptr) { cout ptr endl; exit(1); } nfa.h #ifndef _NFA_INCLUDE_CHECK #define _NFA_INCLUDE_CHECK #include iostream #include "regex.h" const int NTRANS_MAX = 128; const int NNODE_MAX = 128; const char EMPTY = -1; const int END = -1; struct Ntrans { char ch; int to; int from; }; struct Nnode { char ch; int to; Nnode* next; }; class NfaClass { Ntrans* ntrans[NTRANS_MAX]; int nodeNum; int ntransNum; int nnodeMaxNum; void nfaInitial(); void nfaIter(Stree st, Leaf* leaf, int start, int last); void createTrans(int from, int to, char ch); void setTransToNode(); int getNewNode() { return ++nodeNum; } public Nnode* nnode[NNODE_MAX]; NfaClass(Stree st) { nfaInitial(); Leaf* leaf = st.getRoot(); nfaIter(st, leaf, 0, 1); setTransToNode(); } ~NfaClass(); Nnode* getRoot(); void showNtransAll(); void showNnodeAll(); }; #endif nfa.cpp #include "nfa.h" void NfaClass nfaIter(Stree st, Leaf* leaf, int start, int last) { switch (leaf- op) { case e_union { int newNodeA, newNodeB, newNodeC, newNodeD; newNodeA = getNewNode(); newNodeB = getNewNode(); newNodeC = getNewNode(); newNodeD = getNewNode(); createTrans(start, newNodeA, EMPTY); createTrans(newNodeB, last, EMPTY); createTrans(start, newNodeC, EMPTY); createTrans(newNodeD, last, EMPTY); nfaIter(st, leaf- eleft, newNodeA, newNodeB); nfaIter(st, leaf- eright, newNodeC, newNodeD); } break; case e_concat { int newNode = getNewNode(); nfaIter(st, leaf- eleft, start, newNode); nfaIter(st, leaf- eright, newNode, last); } break; case e_closure { int newNodeA, newNodeB; newNodeA = getNewNode(); newNodeB = getNewNode(); createTrans(start, newNodeA, EMPTY); createTrans(newNodeB, newNodeA, EMPTY); createTrans(newNodeA, last, EMPTY); nfaIter(st, leaf- eleft, newNodeA, newNodeB); } break; case e_pclosure { int newNodeA, newNodeB; newNodeA = getNewNode(); newNodeB = getNewNode(); createTrans(start, newNodeA, EMPTY); createTrans(newNodeB, newNodeA, EMPTY); createTrans(newNodeB, last, EMPTY); nfaIter(st, leaf- eleft, newNodeA, newNodeB); } break; case e_char createTrans(start, last, leaf- ech); break; case e_empty createTrans(start, last, EMPTY); break; } } void NfaClass createTrans(int from, int to, char ch) { Ntrans* nt = new Ntrans(); nt- ch = ch; nt- to = to; nt- from = from; ntrans[ntransNum++] = nt; } void NfaClass setTransToNode() { for (int i=0; i ntransNum; i++) { int from = ntrans[i]- from; if (nnode[from] != NULL) { // create new Nnode, and set to next link of nnode[i]. Nnode* newNode = new Nnode(); newNode- ch = ntrans[i]- ch; newNode- to = ntrans[i]- to; newNode- next = nnode[from]; nnode[from] = newNode; } else { // create new nnode[i] nnode[from] = new Nnode(); nnode[from]- ch = ntrans[i]- ch; nnode[from]- to = ntrans[i]- to; nnode[from]- next = NULL; if (from nnodeMaxNum) nnodeMaxNum = from; } } } void NfaClass nfaInitial() { nodeNum = 1; ntransNum = 0; nnodeMaxNum = 0; for (int i=0; i NTRANS_MAX; i++) ntrans[i] = NULL; for (int j=0; j NNODE_MAX; j++) nnode[j] = NULL; } NfaClass ~NfaClass() { } void NfaClass showNtransAll() { for (int i=0; i ntransNum; i++) { Ntrans* nt = ntrans[i]; cout "from " nt- from " " "to " nt- to " "; if (nt- ch == EMPTY) cout "char EMPTY" endl; else cout "char " nt- ch endl; } } void NfaClass showNnodeAll() { for (int i=0; i = nnodeMaxNum; i++) { Nnode* nd = nnode[i]; if (nd == NULL) continue; do { cout "from " i " "; cout "to " nd- to " "; if (nd- ch == EMPTY) cout "char EMPTY" endl; else cout "char " nd- ch endl; nd = nd- next; } while (nd != NULL); } } dfa.h #ifndef _DFA_INCLUDE_CHECK #define _DFA_INCLUDE_CHECK #include iostream #include "nfa.h" #define nd_sib e.sibling #define tr_ch e.transition.ch #define tr_sib e.transition.sibling #define tr_next e.transition.next const int DFA_MAX = 128; enum dfaOp_t { e_node, e_transition, e_final }; struct Dtrans { int nnode_no; Dtrans* next; }; struct Dnode { dfaOp_t op; // op_t represent the two statement as node or transition. union Entity { Dnode* sibling; // when op is "node" struct { // when op is "transition" char ch; Dnode* sibling; // If other charcter exist in this node, it is linked at sibling. Dnode* next; // } transition; } e; }; class DfaClass { Dtrans* dtrans[DFA_MAX]; Dnode* dnode[DFA_MAX]; int numOfDnode; void dfaInitial(NfaClass nfa); void nfaToDfa(NfaClass nfa); void setEmptyFromNnode(NfaClass nfa, Nnode* node, Dtrans** dtrans); int compareDtrans(Dtrans* dtrans_tmp, int checkNum); int getLinkSize(Dtrans* dtrans); bool isFinal(int dfastate); void showIter(Dnode* dn); public DfaClass(NfaClass nfa) { dfaInitial(nfa); nfaToDfa(nfa); } ~DfaClass() {} void showDfaAll(); bool regexp(char* search); }; #endif dfa.cpp #include "dfa.h" void DfaClass dfaInitial(NfaClass nfa) { // make the DFA state of number 0 dnode[0] = new Dnode(); dtrans[0] = new Dtrans(); dnode[0]- op = e_node; dnode[0]- nd_sib = NULL; dtrans[0]- nnode_no = 0; dtrans[0]- next = NULL; Nnode* node = nfa.nnode[0]; setEmptyFromNnode(nfa, node, dtrans[0]); if (isFinal(0)) dnode[0]- op = e_final; numOfDnode = 0; } void DfaClass setEmptyFromNnode(NfaClass nfa, Nnode* node, Dtrans** dtrans) { if (node == NULL) return; for (Nnode* p=node; p != NULL; p=p- next) { if (p- ch == EMPTY) { Dtrans* newTrans = new Dtrans(); newTrans- nnode_no = p- to; newTrans- next = *dtrans; *dtrans = newTrans; /** Check if the nnode next to this node is EMPTY */ Nnode* nextNode = nfa.nnode[p- to]; setEmptyFromNnode(nfa, nextNode, dtrans); } } } void DfaClass nfaToDfa(NfaClass nfa) { int numCheckingDnode = 0; while (numCheckingDnode = numOfDnode) { for (Dtrans* dtOuter = dtrans[numCheckingDnode]; dtOuter != NULL; dtOuter = dtOuter- next) { int nnode_no = dtOuter- nnode_no; // final point of nnode if (nfa.nnode[nnode_no] == NULL) continue; char ch = nfa.nnode[nnode_no]- ch; if (ch == EMPTY) continue; int next_nnode_no = nfa.nnode[nnode_no]- to; Dtrans* dtrans_tmp = new Dtrans(); dtrans_tmp- nnode_no = next_nnode_no; dtrans_tmp- next = NULL; // If the next of this nnode[] is EMPTY, // add the EMPTY state to dtrans_tmp. setEmptyFromNnode(nfa, nfa.nnode[next_nnode_no], dtrans_tmp); // ch != EMPTY. Search same ch at next dtranses. for (Dtrans* dtInner = dtOuter- next; dtInner != NULL; dtInner = dtInner- next) { int noNext = dtInner- nnode_no; char chNext = nfa.nnode[noNext]- ch; if (chNext != ch) continue; int next_noNext = nfa.nnode[noNext]- to; Dtrans* newTransNext = new Dtrans(); newTransNext- nnode_no = next_noNext; newTransNext- next = dtrans_tmp; dtrans_tmp = newTransNext; // If the next of this nnode[] is EMPTY, // add the EMPTY state to dtrans_tmp. setEmptyFromNnode(nfa, nfa.nnode[next_noNext], dtrans_tmp); } /** Now, not empty dtrans_tmp exist. * We compare this dtrans_tmp to dtrans[x] as x = numOfDnode */ int needMakeNew = compareDtrans(dtrans_tmp, numOfDnode); if (needMakeNew != -1) { // The same state already exist as dtrans_tmp. Dnode* newDnode = new Dnode(); newDnode- op = e_transition; newDnode- tr_ch = ch; newDnode- tr_next = dnode[needMakeNew]; newDnode- tr_sib = dnode[numCheckingDnode]- nd_sib; dnode[numCheckingDnode]- nd_sib = newDnode; } else { // not exist. and make new state numOfDnode++; dtrans[numOfDnode] = dtrans_tmp; dnode[numOfDnode] = new Dnode(); dnode[numOfDnode]- op = e_node; dnode[numOfDnode]- nd_sib = NULL; Dnode* newDnode = new Dnode(); newDnode- op = e_transition; newDnode- tr_ch = ch; newDnode- tr_next = dnode[numOfDnode]; newDnode- tr_sib = dnode[numCheckingDnode]- nd_sib; dnode[numCheckingDnode]- nd_sib = newDnode; if (isFinal(numOfDnode)) dnode[numOfDnode]- op = e_final; } } numCheckingDnode++; } } /** * If a dtrans exist the same dtrans_tmp, return the state number * else return -1 */ int DfaClass compareDtrans(Dtrans* dtrans_tmp, int checkNum) { const int NOT_EQUAL = 0; const int EQUAL = 1; int compFlag = EQUAL; int count; for (count = 0; count = checkNum; count++) { Dtrans* dtp = dtrans_tmp; Dtrans* dti = dtrans[count]; if (getLinkSize(dtp) != getLinkSize(dti)) continue; for (; dtp != NULL dti != NULL ; dtp = dtp- next, dti = dti- next) { if ( dtp- nnode_no == dti- nnode_no ) continue; else { compFlag = NOT_EQUAL; break; } } if (compFlag == NOT_EQUAL) { compFlag = EQUAL; continue; } return count; } return -1; } int DfaClass getLinkSize(Dtrans* dtrans) { int size = 0; for (Dtrans* p = dtrans; p != NULL; p = p- next) size++; return size; } bool DfaClass isFinal(int dfastate) { Dtrans* p = dtrans[dfastate]; for (; p != NULL; p = p- next) if (p- nnode_no == 1) return true; return false; } bool DfaClass regexp(char* search) { char* p = search; Dnode* node = dnode[0]; Dnode* prev = node; bool checkFlag = false; while (*p != \0 ) { if (node == NULL) return false; Dnode* sib = node- e.sibling; for (; sib != NULL; sib = sib- tr_sib) { if (sib- tr_ch != *p) continue; checkFlag = true; break; } if (checkFlag == false) return false; checkFlag = false; node = sib- tr_next; prev = node; p++; } if (prev- op != e_final) return false; return true; } void DfaClass showDfaAll() { for (int i=0; i =numOfDnode; i++) { Dnode* dn = dnode[i]; cout "node " i " "; showIter(dn- nd_sib); cout endl; } } void DfaClass showIter(Dnode* dn) { Dnode* p=dn; for (; p != NULL; p = p- tr_sib) cout "char " p- tr_ch " "; } main.cpp #include "regex.h" #include "nfa.h" #include "dfa.h" int main(int argc, char **argv) { if (argc != 3) { cout "Usage Stree (regex string) (checking string)" endl; exit(0); } char *regex = new char[strlen(argv[1])]; char *check = new char[strlen(argv[2])]; strncpy(regex, argv[1], strlen(argv[1])); strncpy(check, argv[2], strlen(argv[2])); Stree st(regex); NfaClass nfa(st); DfaClass dfa(nfa); nfa.showNtransAll(); nfa.showNnodeAll(); dfa.showDfaAll(); cout boolalpha; cout "The result of checking this regular expression is " dfa.regexp(check) " " endl; delete regex; delete check; return 0; }