public bool advance2(Block preblock, Block curblock) { tok = TokenType.TXT; if (Src.Length == 0 && curblock.isLineHeadCmt == 1) { curblock.elem = preblock.elem; isNextLine = true; } if (Src.Length == 0 && curblock.scisLineHeadCmt == 1) { curblock.id = preblock.id; scisNextLine = true; } int c = reader.read(); if (c == -1) { tok = TokenType.EOS; return(false); } switch (c) { case ' ': case 0x3000: case '\t': default: //TODO test if (curblock.isLineHeadCmt == 0) // && preblock.elem == curblock.elem) { { if (curblock.scisLineHeadCmt == 0) { if (paruleStartKeys.Contains((char)c)) { char fc = (char)c; foreach (var item in scanRuleDic) { if (item.Key[0] == fc) { var len = item.Value.start.Length; if (Offset - 1 + len <= Src.Length) { var text = Src.Substring(Offset - 1, len); if (text.ToString() == item.Key) { //reader.unread(); //lexSymbol(curblock); tok = TokenType.PartitionStart; if (curblock != null) { curblock.id = item.Value.id; scisNextLine = true; } reader.setoffset(Offset + text.Length); return(true); break; } } } } } } else { if (Offset - 1 == 0) { while (c != -1) { if (paruleStartKeys.Contains((char)c)) { StringBuilder buf = new StringBuilder(); while (c != -1) { buf.Append((char)c); if (scanEndRuleDic.ContainsKey(buf.ToString())) { if (preblock.id == scanEndRuleDic[buf.ToString()].id) { var Eenelem = scanEndRuleDic[buf.ToString()]; tok = TokenType.PartitionEnd; //resultRule = Eenelem; curblock.id = Eenelem.id; scisNextLine = false; reader.setoffset(Offset + buf.ToString().Length); return(true); goto Finish; } } c = reader.read(); } } c = reader.read(); } Finish: if (c == -1) { //var enelem = ruleDic[preblock.elem.start]; //reader.setoffset(Src.Length); //enelem.startIndex = 0; //enelem.len = Src.Length; tok = TokenType.Partition; //resultRule = enelem; curblock.id = preblock.id; scisNextLine = true; } reader.setoffset(0); c = reader.read(); //return true; //break; } else if (paruleStartKeys.Contains((char)c)) { char fc = (char)c; foreach (var item in scanRuleDic) { if (item.Key[0] == fc) { var len = item.Value.start.Length; if (Offset - 1 + len <= Src.Length) { var text = Src.Substring(Offset - 1, len); if (text.ToString() == item.Key) { //reader.unread(); //lexSymbol(curblock); tok = TokenType.PartitionStart; if (curblock != null) { curblock.id = item.Key; scisNextLine = true; } //return true; break; } } } } } } } if (curblock.isLineHeadCmt == 0) //0: 行頭がブロックコメントの内部ではない { if (Char.IsDigit((char)c)) { reader.unread(); lexDigit(); } else if (Util.isIdentifierPart((char)c)) { reader.unread(); lexKeyWord(); } else if (ruleFirstKeys.Contains((char)c)) { char fc = (char)c; foreach (var item in ruleDic) { if (item.Key[0] == fc) { var len = item.Value.start.Length; if (Offset - 1 + len <= Src.Length) { var text = Src.Substring(Offset - 1, len); if (text.ToString() == item.Key) { reader.unread(); lexSymbol(curblock); break; } } } } } else { tok = TokenType.TXT; } } else //1: 行頭がブロックコメントの内部 { if (Offset - 1 == 0) // && preblock.elem != null) { { while (c != -1) { if (ruleEndKeys.Contains((char)c)) { StringBuilder buf = new StringBuilder(); while (c != -1) { buf.Append((char)c); if (preblock.elem.end == buf.ToString()) { if (multiruleDic.ContainsKey(buf.ToString())) { var Eenelem = multiruleDic[buf.ToString()]; Eenelem.startIndex = 0; Eenelem.len = (Offset - Eenelem.startIndex); tok = Eenelem.token; resultRule = Eenelem; curblock.elem = Eenelem; isNextLine = false; goto Finish; } } c = reader.read(); } } c = reader.read(); } Finish: if (c == -1 && preblock.elem != null && ruleDic.ContainsKey(preblock.elem.start)) { var enelem = ruleDic[preblock.elem.start]; reader.setoffset(Src.Length); enelem.startIndex = 0; enelem.len = Src.Length; tok = enelem.token; resultRule = enelem; curblock.elem = preblock.elem; isNextLine = true; } } else { if (Char.IsDigit((char)c)) { reader.unread(); lexDigit(); } else if (Util.isIdentifierPart((char)c)) { reader.unread(); lexKeyWord(); } else if (ruleFirstKeys.Contains((char)c)) { char fc = (char)c; foreach (var item in ruleDic) { if (item.Key[0] == fc) { var len = item.Value.start.Length; if (Offset - 1 + len <= Src.Length) { var text = Src.Substring(Offset - 1, len); if (text.ToString() == item.Key) { reader.unread(); lexSymbol(curblock); break; } } } } } else { tok = TokenType.TXT; } } } break; } return(true); }