无法编写词法分析器来解析这个

时间:2021-06-23 16:58:21

标签: antlr antlr4

我正在设计我自己的数据格式: -key=value-123

它是“DASH KEY EQUAL IDENTIFIER”,问题是,标识符也包含破折号,所以它吃掉了所有的字符。请帮忙

DASH        :   '-';
EQUAL       :   '=';
IDENTIFIER  :   [a-zA-Z0-9 -_<>@:\\.@()/]+;

谢谢 彼得

1 个答案:

答案 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

的全文
相关问题