More debugging

This commit is contained in:
Peter Boyer 2015-12-29 12:34:26 -06:00
parent c08a19233c
commit 56e6e6c26f
16 changed files with 81 additions and 28 deletions

View File

@ -13,6 +13,7 @@ package antlr4
import ( import (
"strconv" "strconv"
"fmt"
) )
// bt is just to keep meaningful parameter types to Parser // bt is just to keep meaningful parameter types to Parser
@ -105,10 +106,13 @@ func (bt *BufferedTokenStream) Consume() {
// not yet initialized // not yet initialized
skipEofCheck = false skipEofCheck = false
} }
fmt.Println("Consume 1")
if !skipEofCheck && bt.LA(1) == TokenEOF { if !skipEofCheck && bt.LA(1) == TokenEOF {
panic("cannot consume EOF") panic("cannot consume EOF")
} }
if bt.Sync(bt.index + 1) { if bt.Sync(bt.index + 1) {
fmt.Println("Consume 2")
bt.index = bt.adjustSeekIndex(bt.index + 1) bt.index = bt.adjustSeekIndex(bt.index + 1)
} }
} }
@ -123,6 +127,7 @@ func (bt *BufferedTokenStream) Sync(i int) bool {
var n = i - len(bt.tokens) + 1 // how many more elements we need? var n = i - len(bt.tokens) + 1 // how many more elements we need?
if n > 0 { if n > 0 {
var fetched = bt.fetch(n) var fetched = bt.fetch(n)
fmt.Println("Sync done")
return fetched >= n return fetched >= n
} }
return true return true
@ -139,6 +144,7 @@ func (bt *BufferedTokenStream) fetch(n int) int {
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
var t IToken = bt.tokenSource.nextToken() var t IToken = bt.tokenSource.nextToken()
fmt.Println("fetch loop")
t.SetTokenIndex( len(bt.tokens) ) t.SetTokenIndex( len(bt.tokens) )
bt.tokens = append(bt.tokens, t) bt.tokens = append(bt.tokens, t)
if t.GetTokenType() == TokenEOF { if t.GetTokenType() == TokenEOF {
@ -146,6 +152,8 @@ func (bt *BufferedTokenStream) fetch(n int) int {
return i + 1 return i + 1
} }
} }
fmt.Println("fetch done")
return n return n
} }

View File

@ -58,7 +58,8 @@ func (this *CommonTokenFactory) Create(source *TokenSourceCharStreamPair, ttype
} else if this.copyText && source.charStream != nil { } else if this.copyText && source.charStream != nil {
t.SetText(source.charStream.GetTextFromInterval(NewInterval(start, stop))) t.SetText(source.charStream.GetTextFromInterval(NewInterval(start, stop)))
} }
return t.Token
return t
} }
@ -68,5 +69,5 @@ func (this *CommonTokenFactory) createThin(ttype int, text string) IToken {
var t = NewCommonToken(nil, ttype, TokenDefaultChannel, -1, -1) var t = NewCommonToken(nil, ttype, TokenDefaultChannel, -1, -1)
t.SetText(text) t.SetText(text)
return t.Token return t
} }

View File

@ -19,7 +19,7 @@ type IErrorListener interface {
type DefaultErrorListener struct { type DefaultErrorListener struct {
} }
func NewErrorListener() *DefaultErrorListener { func NewDefaultErrorListener() *DefaultErrorListener {
return new(DefaultErrorListener) return new(DefaultErrorListener)
} }

View File

@ -544,6 +544,8 @@ func (this *DefaultErrorStrategy) getMissingSymbol(recognizer IParser) IToken {
} }
tf := recognizer.GetTokenFactory() tf := recognizer.GetTokenFactory()
fmt.Println("Missing symbol error")
return tf.Create( current.GetSource(), expectedTokenType, tokenText, TokenDefaultChannel, -1, -1, current.GetLine(), current.GetColumn()) return tf.Create( current.GetSource(), expectedTokenType, tokenText, TokenDefaultChannel, -1, -1, current.GetLine(), current.GetColumn())
} }

