Exemplo n.º 1
0
        public HlslLexer(SourceFile file, HlslParseOptions options = null, IIncludeFileSystem includeFileSystem = null)
        {
            _rootFile = file;

            _includeFileResolver = new IncludeFileResolver(
                includeFileSystem ?? new DummyFileSystem(),
                options ?? new HlslParseOptions());

            _directives = DirectiveStack.Empty;

            if (options != null)
            {
                foreach (var define in options.PreprocessorDefines)
                {
                    var lexer = new HlslLexer(new SourceFile(
                                                  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);
                }
            }

            ExpandMacros = true;

            FileSegments  = new List <FileSegment>();
            _includeStack = new Stack <IncludeContext>();
            PushIncludeContext(file);
        }
Exemplo n.º 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);
        }
Exemplo n.º 3
0
 public DirectiveParser(HlslLexer lexer, DirectiveStack directiveStack)
     : base(lexer, LexerMode.Directive)
 {
     _lexer          = lexer;
     _directiveStack = directiveStack;
 }