我想定义一个语法,其中标识符ID的词法分析器规则只有在有效的情况下才能成功匹配。这样的标识符以集合的形式提供给词法分析器。
基于这里的this answer,我想出了以下解决方案。我添加了另一个lexer构造函数,传入一组有效的标识符。然后,我在ID令牌规则后面添加了一个谓词,以便在找不到匹配的文本时禁用它。然后,词法分析器将匹配UNKNOWN令牌(相同的规则),我希望强制使用NoViableAltException,因为没有针对包含UNKNOWN的expr的规则。相反,我得到的是MismatchedInputExceptions,这可能没有问题,但不再报告以下所有语法错误。
grammar T;
@lexer::members {
private java.util.Set<String> identifiers = new java.util.HashSet<>();
public TLexer(CharStream input, java.util.Set<String> s) {
this(input);
this.identifiers = s;
}
public boolean hasIdentifier(String s) {
return identifiers.contains(s);
}
}
prog: expr;
expr
: expr ('AND' | 'OR') expr
| ID '=' STRING
| ID ('=' | '<' | '>') INT
;
INT: ...
STRING: ...
ID: [a-z][a-zA-Z0-9]* {hasIdentifier(getText())}?;
UNKNOWN: [a-z][a-zA-Z0-9]*;
WS: [ \r\n\t] -> skip();有没有更好的方法让任何无效的标识符被报告为实际的语法错误?
发布于 2021-05-05 14:59:08
只有当解析器可以从第一个错误中恢复时,您才会得到其他语法错误。这种能力很大程度上依赖于语法。如果不可能重新同步,解析器将最终放弃,并且永远不会报告更多错误。
因此,我不会尝试得到更多的错误。而是向用户报告一个错误,让他在继续处理进一步的错误之前修复它。
https://stackoverflow.com/questions/67393033
复制相似问题