Comments (4)
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.
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.
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.
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)
- Java port-> NPE happen when followSets contains FollowSetWithPath with null following member HOT 1
- Class extends value undefined is not a constructor or null when using yarn pnp and typescript4 HOT 1
- Infinite loop in processRule()
- Port for Antlr4 runtime HOT 2
- Simple expression parser tests fail when executing out-of-order HOT 3
- About Typescript Runtime (antlr4s) HOT 3
- Candidate token's follow TokenList is inaccurate when the candidate's origin is ambiguous HOT 1
- nameless ScopedSymbol problem HOT 2
- [Question] Antlr-c3 with antlr4-ng runtime, issue with parser.getVocabulary() HOT 2
- How to use with plain JavaScript? HOT 2
- CodeCompleteCore constructor now references getVocabulary is this correct or should it be vocabulary HOT 2
- function to convert editor cursor position to token position HOT 1
- Symbol Tabel HOT 3
- About using esbuild to building HOT 3
- the library ist going to infinity loop HOT 1
- [Bug]: Unexpected behaviour in getAllSymbolsSync of ScopeSymbol
- Add command to esbuild HOT 2
- Autocompleting empty string causes error HOT 1
- Add .cjs output to package HOT 1
- Option to choose the parser rule for which we need the candidates HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from antlr4-c3.