Antlr4 как построить грамматику разрешенных ключевых слов в качестве идентификатора

Это демонстрационный код

label:
var id
let id = 10
goto label

Если разрешено ключевое слово в качестве идентификатора будет

let:
var var
let var = 10
goto let

Это абсолютно законный кодекс. Но, кажется, это очень сложно сделать в antlr.

AFAIK, если antlr совпадает с токеном let, никогда не отступит от id токена. так что для antlr это увидит

LET_TOKEN :
VAR_TOKEN <missing ID_TOKEN>VAR_TOKEN
LET_TOKEN <missing ID_TOKEN>VAR_TOKEN = 10

хотя antlr разрешеносказуемое, Я должен контролировать токены и проблематично. грамматика стала такой

grammar Demo;
options {
  language = Go;
}
@parser::members{
    var _need = map[string]bool{}
    func skip(name string,v bool){
        _need[name] = !v
        fmt.Println("SKIP",name,v)
    }
    func need(name string)bool{
        fmt.Println("NEED",name,_need[name])
        return _need[name]
    }
}

proj@init{skip("inst",false)}: (line? NL)* EOF;
line
    : VAR ID
    | LET ID EQ? Integer
    ;

NL: '\n';
VAR: {need("inst")}? 'var' {skip("inst",true)};
LET: {need("inst")}? 'let' {skip("inst",true)};
EQ: '=';

ID: ([a-zA-Z] [a-zA-Z0-9]*);
Integer: [0-9]+;

WS: [ \t] -> skip;

Выглядит так ужасно.

Но это легко в привязке, проверьте это вpegjs

Expression = (Line? _ '\n')* ;

Line
  = 'var' _ ID
  / 'let' _ ID _ "=" _ Integer

Integer "integer"
  = [0-9]+ { return parseInt(text(), 10); }

ID = [a-zA-Z] [a-zA-Z0-9]*

_ "whitespace"
  = [ \t]*

Я на самом деле сделал это вpeggo а такжеJavaCC.

Мой вопрос заключается в том, как обращаться с этими грамматиками в antlr4.6, я был так взволнован по поводу цели antlr4.6 go, но, кажется, я выбрал неправильный инструмент для своей грамматики?

Ответы на вопрос(1)

Ваш ответ на вопрос