Пример #1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="LineScanner"/> class.
 /// </summary>
 public LuaScanner()
 {
     this.lex = new ParaEngine.Tools.Lua.Lexer.Scanner();
     yylval   = lex.yylval;
     yylloc   = lex.yylloc;
     Reset();
 }
Пример #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="LineScanner"/> class.
 /// </summary>
 public LineScanner()
 {
     this.lex = new ParaEngine.Tools.Lua.Lexer.Scanner();
 }
        public override AuthoringScope ParseSource(ParseRequest req)
        {
            PuppetSource source        = (PuppetSource)this.GetSource(req.FileName);
            bool         yyparseResult = false;

            // req.DirtySpan seems to be set even though no changes have occurred
            // source.IsDirty also behaves strangely
            // might be possible to use source.ChangeCount to sync instead

            if (req.Sink.Reason == ParseReason.Check || req.DirtySpan.iStartIndex != req.DirtySpan.iEndIndex ||
                req.DirtySpan.iStartLine != req.DirtySpan.iEndLine)
            {
                Puppet.Parser.ErrorHandler handler = new Parser.ErrorHandler();
                Puppet.Lexer.Scanner       scanner = new Lexer.Scanner(); // string interface
                Parser.Parser parser = new PuppetParser();                // use noarg constructor

                parser.scanner  = scanner;
                scanner.Handler = handler;
                parser.SetHandler(handler);
                scanner.SetSource(req.Text, 0);

                parser.MBWInit(req);
                yyparseResult = parser.Parse();

                // store the parse results
                // source.ParseResult = aast;
                source.ParseResult = null;
                source.Braces      = parser.Braces;

                // for the time being, just pull errors back from the error handler
                if (handler.ErrNum > 0)
                {
                    foreach (Parser.Error error in handler.SortedErrorList())
                    {
                        var span = new TextSpan();
                        span.iStartLine  = span.iEndLine = error.line - 1;
                        span.iStartIndex = error.column;
                        span.iEndIndex   = error.column + error.length;
                        req.Sink.AddError(req.FileName, error.message, span, Severity.Error);
                    }
                }
            }

            switch (req.Reason)
            {
            case ParseReason.Check:
            case ParseReason.HighlightBraces:
            case ParseReason.MatchBraces:
            case ParseReason.MemberSelectAndHighlightBraces:
                int indexOfCaret = source.GetPositionOfLineIndex(req.Line, req.Col);
                if (source.Braces != null)
                {
                    foreach (TextSpan[] brace in source.Braces)
                    {
                        if (brace.Length == 2)
                        {
                            req.Sink.MatchPair(brace[0], brace[1], 1);
                        }
                        else if (brace.Length >= 3)
                        {
                            req.Sink.MatchTriple(brace[0], brace[1], brace[2], 1);
                        }
                    }
                }
                break;

            case ParseReason.QuickInfo:
                return(new PuppetAuthoringScope(this.GetSource(req.FileName)));

            default:
                break;
            }

            return(new PuppetAuthoringScope(source.ParseResult));
        }