changeset 185:d25f4f3b4c34 pairPro

add comment
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Thu, 24 Dec 2015 20:27:49 +0900
parents 1da1b2eacb84
children 3e8aae8beba9
files regexParser/regexParser.cc regexParser/subsetConstraction.cc
diffstat 2 files changed, 20 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/regexParser/regexParser.cc	Thu Dec 24 20:09:21 2015 +0900
+++ b/regexParser/regexParser.cc	Thu Dec 24 20:27:49 2015 +0900
@@ -26,7 +26,7 @@
 }
 
 static
-NodePtr createNode(RegexInfoPtr ri,unsigned char type,CharClassPtr cc, NodePtr left, NodePtr right) {
+NodePtr createNode(unsigned char type,CharClassPtr cc, NodePtr left, NodePtr right) {
     NodePtr n = allocateNode();
     n->tokenType = type;
     n->cc = cc;
--- a/regexParser/subsetConstraction.cc	Thu Dec 24 20:09:21 2015 +0900
+++ b/regexParser/subsetConstraction.cc	Thu Dec 24 20:27:49 2015 +0900
@@ -218,6 +218,11 @@
     s->cc = NULL;
 }
 
+/**
+正規表現に必要な状態を探して、それぞれに番号を割り振る
+前が * でない + は新しく状態を作る
+* があったら、次の状態はその時の先頭の状態になる
+ */
 TGValue stateAllocate(NodePtr n,TGValue tg) {
     if (n->tokenType == '+') {
         TGValue tgLeft = stateAllocate(n->left,tg);
@@ -254,8 +259,20 @@
     }
 }
 
+/**
+割り当てられた状態に沿って charclass の行き先を書き換える
+書き換えた charclass を merge する
+前の部分に * がない + は新しい状態をつくるので、state を切り替えて生成する
+ */
 TGValue generateTransition(NodePtr n,TGValue tg) {
     if (n->tokenType == '+') {
+        if (tg.asterisk) {
+            TGValue tgRight = tg;
+            tgRight.asterisk = false;
+            tgRight = generateTransition(n->right,tgRight);
+            tgRight.asterisk = true;
+            return tgRight;
+        }
         StatePtr left = tg.state;
         tg.state = n->left->state;
         tg.tg.stateArray[tg.state->bitState.bitContainer] = tg.state;
@@ -269,9 +286,11 @@
         return tgv1;
     } else if (n->tokenType == '*') {
         tgAstah = generateTransition(n->left,tgAstah);
+        tgAstah.asterisk = true;
         return tgAstah;
     } else if (n->tokenType == 'c' || n->tokenType == 'a'){
         TGValue tgv = tg;
+        tgv.asterisk = false;
         BitVector bi = createBitVector(n->nextStateNum);
         setState(n->cc,bi);
         tgv.state->cc = mergeTransition(tgv.state,n->cc);