You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ANTLR OData语法解析双引号问题求助

问题分析与解决方案

核心问题

你的OData解析器解析失败的原因是词法规则优先级冲突:
PROPERTY和STRING规则都能匹配双引号包裹的标识符(如"Number"、"Four"),而ANTLR词法分析器会优先匹配先定义的规则。由于PROPERTY定义在STRING前面,测试输入中的"Four"会被识别为PROPERTY,但你的VALUE规则并不包含PROPERTY,导致PROPERTY : PROPERTY无法匹配expr中的PROPERTY ':' VALUE规则,最终解析失败。

换成单引号包裹PROPERTY后,"Four"只能匹配STRING(不再符合PROPERTY规则),此时PROPERTY : STRING符合expr规则,所以解析成功。

解决方案

将PROPERTY从词法规则改为语法规则,避免与STRING的词法冲突,修改后的语法如下:

grammar Filter;

filter: expr+ EOF ;

expr
    : LBR expr RBR
    | property ':' VALUE 
    ;

// 把PROPERTY改为语法规则,由双引号+标识符+双引号组成
property
    : PRM IDENTIFIER PRM
    ;

LBR: '{' ;
RBR: '}' ;
CLN: ':' ;
PRM: '"' ;

VALUE
    : TRUE
    | FALSE
    | INT
    | FLOAT
    | STRING
    ;

TRUE
    : 'true'
    ;
 
FALSE
    : 'false'
    ;

// 新增IDENTIFIER词法规则,匹配允许的标识符字符
IDENTIFIER
    : ([a-zA-Z0-9_-])+
    ;

STRING
 : '"' (~['"\r\n] | '\'')* '"'  // 可选:支持转义双引号,符合OData字符串规范
 ;

INT
 : DIGIT+
 ;

FLOAT
 : DIGIT+ '.' DIGIT*
 | '.' DIGIT+
 ;

fragment DIGIT : [0-9] ;

SPACE
 : [ \t\r\n] -> skip
 ;

修改说明

  • 新增IDENTIFIER词法规则,替代原有的ALLOWED_CHARACTERS片段,专门匹配标识符字符。
  • 用语法规则property组合双引号与标识符,让词法分析器独立识别双引号(PRM)和标识符(IDENTIFIER),彻底避免与STRING规则的冲突。
  • 可选修正STRING规则,支持转义双引号,更贴合OData的字符串格式要求。

修改后,测试输入{"Number":"Four"}可被正确解析:

  • "Number"通过语法规则解析为property
  • "Four"被词法分析器识别为STRING(属于VALUE)
  • 整体结构符合LBR (property : VALUE) RBR的expr规则

内容的提问来源于stack exchange,提问作者Pixma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:02:05