Skip to content

Go target, cannot use superClass for the lexer grammar! #3254

@kaby76

Description

@kaby76

I'm trying to use the superClass option in a lexer grammar. It works fine for a parser grammar, but for a lexer grammar, it fails at runtime with a null pointer dereference in the generated constructor NewFOOBARLexer().

For example,

type CSharpLexer struct {
	*CSharpLexerBase
	channelNames []string
	modeNames    []string
	// TODO: EOF string
}

func NewCSharpLexer(input antlr.CharStream) *CSharpLexer {
	l := new(CSharpLexer)
	...
	l.BaseLexer = antlr.NewBaseLexer(input)  <<<<<< CRASHES HERE WITH NULL PTR DEREF.
	...
	return l
}

It crashes on l.BaseLexer = antlr.NewBaseLexer(input), specifically on the assignment to l.BaseLexer, and not on the call to the constructor antlr.NewBaseLexer(input).

Contrast this with the parser code:

type CSharpParser struct {
	CSharpParserBase
}

func NewCSharpParser(input antlr.TokenStream) *CSharpParser {
	this := new(CSharpParser)
	...
	this.BaseParser = antlr.NewBaseParser(input)
	...
	return this
}

This code works for the parser. The assignment to this.BaseParser works fine as it's not a null pointer.

The constructor code for the lexer fails because the type CSharpLexer struct is wrong. It defines the struct to contain*CSharpLexerBase, whereas in the parser type CSharpParser struct, the struct contains CSharpParserBase not a pointer. Changing the type struct declation for the generated lexer to CSharpLexerBase instead of *CSharpLexerBase fixes the crash, and my parser/lexer work just fine.

The problem is here-- the line erroneously contains *, whereas for the parser here, it is declared directly.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions