レクサーを考えると
fragment
FRAGID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
ID : FRAGID;
NAME: FRAGID ('.' FRAGID)*;
文法を考えると
var_def: type=ID vname=ID ASSIGN expr
-> ^(VARDEF $type $vname expr)
;
オプション付き
options
{
language=CSharp3;
output=AST;
}
とコードを与えられた
int i = 0
すべてが正常に動作します。
ただし、割り当てでのNAMEの使用を許可したい場合(別のオブジェクトを参照)
var_def
: type=(NAME|ID) vname=ID ASSIGN expr
-> ^(VARDEF $type $vname expr)
;
実行時にRewriteEmptyStreamExceptionが発生します
Antlr.Runtime.Tree.RewriteEmptyStreamException:トークンタイプ
Antlr.Runtime.Tree.RewriteRuleElementStream.NextCore()のc:\ dev \ stringtemplate_main \ antlr \ antlr3-main \ runtime \ CSharp3 \ Sources \ Antlr3.Runtime \ Tree \ RewriteRuleElementStream.cs:行200
Antlr.Runtime.Tree.RewriteRuleTokenStream.NextNode()のc:\ dev \ stringtemplate_main \ antlr \ antlr3-main \ runtime \ CSharp3 \ Sources \ Antlr3.Runtime \ Tree \ RewriteRuleTokenStream.cs:62行目
文法を使って、もう少し調査を行う
var_def
: type=NAME vname=ID ASSIGN expr
-> ^(VARDEF $type $vname expr)
;
私は
Antlr.Runtime.Tree.RewriteEarlyExitException:タイプ'Antlr.Runtime.Tree.RewriteEarlyExitException'の例外がスローされました。