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
个标记。
我需要解析包含条件的 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
个标记。