상속: HlslParser
예제 #1
0
        public HlslLexer(SourceText text, ParserOptions options = null, IIncludeFileSystem includeFileSystem = null)
        {
            _includeFileResolver = new IncludeFileResolver(includeFileSystem ?? new DummyFileSystem());
            _directives          = DirectiveStack.Empty;

            if (options != null)
            {
                foreach (var define in options.PreprocessorDefines)
                {
                    var lexer = new HlslLexer(
                        SourceText.From($"#define {define.Key} {define.Value}",
                                        "__ConfiguredPreprocessorDefinitions__.hlsl"));
                    lexer._mode        = LexerMode.Directive;
                    lexer.ExpandMacros = false;

                    var dp        = new DirectiveParser(lexer, _directives);
                    var directive = dp.ParseDirective(true, true, false);
                    _directives = directive.ApplyDirectives(_directives);
                }
            }

            _options = options ?? new ParserOptions();

            ExpandMacros = true;

            _rootText = text;

            FileSegments  = new List <FileSegment>();
            _includeStack = new Stack <IncludeContext>();
            PushIncludeContext(text);
        }
예제 #2
0
        private SyntaxNode LexSingleDirective(
            bool isActive,
            bool endIsActive,
            bool afterNonWhitespaceOnLine,
            List <SyntaxNode> triviaList)
        {
            _start = _charReader.Position;

            if (char.IsWhiteSpace(_charReader.Current))
            {
                ReadWhitespace();
                AddTrivia(triviaList, SyntaxKind.WhitespaceTrivia);
            }

            var saveMode         = _mode;
            var saveExpandMacros = ExpandMacros;

            _mode        = LexerMode.Directive;
            ExpandMacros = false;

            var dp        = new DirectiveParser(this, _directives);
            var directive = dp.ParseDirective(isActive, endIsActive, afterNonWhitespaceOnLine);

            if (!isActive || directive.Kind != SyntaxKind.IncludeDirectiveTrivia)
            {
                triviaList.Add(directive);
            }

            _directives  = directive.ApplyDirectives(_directives);
            ExpandMacros = saveExpandMacros;
            _mode        = saveMode;

            // Directive parser sometimes leaves charReader at start of token *after* the one we want.
            _charReader.Reset(directive.GetLastChildToken().GetLastSpanIncludingTrivia().End);
            _start = _charReader.Position;

            return(directive);
        }
예제 #3
0
        private SyntaxNode LexSingleDirective(
            bool isActive,
            bool endIsActive,
            bool afterNonWhitespaceOnLine,
            List<SyntaxNode> triviaList)
        {
            _start = _charReader.Position;

            if (char.IsWhiteSpace(_charReader.Current))
            {
                ReadWhitespace();
                AddTrivia(triviaList, SyntaxKind.WhitespaceTrivia);
            }

            var saveMode = _mode;
            var saveExpandMacros = ExpandMacros;

            _mode = LexerMode.Directive;
            ExpandMacros = false;

            var dp = new DirectiveParser(this, _directives);
            var directive = dp.ParseDirective(isActive, endIsActive, afterNonWhitespaceOnLine);

            if (!isActive || directive.Kind != SyntaxKind.IncludeDirectiveTrivia)
                triviaList.Add(directive);

            _directives = directive.ApplyDirectives(_directives);
            ExpandMacros = saveExpandMacros;
            _mode = saveMode;

            // Directive parser sometimes leaves charReader at start of token *after* the one we want.
            _charReader.Reset(directive.GetLastChildToken().GetLastSpanIncludingTrivia().End);
            _start = _charReader.Position;

            return directive;
        }