[BACK]Return to OM2OXM.java CVS log [TXT][DIR] Up to [local] / OpenXM / src / OpenMath

Annotation of OpenXM/src/OpenMath/OM2OXM.java, Revision 1.1

1.1     ! tam         1: /**
        !             2:  * OM2OXM.java
        !             3:  *
        !             4:  * $B$3$N%/%i%9$G$O0J2<$N(B BNF $B$GI=$5$l$k9=J82r@O$r<BAu$7$F$$$k(B
        !             5:  * expr -> stag [expr | immediate]* etag
        !             6:  * immediate -> INTEGER
        !             7:  *            | SYMBOL
        !             8:  * stag -> '<' SYMBOL '>'
        !             9:  * etag -> '<' '/' SYMBOL '>'
        !            10:  * $B=*C<5-9f(B: INTEGER, SYMBOL, '<', '/', '>'
        !            11:  * $BHs=*C<5-9f(B: expr, stag, etag, immediate
        !            12:  * $B3+;O5-9f(B: expr
        !            13:  *
        !            14:  * $B0J2<$N4X?t$r;HMQ(B:
        !            15:  * public void send(OutputStream os); - buffer $B$K$"$k(B OX message $B$rAw?.$9$k(B.
        !            16:  * public int parse(); - $B9=J82r@O$r3+;O$9$k(B.
        !            17:  * private int parse_expr();       - parser $B$N(B expr $BItJ,(B
        !            18:  * private Attribute parse_stag(); - parser $B$N(B stag $BItJ,(B
        !            19:  * private void parse_etag(Attribute tag,int argnum); - parser $B$N(B etag $BItJ,(B
        !            20:  * private int parse_immediate();  - parser $B$N(B immediate $BItJ,(B
        !            21:  * private void parse_error(String mesg); - parser $B$N(B error $B$rI=<($7$F=*N;$9$k(B
        !            22:  * public static void main(String[] args); - main $B4X?t(B.
        !            23:  *
        !            24:  * $B0J2<$NJQ?t$r;HMQ(B:
        !            25:  * Attribute Attribute; - $B;z6g2r@O4o$r8F$S=P$7(B, $B$=$NB0@-CM$rJ]B8$7$F$*$/(B
        !            26:  * int token; - $B8=:_FI$_9~$s$G$$$k(B token $B$rJ]B8$7$F$*$/$N$K;HMQ(B.
        !            27:  * CellStack stack; - $B%;%^%s%F%#%C%/%9$N%A%'%C%/$K;H$&FbIt%9%?%C%/(B.
        !            28:  * ByteArrayOutputStream buffer; - oxasir $B$KAw?.$9$k$^$($K%G!<%?$rN/$a$F$*$/(B
        !            29:  */
        !            30:
        !            31: import java.io.*;
        !            32: import java.net.*;
        !            33: import java.util.Vector;
        !            34: import JP.ac.kobe_u.math.tam.OpenXM.*;
        !            35:
        !            36: final class OM2OXM implements Runnable{
        !            37:   private PushbackInputStream is;
        !            38:   private String attribute;
        !            39:   private int token = TT_NULL;
        !            40:   private boolean lexPushbackFlag = false;
        !            41:   private OpenXM asir; // for debug
        !            42:
        !            43:   // Token Type for lexical analyzer
        !            44:   final static int TT_NULL      = 0;
        !            45:   final static int TT_String    = -1;
        !            46:   final static int TT_StartTag  = -2;
        !            47:   final static int TT_EndTag    = -3;
        !            48:   final static int TT_SingleTag = -4;
        !            49:
        !            50:   public void run(){ // for debug
        !            51:     //$B%5!<%PB&$+$iAw?.$5$l$?J8;zNs$r<u?.$7$^$9!#(B
        !            52:     try{
        !            53:       while(true){
        !            54:        CMO tmp;
        !            55:
        !            56:        Thread.yield();
        !            57:
        !            58:        switch(asir.receiveOXtag()){
        !            59:        case OpenXM.OX_COMMAND:
        !            60:           asir.receiveSM();
        !            61:           break;
        !            62:
        !            63:        case OpenXM.OX_DATA:
        !            64:           tmp = asir.receiveCMO();
        !            65:          System.out.println("=> <OMOBJ>"+ CMO2OM(tmp) +"</OMOBJ>");
        !            66:           break;
        !            67:        }
        !            68:
        !            69:       }
        !            70:     }catch(IOException e){}
        !            71:   }
        !            72:
        !            73:   public static String CMO2OM(CMO cmo){
        !            74:     String ret = "";
        !            75:
        !            76:     switch(cmo.getDISCRIMINATOR()){
        !            77:     case CMO.CMO_NULL:
        !            78:       return "<OMI>0</OMI>";
        !            79:
        !            80:     case CMO.CMO_INT32:
        !            81:       return "<OMI>"+ ((CMO_INT32)cmo).intValue() +"</OMI>";
        !            82:
        !            83:       // case CMO.CMO_DATUM:
        !            84:
        !            85:     case CMO.CMO_STRING:
        !            86:       return "<OMSTR>"+ ((CMO_STRING)cmo).getString() +"</OMSTR>";
        !            87:
        !            88:       // case CMO.CMO_LIST:
        !            89:
        !            90:     case CMO.CMO_MONOMIAL32:
        !            91:       ret += "<OMA><OMS name=\"Monom\" cd=\"poly\"/>";
        !            92:       ret += CMO2OM(((CMO_MONOMIAL32)cmo).getCoefficient());
        !            93:       for(int i=0;i<((CMO_MONOMIAL32)cmo).getDegree().length;i++){
        !            94:        ret += "<OMI>"+ ((CMO_MONOMIAL32)cmo).getDegree()[i] +"</OMI>";
        !            95:       }
        !            96:       ret += "</OMA>";
        !            97:       return ret;
        !            98:
        !            99:     case CMO.CMO_ZZ:
        !           100:       return "<OMI>"+ ((CMO_ZZ)cmo).BigIntValue() +"</OMI>";
        !           101:
        !           102:     case CMO.CMO_QQ:
        !           103:       return "<OMA><OMS name=\"over\" cd=\"basic\"/>"+
        !           104:        CMO2OM(((CMO_QQ)cmo).getBunshi()) + CMO2OM(((CMO_QQ)cmo).getBunbo())
        !           105:        +"</OMA>";
        !           106:
        !           107:     case CMO.CMO_ZERO:
        !           108:       return "<OMI> 0 </OMI>";
        !           109:
        !           110:       // case CMO.CMO_DMS:
        !           111:
        !           112:     case CMO.CMO_DMS_GENERIC:
        !           113:       ret += "<OMA><OMS name=\"PolyRing\" cd=\"poly\"/>";
        !           114:       ret += "<OMI>2</OMI>";
        !           115:       return ret;
        !           116:
        !           117:     case CMO.CMO_DISTRIBUTED_POLYNOMIAL:
        !           118:       ret += "<OMA><OMS name=\"DMP\" cd=\"poly\"/>";
        !           119:       ret += CMO2OM(((CMO_DISTRIBUTED_POLYNOMIAL)cmo).getRing());
        !           120:       ret += "<OMA><OMS name=\"SDMP\" cd=\"poly\"/>";
        !           121:       for(int i=0;i<((CMO_DISTRIBUTED_POLYNOMIAL)cmo).getMonomials().length;i++){
        !           122:        ret += CMO2OM(((CMO_DISTRIBUTED_POLYNOMIAL)cmo).getMonomials()[i]);
        !           123:       }
        !           124:       ret += "</OMA></OMA>";
        !           125:       return ret;
        !           126:
        !           127:     case CMO.CMO_INDETERMINATE:
        !           128:       return "<OMV name=\""+ ((CMO_INDETERMINATE)cmo).getString() +"\"/>";
        !           129:
        !           130:       /*
        !           131:        case CMO.CMO_TREE:
        !           132:       return "<OMA><OMS name=\""+ "\"/>"+
        !           133:        "</OMA>";
        !           134:        */
        !           135:
        !           136:     default:
        !           137:       return "<OMSTR>"+ cmo.toCMOexpression() +"</OMSTR>";
        !           138:     }
        !           139:   }
        !           140:
        !           141:   private boolean isSpace(int ch){ // use from lex
        !           142:     return (ch==' ' || ch=='\t' || ch=='\n' || ch=='\r');
        !           143:   }
        !           144:
        !           145:   private int skipSpace() throws IOException{ // use from lex
        !           146:     int ch;
        !           147:
        !           148:     do{
        !           149:       ch = is.read();
        !           150:     }while(isSpace(ch));
        !           151:     is.unread(ch);
        !           152:
        !           153:     return ch;
        !           154:   }
        !           155:
        !           156:   private void pushbackLex(){
        !           157:     if(lexPushbackFlag){
        !           158:       System.err.println("lex pushback error!");
        !           159:     }
        !           160:     lexPushbackFlag = true;
        !           161:   }
        !           162:
        !           163:   private int readNextToken() throws IOException{ // lexical analyzer
        !           164:     String buf = "";
        !           165:     int ch;
        !           166:
        !           167:     if(lexPushbackFlag){
        !           168:       lexPushbackFlag = false;
        !           169:       return token;
        !           170:     }
        !           171:
        !           172:     token = TT_NULL;
        !           173:     attribute = "";
        !           174:     skipSpace();
        !           175:     ch = is.read();
        !           176:
        !           177:     if(ch == '<'){ // for tag
        !           178:       ch = skipSpace();
        !           179:       if(ch == '/'){
        !           180:        is.read();
        !           181:        token = TT_EndTag;
        !           182:        skipSpace();
        !           183:       }else{
        !           184:        token = TT_StartTag;
        !           185:       }
        !           186:       while((ch = is.read()) != '>' && ch != '/' && ch != -1){
        !           187:        if(isSpace(ch)){
        !           188:          if((ch = skipSpace()) != '>' && ch != '/'){
        !           189:            buf += " ";
        !           190:          }
        !           191:          continue;
        !           192:        }
        !           193:
        !           194:        buf += Character.toUpperCase((char)ch);
        !           195:
        !           196:        if(ch == '"'){
        !           197:          do{
        !           198:            ch = is.read();
        !           199:            buf += (char)ch;
        !           200:          }while(ch != '"' && ch != -1);
        !           201:        }
        !           202:       }
        !           203:       if(ch == '>'){ // for StartTag and EndTag
        !           204:        attribute = buf;
        !           205:        return token;
        !           206:       }else if(ch == '/'){
        !           207:        skipSpace();
        !           208:        if((ch = is.read()) == '>'){ // for SingleTag
        !           209:          attribute = buf;
        !           210:          return token = TT_SingleTag;
        !           211:        }
        !           212:       }
        !           213:       return token = TT_NULL;
        !           214:     }else if(ch != -1){
        !           215:       is.unread(ch);
        !           216:       while((ch = is.read()) != '<' && ch != -1){
        !           217:        System.out.println("debug: "+ch);
        !           218:        if(isSpace(ch)){
        !           219:          String spaces = String.valueOf(ch);
        !           220:
        !           221:          while(isSpace(ch = is.read())){
        !           222:            spaces += (char)ch;
        !           223:          }
        !           224:          if(ch != '<' && ch != -1){
        !           225:            buf += spaces;
        !           226:          }
        !           227:          is.unread(ch);
        !           228:        }else{
        !           229:          buf += (char)ch;
        !           230:        }
        !           231:       }
        !           232:       is.unread(ch);
        !           233:
        !           234:       attribute = buf;
        !           235:       return token = TT_String;
        !           236:     }
        !           237:
        !           238:     return token = TT_NULL;
        !           239:   }
        !           240:
        !           241:   private boolean exceptTokenTypeInParse(int type) throws IOException{
        !           242:     // use from parse
        !           243:     if(readNextToken() != type){
        !           244:       parse_error("We expect type :'"+ type
        !           245:                  +"', but we got type :'"+ token +"'("+ attribute +").");
        !           246:     }
        !           247:     //System.out.println(":"+token+":"+attribute+":"+type);
        !           248:     return true;
        !           249:   }
        !           250:
        !           251:   public CMO parse(InputStream stream) throws IOException{
        !           252:     // start -> '<OMOBJ>' object '</OMOBJ>'
        !           253:     CMO ret;
        !           254:
        !           255:     is = new PushbackInputStream(stream);
        !           256:
        !           257:     exceptTokenTypeInParse(TT_StartTag);
        !           258:     if(!attribute.equals("OMOBJ")){
        !           259:       parse_error("We expect '<OMOBJ>'.");
        !           260:     }
        !           261:
        !           262:     ret = parse_object();
        !           263:
        !           264:     exceptTokenTypeInParse(TT_EndTag);
        !           265:     if(!attribute.equals("OMOBJ")){
        !           266:       parse_error("We expect '</OMOBJ>'.");
        !           267:     }
        !           268:
        !           269:     return ret;
        !           270:   }
        !           271:
        !           272:   private CMO parse_object() throws IOException{
        !           273:     // object -> variable
        !           274:     //         | '<OMI>' S? integer S? '</OMI>'
        !           275:     //         | '<OMA>' S? symbol S? objects S? '</OMA>'
        !           276:     CMO ret;
        !           277:
        !           278:     if(readNextToken() != TT_StartTag && token != TT_SingleTag){
        !           279:       parse_error("We expect '<OMI> or '<OMA>' or '<OMV>'.");
        !           280:     }
        !           281:
        !           282:     if(attribute.startsWith("OMV")){
        !           283:       pushbackLex();
        !           284:       ret = parse_variable();
        !           285:     }else if(attribute.equals("OMI")){
        !           286:       pushbackLex();
        !           287:       ret = parse_OMI();
        !           288:     }else if(attribute.equals("OMA")){
        !           289:       String name,cdname;
        !           290:       int argnum = 0;
        !           291:
        !           292:       name = parse_symbol();
        !           293:
        !           294:       if(name.equals("DMP")){
        !           295:        ret = parse_symb_DMP();
        !           296:       }else{
        !           297:        ret = new CMO_TREE(name,"Basic",parse_objects());
        !           298:       }
        !           299:
        !           300:       exceptTokenTypeInParse(TT_EndTag);
        !           301:       if(!attribute.equals("OMA")){
        !           302:        parse_error("We expect '</OMA>'.");
        !           303:       }
        !           304:     }else{
        !           305:       parse_error("???");
        !           306:       ret = null;
        !           307:     }
        !           308:
        !           309:     return ret;
        !           310:   }
        !           311:
        !           312:   private CMO_ZZ parse_OMI() throws IOException{
        !           313:     CMO_ZZ ret;
        !           314:
        !           315:     exceptTokenTypeInParse(TT_StartTag);
        !           316:     if(!attribute.equals("OMI")){
        !           317:       parse_error("We expect '<OMI>'.");
        !           318:     }
        !           319:
        !           320:     ret = (CMO_ZZ)parse_integer();
        !           321:
        !           322:     exceptTokenTypeInParse(TT_EndTag);
        !           323:     if(!attribute.equals("OMI")){
        !           324:       parse_error("We expect '</OMI>'.");
        !           325:     }
        !           326:
        !           327:     return ret;
        !           328:   }
        !           329:
        !           330:   private CMO parse_symb_DMP() throws IOException{
        !           331:     parse_object();
        !           332:     return new CMO_DISTRIBUTED_POLYNOMIAL(new CMO_DMS_GENERIC(),
        !           333:                                          parse_symb_SDMP());
        !           334:   }
        !           335:
        !           336:   private CMO_MONOMIAL32[] parse_symb_SDMP() throws IOException{
        !           337:     Vector mono = new Vector();
        !           338:     CMO_MONOMIAL32[] ret;
        !           339:
        !           340:     exceptTokenTypeInParse(TT_StartTag);
        !           341:     if(!attribute.equals("OMA")){
        !           342:       parse_error("We expect '<OMA>'.");
        !           343:     }
        !           344:
        !           345:     if(!parse_symbol().equals("SDMP")){
        !           346:       parse_error("We expect '<SDMP>'");
        !           347:     }
        !           348:
        !           349:     while(readNextToken() != TT_EndTag){
        !           350:       pushbackLex();
        !           351:       mono.addElement(parse_symb_Monom());
        !           352:     }
        !           353:
        !           354:     if(!attribute.equals("OMA")){
        !           355:       parse_error("We expect '</OMA>'.");
        !           356:     }
        !           357:
        !           358:     ret = new CMO_MONOMIAL32[mono.size()];
        !           359:     mono.copyInto((Object[])ret);
        !           360:
        !           361:     return ret;
        !           362:   }
        !           363:
        !           364:   private CMO_MONOMIAL32 parse_symb_Monom() throws IOException{
        !           365:     Vector degree = new Vector();
        !           366:     int[] array;
        !           367:
        !           368:     exceptTokenTypeInParse(TT_StartTag);
        !           369:     if(!attribute.equals("OMA")){
        !           370:       parse_error("We expect '<OMA>'.");
        !           371:     }
        !           372:
        !           373:     if(!parse_symbol().equals("Monom")){
        !           374:       parse_error("We expect '<Monom>'");
        !           375:     }
        !           376:
        !           377:     while(readNextToken() != TT_EndTag){
        !           378:       pushbackLex();
        !           379:       degree.addElement(parse_OMI());
        !           380:     }
        !           381:
        !           382:     if(!attribute.equals("OMA")){
        !           383:       parse_error("We expect '<OMA>'.");
        !           384:     }
        !           385:
        !           386:     array = new int[degree.size()-1];
        !           387:     for(int i=0;i<array.length;i++){
        !           388:       array[i] = ((CMO_ZZ)degree.elementAt(i+1)).intValue();
        !           389:     }
        !           390:
        !           391:     return new CMO_MONOMIAL32(array,(CMO_ZZ)degree.elementAt(0));
        !           392:   }
        !           393:
        !           394:   private CMO parse_objects() throws IOException{
        !           395:     // $B2r@O$5$l$?(B object $B$r(B LIST $B$GJV$9(B
        !           396:     Vector objects = new Vector();
        !           397:     CMO[] array;
        !           398:
        !           399:     while(readNextToken() != TT_EndTag){
        !           400:       pushbackLex();
        !           401:       objects.addElement(parse_object());
        !           402:     }
        !           403:     pushbackLex();
        !           404:
        !           405:     objects.trimToSize();
        !           406:     array = new CMO[objects.size()];
        !           407:     objects.copyInto((Object[])array);
        !           408:
        !           409:     System.out.println("debug :"+ new CMO_LIST(array));
        !           410:     return new CMO_LIST(array);
        !           411:   }
        !           412:
        !           413:   private String parse_symbol() throws IOException{
        !           414:     // symbname $B$rJV$9(B
        !           415:     String ret = "";
        !           416:     StreamTokenizer para;
        !           417:
        !           418:     exceptTokenTypeInParse(TT_SingleTag);
        !           419:
        !           420:     para = new StreamTokenizer(new StringReader(attribute));
        !           421:     para.resetSyntax();
        !           422:     para.wordChars('A','Z');
        !           423:     para.wordChars('a','z');
        !           424:     para.wordChars('0','9');
        !           425:     para.wordChars('\u00A0','\u00FF');
        !           426:     para.whitespaceChars('\u0000','\u0020');
        !           427:     para.quoteChar('"');
        !           428:     para.eolIsSignificant(false);
        !           429:     para.lowerCaseMode(true);
        !           430:     para.slashStarComments(false);
        !           431:     para.slashSlashComments(false);
        !           432:     para.ordinaryChar('=');
        !           433:
        !           434:     if(para.nextToken() != StreamTokenizer.TT_WORD
        !           435:        || !para.sval.equalsIgnoreCase("OMS")){
        !           436:       parse_error("We expect '<OMS>', but '"+ para.sval +"'.");
        !           437:     }
        !           438:
        !           439:     if(para.nextToken() != StreamTokenizer.TT_WORD){
        !           440:       parse_error("We expect 'name' or 'cd'.");
        !           441:     }
        !           442:     if(para.sval.equals("name")){
        !           443:       if(para.nextToken() != '='){
        !           444:        parse_error("We expect '='.");
        !           445:       }
        !           446:       if(para.nextToken() != '"'){
        !           447:        parse_error("We expect '\"'.");
        !           448:       }
        !           449:       ret = parse_symbname(para.sval);
        !           450:
        !           451:       if(para.nextToken() != StreamTokenizer.TT_WORD
        !           452:         || !para.sval.equals("cd")){
        !           453:        parse_error("We expect 'cd'.");
        !           454:       }
        !           455:       if(para.nextToken() != '='){
        !           456:        parse_error("We expect '='.");
        !           457:       }
        !           458:       if(para.nextToken() != '"'){
        !           459:        parse_error("We expect '\"'.");
        !           460:       }
        !           461:       parse_cdname(para.sval);
        !           462:
        !           463:     }else if(para.sval.equals("cd")){
        !           464:       if(para.nextToken() != '='){
        !           465:        parse_error("We expect '='.");
        !           466:       }
        !           467:       if(para.nextToken() != '"'){
        !           468:        parse_error("We expect '\"'.");
        !           469:       }
        !           470:       parse_cdname(para.sval);
        !           471:
        !           472:       if(para.nextToken() != StreamTokenizer.TT_WORD
        !           473:         || !para.sval.equals("name")){
        !           474:        parse_error("We expect 'cd'.");
        !           475:       }
        !           476:       if(para.nextToken() != '='){
        !           477:        parse_error("We expect '='.");
        !           478:       }
        !           479:       if(para.nextToken() != '"'){
        !           480:        parse_error("We expect '\"'.");
        !           481:       }
        !           482:       ret = parse_symbname(para.sval);
        !           483:
        !           484:     }else{
        !           485:       parse_error("We expect 'name' or 'cd'.");
        !           486:     }
        !           487:
        !           488:     if(para.nextToken() != StreamTokenizer.TT_EOF){
        !           489:       parse_error("We expect '/>'.");
        !           490:     }
        !           491:
        !           492:     return ret;
        !           493:   }
        !           494:
        !           495:   private CMO parse_integer() throws IOException{
        !           496:     //Attribute integer = new Attribute(value);
        !           497:     String str;
        !           498:     int i=0;
        !           499:
        !           500:     exceptTokenTypeInParse(TT_String);
        !           501:     str = attribute;
        !           502:
        !           503:     if(str.charAt(i)=='-'){
        !           504:       i++;
        !           505:     }
        !           506:     if(str.length()>=i+2 && str.charAt(i)=='x'){ // for HEX
        !           507:       String strhex = str.substring(0,i) + str.substring(i+1);
        !           508:       for(i++;i<str.length();i++){
        !           509:        if("0123456789ABCDEF".indexOf((int)str.charAt(i)) == -1){
        !           510:          parse_error("We expect integer.");
        !           511:        }
        !           512:       }
        !           513:       // 10 $B?J?t$KJQ49(B
        !           514:       str = (new java.math.BigInteger(strhex,16)).toString();
        !           515:     }else if(str.length()>=i+1){ // for DEC
        !           516:       for(;i<str.length();i++){
        !           517:        if("0123456789".indexOf((int)str.charAt(i)) == -1){
        !           518:          parse_error("We expect integer.");
        !           519:        }
        !           520:       }
        !           521:     }else{
        !           522:       parse_error("We expect integer.");
        !           523:     }
        !           524:
        !           525:     return new CMO_ZZ(str);
        !           526:   }
        !           527:
        !           528:   private CMO parse_variable() throws IOException{
        !           529:     StreamTokenizer para;
        !           530:     CMO ret;
        !           531:
        !           532:     exceptTokenTypeInParse(TT_SingleTag);
        !           533:
        !           534:     para = new StreamTokenizer(new StringReader(attribute));
        !           535:     para.resetSyntax();
        !           536:     para.wordChars('A','Z');
        !           537:     para.wordChars('a','z');
        !           538:     para.wordChars('0','9');
        !           539:     para.wordChars('\u00A0','\u00FF');
        !           540:     para.whitespaceChars('\u0000','\u0020');
        !           541:     para.quoteChar('"');
        !           542:     para.eolIsSignificant(false);
        !           543:     para.lowerCaseMode(true);
        !           544:     para.slashStarComments(false);
        !           545:     para.slashSlashComments(false);
        !           546:     para.ordinaryChar('=');
        !           547:
        !           548:     if(para.nextToken() != StreamTokenizer.TT_WORD
        !           549:        || !para.sval.equalsIgnoreCase("OMV")){
        !           550:       parse_error("We expect '<OMV>'.");
        !           551:     }
        !           552:
        !           553:     if(para.nextToken() != StreamTokenizer.TT_WORD
        !           554:        || !para.sval.equals("name")){
        !           555:       parse_error("We expect 'name', but obtain '"+ para.sval +"'.");
        !           556:     }
        !           557:     if(para.nextToken() != '='){
        !           558:       parse_error("We expect '='.");
        !           559:     }
        !           560:     if(para.nextToken() != '"'){
        !           561:       parse_error("We expect '\"'.");
        !           562:     }
        !           563:     ret = new CMO_INDETERMINATE(parse_varname(para.sval));
        !           564:
        !           565:     if(para.nextToken() != StreamTokenizer.TT_EOF){
        !           566:       parse_error("We expect '/>'.");
        !           567:     }
        !           568:
        !           569:     return ret;
        !           570:   }
        !           571:
        !           572:   private String parse_varname(String str){
        !           573:     String words = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
        !           574:       + "0123456789+='(),-./:?!#$%*;@[]^_`{|}";
        !           575:
        !           576:     for(int i=0;i<str.length();i++){
        !           577:       if(words.indexOf((int)str.charAt(i))==-1){
        !           578:        parse_error("string \""+ str +"\" is not varname.");
        !           579:       }
        !           580:     }
        !           581:
        !           582:     return str;
        !           583:   }
        !           584:
        !           585:   private String parse_cdname(String str){
        !           586:     String alphabet = "abcdefghijklmnopqrstuvwxyz";
        !           587:     int i=0;
        !           588:
        !           589:     if(alphabet.indexOf((int)str.charAt(i))==-1){
        !           590:       parse_error("cdname \""+ str +"\" must begin small alphabet.");
        !           591:     }
        !           592:     for(i++;i<str.length();i++){
        !           593:       if((alphabet + "0123456789_").indexOf((int)str.charAt(i))==-1){
        !           594:        parse_error("string \""+ str +"\" is not cdname.");
        !           595:       }
        !           596:     }
        !           597:
        !           598:     return str;
        !           599:   }
        !           600:
        !           601:   private String parse_symbname(String str) throws IOException{
        !           602:     String Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        !           603:     int i=0;
        !           604:
        !           605:     if(Alphabet.indexOf((int)str.charAt(i))==-1){
        !           606:       parse_error("symbname \""+ str +"\" must begin alphabet.");
        !           607:     }
        !           608:     for(i++;i<str.length();i++){
        !           609:       if((Alphabet + "0123456789_").indexOf((int)str.charAt(i))==-1){
        !           610:        parse_error("string \""+ str +"\" is not symbname.");
        !           611:       }
        !           612:     }
        !           613:
        !           614:     return str;
        !           615:   }
        !           616:
        !           617:   private void parse_error(String mesg){
        !           618:     System.err.println(mesg);
        !           619:     System.err.print("error occuered near :");
        !           620:     try{
        !           621:       for(int i=0;i<10;i++){
        !           622:        System.err.print((char)is.read());
        !           623:       }
        !           624:       System.err.println((char)is.read());
        !           625:     }catch(IOException e){}
        !           626:     System.exit(1);
        !           627:   }
        !           628:
        !           629:   public static void main(String[] argv) throws IOException{
        !           630:     OM2OXM P = new OM2OXM();
        !           631:     OpenXM asir;
        !           632:     String host = "localhost";
        !           633:     int CtrlPort = 1200,StreamPort = 1300;
        !           634:
        !           635:     for(int i=0;i<argv.length;i++){
        !           636:       if(argv[i].equals("-h")){
        !           637:        System.out.println("");
        !           638:        System.exit(0);
        !           639:       }else if(argv[i].equals("-host")){
        !           640:        host = argv[++i];
        !           641:       }else if(argv[i].equals("-data")){
        !           642:        StreamPort = Integer.valueOf(argv[++i]).intValue();
        !           643:       }else if(argv[i].equals("-control")){
        !           644:        CtrlPort = Integer.valueOf(argv[++i]).intValue();
        !           645:       }else{
        !           646:        System.err.println("unknown option :"+ argv[i]);
        !           647:        System.exit(1);
        !           648:       }
        !           649:     }
        !           650:
        !           651:     try{
        !           652:       asir = new OpenXM(host,CtrlPort,StreamPort);
        !           653:       asir.sendSM(new SM(SM.SM_mathcap));
        !           654:     }catch(UnknownHostException e){
        !           655:       System.err.println("host unknown.");
        !           656:       System.err.println(e.getMessage());
        !           657:       return;
        !           658:     }catch(IOException e){
        !           659:       System.err.println("connection failed.");
        !           660:       System.err.println("IOException occuer !!");
        !           661:       System.err.println(e.getMessage());
        !           662:       return;
        !           663:     }
        !           664:
        !           665:     P.asir = asir;
        !           666:     new Thread(P).start();
        !           667:     System.out.println("start");
        !           668:
        !           669:     try{
        !           670:       //P.value = new Attribute(System.in);
        !           671:
        !           672:       //$B%5!<%PB&$+$iAw?.$5$l$?J8;zNs$r<u?.$7$^$9!#(B
        !           673:       while(true){
        !           674:        CMO obj = P.parse(System.in);
        !           675:        asir.send(obj);
        !           676:        asir.sendSM(new SM(SM.SM_popCMO));
        !           677:       }
        !           678:
        !           679:       //System.out.println("breaking...");
        !           680:
        !           681:     }catch(IOException e){
        !           682:       e.printStackTrace();
        !           683:     }
        !           684:   }
        !           685: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>