예제 #1
0
 public void Error(TokeniserState state)
 {
     if (_errors.CanAddError)
     {
         _errors.Add(new ParseError(_reader.Position, "Unexpected character '{0}' in input state [{1}]", _reader.Current(), state));
     }
 }
예제 #2
0
 public void EofError(TokeniserState state)
 {
     if (_errors.CanAddError)
     {
         _errors.Add(new ParseError(_reader.Position, "Unexpectedly reached end of file (EOF) in input state [{0}]", state));
     }
 }
예제 #3
0
파일: Tokeniser.cs 프로젝트: wushian/dcsoup
 internal void EofError(TokeniserState state)
 {
     if (errors.CanAddError)
     {
         errors.Add(new ParseError(reader.Pos(), "Unexpectedly reached end of file (EOF) in input state [{0}]", state.Name()));
     }
 }
예제 #4
0
파일: Tokeniser.cs 프로젝트: wushian/dcsoup
 internal void Error(TokeniserState state)
 {
     if (errors.CanAddError)
     {
         errors.Add(new ParseError(reader.Pos(), "Unexpected character '{0}' in input state [{1}]", reader.Current(), state.Name()));
     }
 }
예제 #5
0
 internal void Error(TokeniserState state)
 {
     if (errors.CanAddError())
     {
         errors.Add(new ParseError(reader.Pos(), "Unexpected character " + PortUtil.EscapedSingleBracket + "{0}" +
                                   PortUtil.EscapedSingleBracket + " in input state [{}]", reader.Current(), state));
     }
 }
예제 #6
0
        public static IEnumerable <(Token, object)> Tokenise(string template)
        {
            if (template == null)
            {
                yield break;
            }
            StringBuilder  sb    = new StringBuilder();
            TokeniserState state = TokeniserState.Neutral;

            foreach (var c in template)
            {
                switch (state)
                {
                case TokeniserState.Neutral:
                    switch (c)
                    {
                    case '%':
                        if (sb.Length > 0)
                        {
                            yield return(Token.Text, sb.ToString());

                            sb.Clear();
                        }
                        state = TokeniserState.InPercentage;
                        break;

                    case '{':
                        if (sb.Length > 0)
                        {
                            yield return(Token.Text, sb.ToString());

                            sb.Clear();
                        }
                        state = TokeniserState.InBraces;
                        break;

                    case '^':
                        if (sb.Length > 0)
                        {
                            yield return(Token.Text, sb.ToString());

                            sb.Clear();
                        }
                        yield return(Token.NewLine, null);

                        break;

                    default: sb.Append(c); break;
                    }
                    break;

                case TokeniserState.InBraces:
                    switch (c)
                    {
                    case '}':
                        var inner = sb.ToString().Trim();
                        switch (inner)
                        {
                        case "HE": yield return(Token.He, null); break;

                        case "HIM": yield return(Token.Him, null); break;

                        case "HIS": yield return(Token.His, null); break;

                        case "ME": yield return(Token.Me, null); break;

                        case "CLAS": yield return(Token.Class, null); break;

                        case "RACE": yield return(Token.Race, null); break;

                        case "SEXC": yield return(Token.Sex, null); break;

                        case "NAME": yield return(Token.Name, null); break;

                        case "DAMG": yield return(Token.Damage, null); break;

                        case "PRIC": yield return(Token.Price, null); break;

                        case "COMB": yield return(Token.Combatant, null); break;

                        case "INVE": yield return(Token.Inventory, null); break;

                        case "SUBJ": yield return(Token.Subject, null); break;

                        case "VICT": yield return(Token.Victim, null); break;

                        case "WEAP": yield return(Token.Weapon, null); break;

                        case "LEAD": yield return(Token.Leader, null); break;

                        case "BIG": yield return(Token.Big, null); break;

                        case "FAT": yield return(Token.Fat, null); break;

                        case "LEFT": yield return(Token.Left, null); break;

                        case "CNTR": yield return(Token.Centre, null); break;

                        case "JUST": yield return(Token.Justify, null); break;

                        case "FAHI": yield return(Token.FatHigh, null); break;

                        case "HIGH": yield return(Token.High, null); break;

                        case "NORS": yield return(Token.NormalSize, null); break;

                        case "TECF": yield return(Token.Tecf, null); break;

                        case "UNKN": yield return(Token.Unknown, null); break;

                        default:
                            if (inner.StartsWith("BLOK", StringComparison.Ordinal))
                            {
                                var number = int.Parse(inner.Substring(4), CultureInfo.InvariantCulture);
                                yield return(Token.Block, number);
                            }
                            else if (inner.StartsWith("INK ", StringComparison.Ordinal))
                            {
                                var number = int.Parse(inner.Substring(4), CultureInfo.InvariantCulture);
                                yield return(Token.Ink, number);
                            }
                            else if (inner.StartsWith("WORD", StringComparison.Ordinal))
                            {
                                var word = inner.Substring(4);
                                yield return(Token.Word, word);
                            }
                            break;
                        }

                        state = TokeniserState.Neutral;
                        sb.Clear();
                        break;

                    default: sb.Append(c); break;
                    }

                    break;

                case TokeniserState.InPercentage:
                    switch (c)
                    {
                    case '%':
                        yield return(Token.Text, "%");

                        state = TokeniserState.Neutral;
                        sb.Clear();
                        break;

                    case 'l':
                        sb.Append(c);
                        break;

                    case 's':
                    case 'd':
                    case 'u':
                        sb.Append(c);
                        yield return(Token.Parameter, sb.ToString());

                        state = TokeniserState.Neutral;
                        sb.Clear();
                        break;

                    default:
                        yield return(Token.Text, "%" + c);

                        state = TokeniserState.Neutral;
                        sb.Clear();
                        break;
                    }
                    break;
                }
            }

            if (sb.Length > 0)
            {
                yield return(Token.Text, sb.ToString());

                sb.Clear();
            }
        }
