としてのキーワードを許可これは識別子として許可されたキーワードがAntlr4は識別子
let:
var var
let var = 10
goto let
する場合は、このは完全に法律上のコードでデモコード
label:
var id
let id = 10
goto label
です。しかし、antlrでこれを行うことは非常に難しいようです。
AFAIK、antlrがトークンletと一致すると、決してidトークンにフォールバックしません。そうANTLRのために、それは私が今までのトークンの一致、問題を制御する必要があり、ANTLR許さpredicateものの
LET_TOKEN :
VAR_TOKEN <missing ID_TOKEN>VAR_TOKEN
LET_TOKEN <missing ID_TOKEN>VAR_TOKEN = 10
が表示されます。文法はこの
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]
}
}
[email protected]{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のゴー目標についてとても興奮していたが、私は私の文法の間違ったツールを選択するようですか?