public bool advance(Block preblock, Block curblock) { tok = TokenType.TXT; if (Src.Length == 0 && curblock.isLineHeadCmt == 1) { curblock.mRule = preblock.mRule; tok = TokenType.MultiLineAllLine; isNextLine = true; return(true); } int c = reader.read(); if (c == -1) { tok = TokenType.EOS; return(false); } switch (c) { case ' ': case 0x3000: case '\t': break; default: if (curblock.isLineHeadCmt == 0) //0: 行頭がブロックコメントの内部ではない { if (Char.IsDigit((char)c)) { reader.unread(); lexDigit(); break; } else if (Util.isIdentifierPart((char)c)) { reader.unread(); lexKeyWord(); break; } else { reader.unread(); lexSymbol(curblock); break; } } else //1: 行頭がブロックコメントの内部 { if (Offset - 1 == 0) { int index; if ((index = Src.IndexOf(preblock.mRule.end, 0)) >= 0) { string end = preblock.mRule.end; var rule = multiRuleEndDic[end]; if (rule.Detected(end, reader)) { curblock.mRule = rule; tok = TokenType.MultiLineEnd; //int len = rule.getLen(end, reader); int len = index + end.Length; reader.setoffset(len); OffsetLenAttr = new Tuple <int, int, Rule>(0, len, rule); return(true); } } else if (multiRuleDic.ContainsKey(preblock.mRule.start)) { var rule = multiRuleDic[preblock.mRule.start]; curblock.mRule = preblock.mRule; tok = TokenType.MultiLineAllLine; OffsetLenAttr = new Tuple <int, int, Rule>(0, Src.Length, rule); reader.setoffset(Src.Length); return(true); } //{ // reader.unread(); // StringBuilder buf = new StringBuilder(); // while (true) { // c = reader.read(); // if (c == -1) { // break; // } // buf.Append((char)c); // string s = buf.ToString(); // string end = preblock.mRule.end; // if (s.EndsWith(end)) { // if (multiRuleEndDic.ContainsKey(end)) { // var rule = multiRuleEndDic[end]; // if (rule.Detected(end, reader)) { // curblock.mRule = rule; // //isNextLine = false; // //tok = rule.token; // tok = TokenType.MultiLineEnd; // int len = rule.getLen(end, reader); // reader.setoffset(len); // OffsetLenAttr = new Tuple<int, int, Rule>(0, len, rule); // //break; // return true; // } // } // } // } // if (c == -1 && preblock.mRule != null && multiRuleDic.ContainsKey(preblock.mRule.start)) { // var enelem = multiRuleDic[preblock.mRule.start]; // curblock.mRule = preblock.mRule; // //isNextLine = true; // //tok = TokenType.MultiLineStart; // tok = TokenType.MultiLineAllLine; // OffsetLenAttr = new Tuple<int, int, Rule>(0, Src.Length, enelem); // reader.setoffset(Src.Length); // } // break; //} } else { if (Char.IsDigit((char)c)) { reader.unread(); lexDigit(); } else if (Util.isIdentifierPart((char)c)) { reader.unread(); lexKeyWord(); } else { reader.unread(); lexSymbol(curblock); } } } break; } return(true); }
public bool advance(Block preblock, Block curblock) { tok = TokenType.TXT; if (Src.Length == 0 && curblock.isLineHeadCmt == 1) { curblock.mRule = preblock.mRule; isNextLine = true; } if (Src.Length == 0 && curblock.isLineHeadPart == 1) { curblock.PartID = preblock.PartID; scisNextLine = true; } int c = reader.read(); if (c == -1) { tok = TokenType.EOS; return(false); } switch (c) { case ' ': case 0x3000: case '\t': break; default: //TODO test if (curblock.isLineHeadCmt == 0) { if (curblock.isLineHeadPart == 0) { if (paruleStartKeys.Contains((char)c)) { char fc = (char)c; foreach (var item in partRuleDic) { 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) { tok = TokenType.PartitionStart; if (curblock != null) { curblock.PartID = item.Value.id; scisNextLine = true; } reader.setoffset(Offset + text.Length); return(true); } } } } } } 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 (partRuleEndDic.ContainsKey(buf.ToString())) { if (preblock.PartID == partRuleEndDic[buf.ToString()].id) { var Eenelem = partRuleEndDic[buf.ToString()]; tok = TokenType.PartitionEnd; curblock.PartID = Eenelem.id; scisNextLine = false; reader.setoffset(Offset + buf.ToString().Length); return(true); } } c = reader.read(); } } c = reader.read(); } //Finish: if (c == -1) { tok = TokenType.Partition; curblock.PartID = preblock.PartID; scisNextLine = true; } reader.setoffset(0); c = reader.read(); } else if (paruleStartKeys.Contains((char)c)) { char fc = (char)c; foreach (var item in partRuleDic) { 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) { tok = TokenType.PartitionStart; if (curblock != null) { curblock.PartID = item.Key; scisNextLine = true; } reader.setoffset(Offset + text.Length); //break; return(true); } } } } } } } if (curblock.isLineHeadCmt == 0) //0: 行頭がブロックコメントの内部ではない { if (Char.IsDigit((char)c)) { reader.unread(); lexDigit(); break; } else if (Util.isIdentifierPart((char)c)) { reader.unread(); lexKeyWord(); break; } else { reader.unread(); lexSymbol(curblock); break; } } else //1: 行頭がブロックコメントの内部 { if (Offset - 1 == 0) { reader.unread(); StringBuilder buf = new StringBuilder(); while (true) { c = reader.read(); if (c == -1) { break; } buf.Append((char)c); string s = buf.ToString(); string end = preblock.mRule.end; if (s.EndsWith(end)) { if (multiRuleEndDic.ContainsKey(end)) { var rule = multiRuleEndDic[end]; if (rule.Detected(end, reader)) { curblock.mRule = rule; //isNextLine = false; tok = rule.token; int len = rule.getLen(end, reader); reader.setoffset(len); OffsetLenAttr = new Tuple <int, int, Attribute>(0, len, rule.attr); //break; return(true); } } } } if (c == -1 && preblock.mRule != null && multiRuleDic.ContainsKey(preblock.mRule.start)) { var enelem = multiRuleDic[preblock.mRule.start]; curblock.mRule = preblock.mRule; tok = TokenType.MultiLineStart; OffsetLenAttr = new Tuple <int, int, Attribute>(0, Src.Length, enelem.attr); reader.setoffset(Src.Length); } break; } else { if (Char.IsDigit((char)c)) { reader.unread(); lexDigit(); } else if (Util.isIdentifierPart((char)c)) { reader.unread(); lexKeyWord(); } else { reader.unread(); lexSymbol(curblock); } } } break; } return(true); }