OSDN Git Service

Support for multiple execute the action
[liveml/LiveML.git] / src / livemlparser.cpp
index 22ec754..20b2f36 100644 (file)
@@ -42,17 +42,36 @@ namespace lmlTag
     ActorParser *actor = p.actorContainer.add((XMLElement*)p.getCurrentTag());
     p.setCurrentActor(actor);
     actor->eventContainer.resize(p.eventTypeContainer.size());
+    
+    p.unionId = p.unionContainer.NOTFOUND;
+    p.unionContainer.clear();
 
     return XML_TAGRTN_LEVEL;
   }
 
+  LML_TAGFUNC(runion)
+  {
+    LiveMLParser &p = (LiveMLParser&)parser;
+    p.unionId = p.unionContainer.add(param.getString(0));
+
+    return XML_TAGRTN_NULL;
+  }
+
+  LML_TAGFUNC(runion_close)
+  {
+    LiveMLParser &p = (LiveMLParser&)parser;
+    p.unionId = p.unionContainer.NOTFOUND;
+
+    return XML_TAGRTN_NULL;
+  }
+
   LML_TAGFUNC(event)
   {
     LiveMLParser &p = (LiveMLParser&)parser;
     TagType *rt = ((XMLElement*)p.getParentTag())->type;
     EventContainer *ec = NULL;
 
-    size_t et = p.eventTypeContainer.getId(param.getString(0));
+    size_t et = param.getUInteger(0);
 
     if (!p.eventTypeContainer.has(et))
     {
@@ -65,7 +84,7 @@ namespace lmlTag
       return XML_TAGRTN_SKIP;
     }
 
-    DCODE(printf("added event[%s]\n", param.getString(0));)
+    DCODE(printf("added event[%d]\n", param.getUInteger(0));)
     ec->get(et)->tag = (XMLElement*)p.getCurrentTag();
 
     return XML_TAGRTN_LEVEL;
@@ -88,7 +107,9 @@ namespace lmlTag
     }
 
     DCODE(printf("added action[%s]\n", param.getString(0));)
-    ac->add((XMLElement*)p.getCurrentTag());
+
+    ActionParser *ap = ac->add((XMLElement*)p.getCurrentTag());
+    ap->unionId = p.unionId;
 
     return XML_TAGRTN_LEVEL;
   }
@@ -152,7 +173,22 @@ PARAMFUNC(LiveMLParser::paramActor)
 {
   size_t id = ((LiveMLParser&)parser).actorTypeContainer.getId(value);
 
-  return new XMLActor(id);
+  return new XMLSizeT(id);
+}
+
+PARAMFUNC(LiveMLParser::paramAction)
+{
+  ActionContainer *ac = &((LiveMLParser&)parser).getCurrentActor()->actionContainer;
+  size_t id = ac->getId(value);
+
+  return new XMLSizeT(id);
+}
+
+PARAMFUNC(LiveMLParser::paramEvent)
+{
+  size_t id = ((LiveMLParser&)parser).eventTypeContainer.getId(value);
+
+  return new XMLSizeT(id);
 }
 
 int LiveMLParser::calcuEncode(char **input, char **output, void *work)
@@ -251,7 +287,9 @@ LiveMLParser::LiveMLParser(void) :
 PARAM_TEXT(registerParameterType(paramText)),
 PARAM_NUMERIC(registerParameterType(paramNumeric)),
 PARAM_VAR(registerParameterType(paramVar)),
-PARAM_ACTOR(registerParameterType(paramActor))
+PARAM_ACTOR(registerParameterType(paramActor)),
+PARAM_ACTION(registerParameterType(paramAction)),
+PARAM_EVENT(registerParameterType(paramEvent))
 {
   TagType *reg = _tagTypeContainer.add("liveml", NULL);
   reg->setFunction(lmlTag::liveml);
@@ -267,13 +305,23 @@ PARAM_ACTOR(registerParameterType(paramActor))
   // event
   reg = addTagType("event", "actor");
   reg->setFunction(lmlTag::event);
-  reg->addParameter(0, PARAM_STRING, "type");
+  reg->addParameter(0, PARAM_EVENT, "type");
+  reg->addParameter(1, PARAM_NUMERIC, "case");
+
+  // union
+  reg = addTagType("union", "actor");
+  reg->setFunction(lmlTag::runion, lmlTag::runion_close);
+  reg->addParameter(0, PARAM_STRING, "name");
 
   // action
   reg = addTagType("action", "liveml actor");
   reg->setFunction(lmlTag::action);
   reg->addParameter(0, PARAM_STRING, "name");
 
+  // endAction
+  reg = addTagType("endAction");
+  reg->addParameter(0, PARAM_STRING);
+
   // print
   reg = addTagType("print");
   reg->addParameter(0, PARAM_TEXT);
@@ -283,15 +331,17 @@ PARAM_ACTOR(registerParameterType(paramActor))
   reg->addParameter(0, PARAM_TEXT);
   reg->addParameter(1, PARAM_VAR, "var");
 
+  // activeAction
+  reg = addTagType("activeAction");
+  reg->addParameter(0, PARAM_TEXT);
+
   // callAction
   reg = addTagType("callAction");
   reg->addParameter(0, PARAM_TEXT);
-  reg->addParameter(1, PARAM_NUMERIC, "target");
 
   // callEvent
   reg = addTagType("callEvent");
-  reg->addParameter(0, PARAM_TEXT);
-  reg->addParameter(1, PARAM_NUMERIC, "target");
+  reg->addParameter(0, PARAM_EVENT);
 
   // include
   reg = addTagType("include");
@@ -302,6 +352,9 @@ PARAM_ACTOR(registerParameterType(paramActor))
   reg = addTagType("repeat");
   reg->addParameter(0, PARAM_NUMERIC, "count");
 
+  // count
+  reg = addTagType("count");
+
   // continue
   reg = addTagType("continue");
 
@@ -309,8 +362,8 @@ PARAM_ACTOR(registerParameterType(paramActor))
   reg = addTagType("break");
 
   // if
-  //reg = addTagType("if");
-  //reg->addParameter(0, PARAM_NUMERIC, "case");
+  reg = addTagType("if");
+  reg->addParameter(0, PARAM_NUMERIC, "case");
 
   // wait
   reg = addTagType("wait");
@@ -324,6 +377,10 @@ PARAM_ACTOR(registerParameterType(paramActor))
   reg->addParameter(0, PARAM_VAR, "name");
   reg->addParameter(1, PARAM_NUMERIC);
 
+  // focus
+  reg = addTagType("focus");
+  reg->addParameter(0, PARAM_NUMERIC, "target");
+
   // int
   reg = addTagType("int");
   reg->addParameter(0, PARAM_NUMERIC);