在我正在尝试编写解析器的平面文件中,有一行如下:
//TN PN RO
0 5 3
TN,PN和RO是参数名称(我在这里添加了以“//”开头的行以便更好地理解。实际文件没有它。)
每个参数的范围都不同。 TN可以是0或1,PN 0-7和RO 0-3。
我理解为什么以下语法不起作用(0和1匹配所有词法规则,2和3匹配PN和RO规则)但是有没有办法实现我在这里尝试做的事情。
grammar PARAM;
parameters: TN PN RO;
TN: [0-1];
RN: [0-7];
RO: [0-3];
WS : [ \r\t\n]+ -> skip ;
我喜欢将这些重叠的数字作为不同的标记进行匹配。否则我必须将我的语法更改为此,然后在Java端手动检查范围。
grammar PARAM;
parameters: DIGIT DIGIT DIGIT;
DIGIT: [0-7];
WS : [ \r\t\n]+ -> skip ;
感谢。
答案 0 :(得分:1)
由于词法分析器不知道在线的上下文/数字位置(除非被某些自定义代码攻击),因此它不知道是否匹配0作为TN,RN或RO。进行这种区分的正确位置是解析器。
你可以这样做以避免在Java中检查范围(虽然我会亲自用Java检查它们而不是这样做):
parameters: tn_param rn_param ro_param;
tn_param: TN_DIGIT;
rn_param: TN_DIGIT | RO_DIGIT | RN_DIGIT;
ro_param: TN_DIGIT | RO_DIGIT;
TN_DIGIT: [0-1];
RO_DIGIT: [2-3];
RN_DIGIT: [4-7];