コード例 #1
0
        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);
        }