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