示例#1
0
        internal static IDeclCmd?VisitDeclCmd(VCDLexer lexer, IDToVarDef idToVariable, Stack <Scope> scopes)
        {
            ReadOnlySpan <byte> declWord = lexer.NextWord();
            Span <char>         chars    = stackalloc char[declWord.Length];

            declWord.CopyToCharArray(chars);

            ReadOnlySpan <byte> endToken   = new byte[] { (byte)'$', (byte)'e', (byte)'n', (byte)'d' };
            ReadOnlySpan <byte> dollarSign = new byte[] { (byte)'$' };

            if (chars.SequenceEqual("$comment"))
            {
                string text = lexer.NextUntil(endToken).ToCharString();

                lexer.ExpectNextWord(endToken);
                return(new Comment(text));
            }
            else if (chars.SequenceEqual("$date"))
            {
                string text = lexer.NextUntil(endToken).ToCharString();

                lexer.ExpectNextWord(endToken);
                return(new Date(text));
            }
            else if (chars.SequenceEqual("$scope"))
            {
                ScopeType type = VisitScopeType(lexer);
                string    id   = lexer.NextWord().ToCharString();

                Scope scope = new Scope(type, id);
                scopes.Push(scope);

                lexer.ExpectNextWord(endToken);
                return(scope);
            }
            else if (chars.SequenceEqual("$timescale"))
            {
                int      scale = VisitTimeNumber(lexer);
                TimeUnit unit  = VisitTimeUnit(lexer);

                lexer.ExpectNextWord(endToken);
                return(new TimeScale(scale, unit));
            }
            else if (chars.SequenceEqual("$upscope"))
            {
                scopes.Pop();

                lexer.ExpectNextWord(endToken);
                return(new UpScope());
            }
            else if (chars.SequenceEqual("$var"))
            {
                VarType type      = VisitVarType(lexer);
                int     size      = VisitSize(lexer);
                string  id        = lexer.NextWord().ToCharString();
                string  reference = lexer.NextWord().ToCharString();

                VarDef variable = new VarDef(type, size, id, reference, scopes.Reverse().ToArray());
                idToVariable.AddVariable(variable);

                //Skip this stuff because it's not currently supported
                char nextChar = lexer.PeekNextChar();
                if (nextChar == '[')
                {
                    ReadOnlySpan <byte> endBracket = new byte[] { (byte)']' };
                    lexer.NextUntil(endBracket);
                    lexer.SkipChar();
                }

                lexer.ExpectNextWord(endToken);
                return(variable);
            }
            else if (chars.SequenceEqual("$version"))
            {
                string versionTxt       = lexer.NextUntil(dollarSign).ToCharString();
                string systemTaskString = string.Empty;

                ReadOnlySpan <byte> systemTask = lexer.PeekNextWord().Span;
                if (systemTask.StartsWith(dollarSign) && !systemTask.SequenceEqual(endToken))
                {
                    lexer.SkipWord(systemTask);
                    systemTaskString = systemTask.ToCharString();
                }

                lexer.ExpectNextWord(endToken);
                return(new Version(versionTxt, systemTaskString));
            }
            else if (chars.SequenceEqual("$enddefinitions"))
            {
                lexer.ExpectNextWord(endToken);
                return(null);
            }
            else
            {
                throw new Exception($"Invalid declaration command: {declWord.ToCharString()}\nBuffer: {lexer.BufferToString()}");
            }
        }