View File

@ -1,4 +1,5 @@
package antlr4 package antlr4
import "fmt"
type InputStream struct { type InputStream struct {
name string name string
@ -66,6 +67,7 @@ func (is *InputStream) Mark() int {
} }
func (is *InputStream) Release(marker int) { func (is *InputStream) Release(marker int) {
fmt.Println("RELEASING")
} }
func (is *InputStream) Seek(index int) { func (is *InputStream) Seek(index int) {

View File

@ -211,7 +211,10 @@ func (l *Lexer) nextToken() IToken {
if l._type != LexerMore { if l._type != LexerMore {
break break
} }
fmt.Println("lex inner loop")
} }
fmt.Println("lex loop")
if continueOuter { if continueOuter {
continue continue
} }
@ -290,6 +293,7 @@ func (l *Lexer) emitToken(token IToken) {
// custom Token objects or provide a Newfactory. // custom Token objects or provide a Newfactory.
// / // /
func (l *Lexer) emit() IToken { func (l *Lexer) emit() IToken {
fmt.Println("emit")
var t = l._factory.Create(l._tokenFactorySourcePair, l._type, l._text, l._channel, l._tokenStartCharIndex, l.getCharIndex()-1, l._tokenStartLine, l._tokenStartColumn) var t = l._factory.Create(l._tokenFactorySourcePair, l._type, l._text, l._channel, l._tokenStartCharIndex, l.getCharIndex()-1, l._tokenStartLine, l._tokenStartColumn)
l.emitToken(t) l.emitToken(t)
return t return t
@ -298,6 +302,7 @@ func (l *Lexer) emit() IToken {
func (l *Lexer) emitEOF() IToken { func (l *Lexer) emitEOF() IToken {
cpos := l.getCharPositionInLine() cpos := l.getCharPositionInLine()
lpos := l.getLine() lpos := l.getLine()
fmt.Println("emitEOF")
var eof = l._factory.Create(l._tokenFactorySourcePair, TokenEOF, "", TokenDefaultChannel, l._input.Index(), l._input.Index()-1, lpos, cpos) var eof = l._factory.Create(l._tokenFactorySourcePair, TokenEOF, "", TokenDefaultChannel, l._input.Index(), l._input.Index()-1, lpos, cpos)
l.emitToken(eof) l.emitToken(eof)
return eof return eof

View File

@ -107,21 +107,25 @@ func (this *LexerATNSimulator) Match(input CharStream, mode int) int {
fmt.Println("Match") fmt.Println("Match")
this.Match_calls += 1 this.Match_calls += 1
this.mode = mode this.mode = mode
var mark = input.Mark() var mark = input.Mark()
defer func() { defer func() {
fmt.Println("FINALLY")
input.Release(mark) input.Release(mark)
}() }()
this.startIndex = input.Index() this.startIndex = input.Index()
this.prevAccept.reset() this.prevAccept.reset()
var dfa = this.decisionToDFA[mode] var dfa = this.decisionToDFA[mode]
if dfa.s0 == nil { if dfa.s0 == nil {
fmt.Println("MatchATN")
return this.MatchATN(input) return this.MatchATN(input)
} else { } else {
fmt.Println("execATN")
return this.execATN(input, dfa.s0) return this.execATN(input, dfa.s0)
} }
} }
@ -159,16 +163,8 @@ func (this *LexerATNSimulator) MatchATN(input CharStream) int {
return predict return predict
} }
var countA = 0
func (this *LexerATNSimulator) execATN(input CharStream, ds0 *DFAState) int { func (this *LexerATNSimulator) execATN(input CharStream, ds0 *DFAState) int {
countA += 1
if (countA == 2) {
panic("GAH")
}
if LexerATNSimulatorDebug { if LexerATNSimulatorDebug {
fmt.Println("start state closure=" + ds0.configs.String()) fmt.Println("start state closure=" + ds0.configs.String())
} }
@ -228,7 +224,7 @@ func (this *LexerATNSimulator) execATN(input CharStream, ds0 *DFAState) int {
s = target // flip current DFA target becomes Newsrc/from state s = target // flip current DFA target becomes Newsrc/from state
} }
fmt.Println("OUT") fmt.Println("DONE WITH execATN loop")
return this.failOrAccept(this.prevAccept, input, s.configs, t) return this.failOrAccept(this.prevAccept, input, s.configs, t)
} }

View File

@ -125,6 +125,8 @@ func (p *Parser) GetParseListeners() []ParseTreeListener {
// misMatched symbol // misMatched symbol
func (p *Parser) Match(ttype int) IToken { func (p *Parser) Match(ttype int) IToken {
fmt.Println("get current token")
var t = p.getCurrentToken() var t = p.getCurrentToken()
fmt.Println("TOKEN IS " + t.GetText()) fmt.Println("TOKEN IS " + t.GetText())
@ -141,6 +143,9 @@ func (p *Parser) Match(ttype int) IToken {
p._ctx.addErrorNode(t) p._ctx.addErrorNode(t)
} }
} }
fmt.Println("match done")
return t return t
} }
@ -406,7 +411,9 @@ func (p *Parser) NotifyErrorListeners(msg string, offendingToken IToken, err IRe
func (p *Parser) Consume() IToken { func (p *Parser) Consume() IToken {
var o = p.getCurrentToken() var o = p.getCurrentToken()
if o.GetTokenType() != TokenEOF { if o.GetTokenType() != TokenEOF {
fmt.Println("Consuming")
p.GetInputStream().Consume() p.GetInputStream().Consume()
fmt.Println("Done consuming")
} }
var hasListener = p._parseListeners != nil && len(p._parseListeners) > 0 var hasListener = p._parseListeners != nil && len(p._parseListeners) > 0
if p.BuildParseTrees || hasListener { if p.BuildParseTrees || hasListener {

View File

@ -98,15 +98,6 @@ func (this *Token) GetSource() *TokenSourceCharStreamPair{
return this.source return this.source
} }
func (this *Token) GetText() string {
return this._text
}
func (this *Token) SetText(s string) {
this._text = s
}
func (this *Token) GetTokenIndex() int { func (this *Token) GetTokenIndex() int {
return this.tokenIndex return this.tokenIndex
} }

View File

@ -818,6 +818,7 @@ ArithmeticParser.prototype.number = function() {
do { do {
this.state = 61; this.state = 61;
this.match(ArithmeticParser.DIGIT); this.match(ArithmeticParser.DIGIT);
console.log("Done with match")
this.state = 64; this.state = 64;
this._errHandler.sync(this); this._errHandler.sync(this);
_la = this._input.LA(1); _la = this._input.LA(1);

View File

@ -97,6 +97,7 @@ BufferedTokenStream.prototype.mark = function() {
}; };
BufferedTokenStream.prototype.release = function(marker) { BufferedTokenStream.prototype.release = function(marker) {
console.log("Nothing to release")
// no resources to release // no resources to release
}; };
@ -129,10 +130,12 @@ BufferedTokenStream.prototype.consume = function() {
// not yet initialized // not yet initialized
skipEofCheck = false; skipEofCheck = false;
} }
console.log("consume 1")
if (!skipEofCheck && this.LA(1) === Token.EOF) { if (!skipEofCheck && this.LA(1) === Token.EOF) {
throw "cannot consume EOF"; throw "cannot consume EOF";
} }
if (this.sync(this.index + 1)) { if (this.sync(this.index + 1)) {
console.log("consume 2")
this.index = this.adjustSeekIndex(this.index + 1); this.index = this.adjustSeekIndex(this.index + 1);
} }
}; };
@ -147,6 +150,10 @@ BufferedTokenStream.prototype.sync = function(i) {
var n = i - this.tokens.length + 1; // how many more elements we need? var n = i - this.tokens.length + 1; // how many more elements we need?
if (n > 0) { if (n > 0) {
var fetched = this.fetch(n); var fetched = this.fetch(n);
var e = new Error();
console.log("sync done")
console.log(e.stack)
return fetched >= n; return fetched >= n;
} }
return true; return true;
@ -162,6 +169,7 @@ BufferedTokenStream.prototype.fetch = function(n) {
} }
for (var i = 0; i < n; i++) { for (var i = 0; i < n; i++) {
var t = this.tokenSource.nextToken(); var t = this.tokenSource.nextToken();
console.log("fetch loop")
t.tokenIndex = this.tokens.length; t.tokenIndex = this.tokens.length;
this.tokens.push(t); this.tokens.push(t);
if (t.type === Token.EOF) { if (t.type === Token.EOF) {
@ -169,6 +177,8 @@ BufferedTokenStream.prototype.fetch = function(n) {
return i + 1; return i + 1;
} }
} }
console.log("fetch done")
return n; return n;
}; };

View File

@ -101,6 +101,7 @@ InputStream.prototype.mark = function() {
}; };
InputStream.prototype.release = function(marker) { InputStream.prototype.release = function(marker) {
console.log("RELEASING")
}; };
// consume() ahead until p==_index; can't just set p=_index as we must // consume() ahead until p==_index; can't just set p=_index as we must

View File

@ -168,7 +168,12 @@ Lexer.prototype.nextToken = function() {
if (this._type !== Lexer.MORE) { if (this._type !== Lexer.MORE) {
break; break;
} }
console.log("lex inner loop")
} }
console.log("lex loop")
if (continueOuter) { if (continueOuter) {
continue; continue;
} }
@ -257,6 +262,7 @@ Lexer.prototype.emitToken = function(token) {
// custom Token objects or provide a new factory. // custom Token objects or provide a new factory.
// / // /
Lexer.prototype.emit = function() { Lexer.prototype.emit = function() {
console.log("emit")
var t = this._factory.create(this._tokenFactorySourcePair, this._type, var t = this._factory.create(this._tokenFactorySourcePair, this._type,
this._text, this._channel, this._tokenStartCharIndex, this this._text, this._channel, this._tokenStartCharIndex, this
.getCharIndex() - 1, this._tokenStartLine, .getCharIndex() - 1, this._tokenStartLine,
@ -266,6 +272,7 @@ Lexer.prototype.emit = function() {
}; };
Lexer.prototype.emitEOF = function() { Lexer.prototype.emitEOF = function() {
console.log("emitEOF")
var cpos = this.column; var cpos = this.column;
var lpos = this.line; var lpos = this.line;
var eof = this._factory.create(this._tokenFactorySourcePair, Token.EOF, var eof = this._factory.create(this._tokenFactorySourcePair, Token.EOF,

View File

@ -133,12 +133,15 @@ Parser.prototype.reset = function() {
// mismatched symbol // mismatched symbol
Parser.prototype.match = function(ttype) { Parser.prototype.match = function(ttype) {
console.log("get current token")
var t = this.getCurrentToken(); var t = this.getCurrentToken();
console.log("TOKEN IS " + t.text) console.log("TOKEN IS " + t.text)
if (t.type === ttype) { if (t.type === ttype) {
this._errHandler.reportMatch(this); this._errHandler.reportMatch(this);
this.consume(); this.consume();
console.log("consume done")
} else { } else {
t = this._errHandler.recoverInline(this); t = this._errHandler.recoverInline(this);
if (this.buildParseTrees && t.tokenIndex === -1) { if (this.buildParseTrees && t.tokenIndex === -1) {
@ -148,6 +151,9 @@ Parser.prototype.match = function(ttype) {
this._ctx.addErrorNode(t); this._ctx.addErrorNode(t);
} }
} }
console.log("Match done")
return t; return t;
}; };
// Match current input symbol as a wildcard. If the symbol type matches // Match current input symbol as a wildcard. If the symbol type matches
@ -400,8 +406,11 @@ Parser.prototype.notifyErrorListeners = function(msg, offendingToken, err) {
Parser.prototype.consume = function() { Parser.prototype.consume = function() {
var o = this.getCurrentToken(); var o = this.getCurrentToken();
if (o.type !== Token.EOF) { if (o.type !== Token.EOF) {
console.log("Consuming")
this.getInputStream().consume(); this.getInputStream().consume();
console.log("done consuming")
} }
var hasListener = this._parseListeners !== null && this._parseListeners.length > 0; var hasListener = this._parseListeners !== null && this._parseListeners.length > 0;
if (this.buildParseTrees || hasListener) { if (this.buildParseTrees || hasListener) {
var node; var node;

View File

@ -128,11 +128,16 @@ LexerATNSimulator.prototype.match = function(input, mode) {
this.prevAccept.reset(); this.prevAccept.reset();
var dfa = this.decisionToDFA[mode]; var dfa = this.decisionToDFA[mode];
if (dfa.s0 === null) { if (dfa.s0 === null) {
console.log("matchATN")
return this.matchATN(input); return this.matchATN(input);
} else { } else {
return this.execATN(input, dfa.s0); console.log("execATN")
console.log((new Error()).stack)
var res = this.execATN(input, dfa.s0);
return res;
} }
} finally { } finally {
console.log("FINALLY")
input.release(mark); input.release(mark);
} }
}; };
@ -229,8 +234,10 @@ LexerATNSimulator.prototype.execATN = function(input, ds0) {
s = target; // flip; current DFA target becomes new src/from state s = target; // flip; current DFA target becomes new src/from state
} }
console.log("OUT") console.log("Done with execATN loop")
return this.failOrAccept(this.prevAccept, input, s.configs, t); var res = this.failOrAccept(this.prevAccept, input, s.configs, t);
console.log("Done with failOrAccept", res)
return res;
}; };
// Get an existing target state for an edge in the DFA. If the target state // Get an existing target state for an edge in the DFA. If the target state
@ -287,11 +294,15 @@ LexerATNSimulator.prototype.computeTargetState = function(input, s, t) {
}; };
LexerATNSimulator.prototype.failOrAccept = function(prevAccept, input, reach, t) { LexerATNSimulator.prototype.failOrAccept = function(prevAccept, input, reach, t) {
if (this.prevAccept.dfaState !== null) { if (this.prevAccept.dfaState !== null) {
var lexerActionExecutor = prevAccept.dfaState.lexerActionExecutor; var lexerActionExecutor = prevAccept.dfaState.lexerActionExecutor;
this.accept(input, lexerActionExecutor, this.startIndex, this.accept(input, lexerActionExecutor, this.startIndex,
prevAccept.index, prevAccept.line, prevAccept.column); prevAccept.index, prevAccept.line, prevAccept.column);
console.log(prevAccept.dfaState.prediction)
console.log("Prevaccept", prevAccept.dfaState.prediction)
return prevAccept.dfaState.prediction; return prevAccept.dfaState.prediction;
} else { } else {
// if no accept and EOF is first char, return EOF // if no accept and EOF is first char, return EOF
@ -341,8 +352,7 @@ LexerATNSimulator.prototype.getReachableConfigSet = function(input, closure,
} }
}; };
LexerATNSimulator.prototype.accept = function(input, lexerActionExecutor, LexerATNSimulator.prototype.accept = function(input, lexerActionExecutor, startIndex, index, line, charPos) {
startIndex, index, line, charPos) {
if (this.debug) { if (this.debug) {
console.log("ACTION %s", lexerActionExecutor); console.log("ACTION %s", lexerActionExecutor);
} }

View File

@ -573,6 +573,9 @@ DefaultErrorStrategy.prototype.getMissingSymbol = function(recognizer) {
if (current.type===Token.EOF && lookback !== null) { if (current.type===Token.EOF && lookback !== null) {
current = lookback; current = lookback;
} }
fmt.Println("Missing symbol error")
return recognizer.getTokenFactory().create(current.source, return recognizer.getTokenFactory().create(current.source,
expectedTokenType, tokenText, Token.DEFAULT_CHANNEL, expectedTokenType, tokenText, Token.DEFAULT_CHANNEL,
-1, -1, current.line, current.column); -1, -1, current.line, current.column);