我正在设计我自己的数据格式: -key=value-123
它是“DASH KEY EQUAL IDENTIFIER”,问题是,标识符也包含破折号,所以它吃掉了所有的字符。请帮忙
DASH : '-';
EQUAL : '=';
IDENTIFIER : [a-zA-Z0-9 -_<>@:\\.@()/]+;
谢谢 彼得
答案 0 :(得分:1)
这就是 ANTLR 的工作方式。如果多个词法分析器规则匹配输入的字符流,则匹配时间最长的规则将获胜(当长度匹配时,第一个规则获胜),因为您的 IDENTIFIER
规则包含“-”但不包括“=”, ANTLR 将为 IDENTIFIER
创建更长的令牌。除非您的输入以 DASH
开头,否则您将无法获得 “-=“
的匹配项(当然,那么就没有 IDENTIFIER
)。
如果您正在设计自己的格式,您可以选择在 IDENTIFIERS
中禁用“-”,这样就可以了。
这是您尝试解析的内容的全貌,还是只是一小部分?如果这是完整的图片,那么您将能够使用 REGEX 和捕获组轻松“解析”它。 ANTLR 会矫枉过正。
如果您确实必须在标识符中包含 DASH
,您可以采用以下方法:
1 - 从 IDENTIFIER
词法分析器规则中删除“-”(我们称之为 ID
),我们将在 identifier
解析规则中处理完整标识符:
keyValue : DASH key=identifier EQUAL val=identifier;
identifier: ID (DASH ID)+;
DASH : '-';
EQUAL : '=';
ID : [a-zA-Z0-9 _<>@:\\.@()/]+;
在一个监听器(或 IdentiferCtx
的访问者(例如:(enter|exit)Identifer for a listener)中,您可以调用 cox.getText() 获取完整标识符规则的字符串,并具有您的identifier