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; }