public ShaderLabParser([NotNull] ILexer <int> lexer, CommonIdentifierIntern intern)
        {
            myOriginalLexer = lexer;
            myIntern        = intern;

            // Create the pre-processor elements, using the unfiltered lexer, so we'll see the
            // preprocessor tokens!
            SetLexer(myOriginalLexer);
            myPreProcessor = new ShaderLabPreProcessor();
            myPreProcessor.Run(myOriginalLexer, this, new SeldomInterruptChecker());

            // Reset the lexer to the beginning, and use the filtered lexer. Pass in the
            // preprocessor, so we can filter on CG_CONTENT and CG_END when they're used
            // for include blocks (they're not filtered tokens normally)
            SetLexer(new ShaderLabFilteringLexer(lexer, myPreProcessor));
        }
        public static void Run(TreeElement node, ILexer lexer, ITokenOffsetProvider offsetProvider, ShaderLabPreProcessor preProcessor, SeldomInterruptChecker interruptChecker, ITokenIntern intern)
        {
            Assertion.Assert(node.parent == null, "node.parent == null");

            var root = node as CompositeElement;

            if (root == null)
            {
                return;
            }

            // Append an EOF token so we insert filtered tokens right up to
            // the end of the file
            var eof = new EofToken(lexer.Buffer.Length);

            root.AppendNewChild(eof);

            var inserter = new ShaderLabMissingTokensInserter(lexer, offsetProvider, preProcessor, interruptChecker, intern);

            // Reset the lexer, walk the tree and call ProcessLeafElement on each leaf element
            lexer.Start();
            inserter.Run(root);

            root.DeleteChildRange(eof, eof);
        }
 private ShaderLabMissingTokensInserter(ILexer lexer, ITokenOffsetProvider offsetProvider, ShaderLabPreProcessor preProcessor, SeldomInterruptChecker interruptChecker, ITokenIntern intern)
     : base(offsetProvider, interruptChecker, intern)
 {
     myLexer        = lexer;
     myPreProcessor = preProcessor;
 }
 public ShaderLabFilteringLexer(ILexer lexer, [CanBeNull] ShaderLabPreProcessor preProcessor)
     : base(lexer)
 {
     myPreProcessor = preProcessor;
 }