Syntax error ANTLR抛出错误,但语法是功能性的

Syntax error ANTLR抛出错误,但语法是功能性的,syntax-error,antlr,antlr4,rule,Syntax Error,Antlr,Antlr4,Rule,我有这样的语法: grammar Flow; @header { import java.util.HashMap; } @members { HashMap<String, String> vars = new HashMap<>(); } WS: (' '|'\n'|'\r'|'\t') -> skip; flow: (print|var)+ EOF; print: 'print' (toPrint=PRINTAB

我有这样的语法:

grammar Flow;

@header { import java.util.HashMap; }

@members { HashMap<String, String> vars = new HashMap<>(); }

WS:         (' '|'\n'|'\r'|'\t') -> skip;

flow:       (print|var)+ EOF;

print:      'print' (toPrint=PRINTABLE { System.out.println($toPrint.text); })|(id=ID {
    if (vars.containsKey($id.text)) {
        System.out.println(vars.get($id.text));
    } else {
        System.err.println("This variable is not assigned!");
    }
});

var:        'var' id=ID '=' val=PRINTABLE { vars.put($id.text, $val.text); };

PRINTABLE:  STRING|NUMBER|LETTER|DIGIT;

STRING:     '"' (.)*? '"';

fragment LETTER: ('a'..'z'|'A'..'Z');
fragment DIGIT:  ('0'..'9');

NUMBER:     DIGIT+ ('.' DIGIT+)?;

ID:         LETTER (LETTER|DIGIT)*;
语法流;
@标题{import java.util.HashMap;}
@成员{HashMap vars=new HashMap();}
WS:(“|”\n“|”\r“|”\t')->跳过;
流程:(打印| var)+EOF;
print:'print'(toPrint=PRINTABLE{System.out.println($toPrint.text);})|(id=id){
if(变量containsKey($id.text)){
System.out.println(vars.get($id.text));
}否则{
System.err.println(“未分配此变量!”);
}
});
var:'var'id=id'='val=PRINTABLE{vars.put($id.text,$val.text);};
可打印:字符串|数字|字母|数字;
字符串:“”(.)*?“”;
片段字母:('a'..'z'|'a'..'z');
片段数字:('0'..'9');
编号:数字+('.'数字+)?;
ID:字母(字母|数字)*;
当我调用启动规则“flow”并输入一些有效变量并尝试打印它时,TestRig抛出错误:

第2行:6“输出”处缺少可打印内容

但一切都很好。 如何阻止这种恼人的错误


感谢您的反馈

不是你问题的解决方案,而是你语法的一个稍微改进版本,解决了我评论中提到的问题:

grammar Flow;

@header { import java.util.HashMap; }

@members { HashMap<String, String> vars = new HashMap<>(); }

WS:         (' '|'\n'|'\r'|'\t') -> skip;

flow:       (print|var)+ EOF;

print:        'print' (toPrint=printable { System.out.println($toPrint.text); })
            | (id=ID {
                      if (vars.containsKey($id.text)) {
                         System.out.println(vars.get($id.text));
                       } else {
                          System.err.println("This variable is not assigned!");
                       }
                     }
              )
            ;

var:        'var' id=ID '=' val=printable { vars.put($id.text, $val.text); };

printable:  STRING|NUMBER|ID|NUMBER;

STRING:     '"' (.)*? '"';

NUMBER:     DIGIT+ ('.' DIGIT+)?;

ID:         LETTER (LETTER|DIGIT)*;

fragment LETTER: ('a'..'z'|'A'..'Z');
fragment DIGIT:  ('0'..'9');
语法流;
@标题{import java.util.HashMap;}
@成员{HashMap vars=new HashMap();}
WS:(“|”\n“|”\r“|”\t')->跳过;
流程:(打印| var)+EOF;
print:'print'(toPrint=printable{System.out.println($toPrint.text);})
|(id=id{
if(变量containsKey($id.text)){
System.out.println(vars.get($id.text));
}否则{
System.err.println(“未分配此变量!”);
}
}
)
;
var:'var'id=id'='val=printable{vars.put($id.text,$val.text);};
可打印:字符串|编号| ID |编号;
字符串:“”(.)*?“”;
编号:数字+('.'数字+)?;
ID:字母(字母|数字)*;
片段字母:('a'..'z'|'a'..'z');
片段数字:('0'..'9');

您可以发布您的示例输入吗?顺便说一句,我会将
设置为可打印的
解析器规则,即
可打印的
。否则,
字符串
数字
等将没有令牌,因为它们最终都是可打印的令牌。此外,单个字符标识符将是可打印的,而不是标识符,因为首先是可打印的。