예제 #7
0
 public void AdvanceTransition(TokeniserState state)
 {
     _reader.Advance();
     this._state = state;
 }
예제 #8
0
 public void Transition(TokeniserState state)
 {
     this._state = state;
 }
예제 #9
0
 internal void AdvanceTransition(TokeniserState state)
 {
     reader.Advance();
     this.state = state;
 }
예제 #10
0
 internal void Transition(TokeniserState state)
 {
     this.state = state;
 }
예제 #11
0
        private static void HandleDataDoubleEscapeTag(Tokeniser t, CharacterReader r, TokeniserState primary, TokeniserState fallback)
        {
            if (r.MatchesLetter())
            {
                string name = r.ConsumeLetterSequence();
                t.dataBuffer.Append(name.ToLower());
                t.Emit(name);
                return;
            }
            char c = r.Consume();
            switch (c)
            {
                case '\t':
                case '\n':
                case '\r':
                case '\f':
                case ' ':
                case '/':
                case '>':
                {
                    if (t.dataBuffer.ToString().Equals("script"))
                    {
                        t.Transition(primary);
                    }
                    else
                    {
                        t.Transition(fallback);
                    }
                    t.Emit(c);
                    break;
                }

                default:
                {
                    r.Unconsume();
                    t.Transition(fallback);
                    break;
                }
            }
        }
예제 #12
0
        /// <summary>
        /// Handles RawtextEndTagName, ScriptDataEndTagName, and ScriptDataEscapedEndTagName.
        /// </summary>
        /// <remarks>
        /// Handles RawtextEndTagName, ScriptDataEndTagName, and ScriptDataEscapedEndTagName. Same body impl, just
        /// different else exit transitions.
        /// </remarks>
        private static void HandleDataEndTag(Tokeniser t, CharacterReader r, TokeniserState elseTransition)
        {
            if (r.MatchesLetter())
            {
                string name = r.ConsumeLetterSequence();
                t.tagPending.AppendTagName(name.ToLower());
                t.dataBuffer.Append(name);
                return;
            }
            bool needsExitTransition = false;
            if (t.IsAppropriateEndTagToken() && !r.IsEmpty())
            {
                char c = r.Consume();
                switch (c)
                {
                    case '\t':
                    case '\n':
                    case '\r':
                    case '\f':
                    case ' ':
                    {
                        t.Transition(BeforeAttributeName);
                        break;
                    }

                    case '/':
                    {
                        t.Transition(SelfClosingStartTag);
                        break;
                    }

                    case '>':
                    {
                        t.EmitTagPending();
                        t.Transition(Data);
                        break;
                    }

                    default:
                    {
                        t.dataBuffer.Append(c);
                        needsExitTransition = true;
                        break;
                    }
                }
            }
            else
            {
                needsExitTransition = true;
            }
            if (needsExitTransition)
            {
                t.Emit("</" + t.dataBuffer.ToString());
                t.Transition(elseTransition);
            }
        }