首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让ANLTR将未知标识符报告为语法错误

如何让ANLTR将未知标识符报告为语法错误
EN

Stack Overflow用户
提问于 2021-05-05 06:34:41
回答 1查看 35关注 0票数 3

我想定义一个语法,其中标识符ID的词法分析器规则只有在有效的情况下才能成功匹配。这样的标识符以集合的形式提供给词法分析器。

基于这里的this answer,我想出了以下解决方案。我添加了另一个lexer构造函数,传入一组有效的标识符。然后,我在ID令牌规则后面添加了一个谓词,以便在找不到匹配的文本时禁用它。然后,词法分析器将匹配UNKNOWN令牌(相同的规则),我希望强制使用NoViableAltException,因为没有针对包含UNKNOWNexpr的规则。相反,我得到的是MismatchedInputExceptions,这可能没有问题,但不再报告以下所有语法错误。

代码语言:javascript
复制
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();

有没有更好的方法让任何无效的标识符被报告为实际的语法错误?

EN

回答 1

Stack Overflow用户

发布于 2021-05-05 14:59:08

只有当解析器可以从第一个错误中恢复时,您才会得到其他语法错误。这种能力很大程度上依赖于语法。如果不可能重新同步,解析器将最终放弃,并且永远不会报告更多错误。

因此,我不会尝试得到更多的错误。而是向用户报告一个错误,让他在继续处理进一步的错误之前修复它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67393033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档