Giter Club home page Giter Club logo

Comments (4)

mike-lischke avatar mike-lischke commented on June 19, 2024

Just from description I would guess that your input stream is too small for the given seek index. Can't imagine any other reason why the seek call could fail. So, check the caretTokenIndex you specify in the call to collectCandidates.

from antlr4-c3.

AlexGustafsson avatar AlexGustafsson commented on June 19, 2024

That does not seem to be the case as the length of the input does not seem to matter, also, the caretTokenIndex does not seem to affect any of the seeks.

I've tried to debug a bit further and found this.

export function collectCandidates(caretTokenIndex, context) {
    this.shortcutMap.clear();
    this.candidates.rules.clear();
    this.candidates.tokens.clear();
    this.statesProcessed = 0;
    this.precedenceStack = [];
    this.tokenStartIndex = context ? context.start.tokenIndex : 0;
    let tokenStream = this.parser.inputStream;
    let currentIndex = tokenStream.index; // <-- This is -1 the first iteration
    tokenStream.seek(this.tokenStartIndex); // <-- This call works (tokenStartIndex is 0)
    this.tokens = [];
    let offset = 1;
    while (true) {
        let token = tokenStream.LT(offset++);
        this.tokens.push(token.type);
        if (token.tokenIndex >= caretTokenIndex || token.type == Token.EOF)
            break;
    }
    tokenStream.seek(currentIndex); // <-- This call fails as currentIndex is -1
    // ...

Basically, the inputStream never seems to have a valid index.

I'm not sure as to why this happens, a race condition seems unlikely due to the synchronous nature of JavaScript, but who nows. If I try to get the index of the tokenStream just before the seek, it actually returns 0 instead of -1.

I tried to change the last seek to ignore negative indices, tokenStream.seek(Math.max(currentIndex, 0)), which allows all tests to pass whilst still seemingly work correctly for me. I think it is a bit naive to think that the change causes no issues further down the line, but I don't know enough about this plugin to be sure if it's really an issue.

        let currentIndex = tokenStream.index;
        tokenStream.seek(this.tokenStartIndex);
        this.tokens = [];
        let offset = 1;
        while (true) {
            let token = tokenStream.LT(offset++);
            this.tokens.push(token.type);
            if (token.tokenIndex >= caretTokenIndex || token.type == Token.EOF)
                break;
        }
        tokenStream.seek(Math.max(currentIndex, 0)); // <-- Math.max()

Moving the currentIndex definition to right before the tokenStream.seek call also works:

        tokenStream.seek(this.tokenStartIndex);
        this.tokens = [];
        let offset = 1;
        while (true) {
            let token = tokenStream.LT(offset++);
            this.tokens.push(token.type);
            if (token.tokenIndex >= caretTokenIndex || token.type == Token.EOF)
                break;
        }
        let currentIndex = tokenStream.index; // <-- Moved index here
        tokenStream.seek(currentIndex);

from antlr4-c3.

mike-lischke avatar mike-lischke commented on June 19, 2024

I believe I never tested with a cold token stream, which never had read anything. That's why I never saw the -1 token stream index. IMO this is just a marker to denote that nothing has ever been consumed by this stream. This in turns means there's no index that must be restored after the candidate collection ran.

This restoration of the current index is just a convenient feature so that the caller doesn't have to do that (if the caller code relies somehow on the current index). I think it's save not to restore the current stream index if that was -1.

from antlr4-c3.

mtriff avatar mtriff commented on June 19, 2024

I also ran into this issue, due to a cold token stream.

I think defaulting currentIndex to 0 if tokenStream.index is -1 should be the easy fix. I don't see any negative repercussions to that.

from antlr4-c3.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.