ANTLR4:如何指定包含 Unicode 字符串的规则选择?

ANTLR4: How to specify choice of rules which includes Unicode strings?

我需要解析包含条件的 CSV table,例如

1,"a==1 AND b==2"
2,"c==3 AND d==4"

对于那些下面的语法有效并且在我的访问者中调用了#validCondition。

我想在访问者中实施错误处理(使用#invalidCondition)以拒绝包含非法字符的条件,例如:

5,"c==3 AND ä d==4"
6,"c==3 AND . d==4"

使用下面的语法,我的访问者没有调用#invalidCondition,而是收到

line 3:12 token recognition error at: 'ä'
line 4:12 token recognition error at: '.'

并且发生了 ANTLR 默认错误恢复。对于

这样的无效条件
4,"c==3 AND a d==4"

#invalidCondition 按预期调用。

如何指定规则?

grammar Table;

table : row+;

row : INT ',' condition NEWLINE;

condition
    :   '"' expr '"'        #validCondition
    |   '"' ~('"')+ '"'     #invalidCondition
    ;

expr
    :   expr op=(AND | OR) expr         #op
    |   ID comp=(EQUAL | NOT_EQUAL) INT #comp
    |   '(' expr ')'                    #parens
;

EQUAL       : '==';
NOT_EQUAL   : '=!';
OR          : 'OR';
AND         : 'AND';


NEWLINE     : '\r\n';

ID          : [a-zA-Z] [a-zA-Z0-9]* ;
INT         : [0-9]+ ;
WS          : [ \t\n\r]+ -> skip ;

要让 Antlr 处理 Unicode 字符,请将 characters/ranges 指定为词法分析器规则的一部分。例如,请参阅 Antlr4 grammar 如何处理 Unicode。

需要更改 ID 规则或添加规则以允许 Unicode 输入字符的可能性。

invalidCondition 对输入 a d==4 起作用的原因是因为文本 lex 为 ID ID '==' INT',并且与 expr 规则不匹配。

输入 ä d==4 将被词法化为 UNKNOWN ID '==' INT'。但是,令牌识别错误反映了词法分析器无法识别字符 - UNKNOWN 非令牌未传递给解析器,因此 invalidCondition 子规则将不匹配。

如果将 Unicode 添加到 ID 规则,则现有的 invalidCondition 子规则将按预期工作。

但是,如果现有语法规则涵盖整个有效输入字符集,则可以添加一个规则来捕获所有其他输入字符,包括 Unicode。在所有其他规则之后,添加:

OTHER : . ;

这样可以避免Unicode识别错误。它将要求将所有有效字符(例如双引号字符)定义为词法分析器规则,否则它们将被词法分析为 OTHER 个标记。