如何使用 antlr 解析运行长度编码的二进制子格式

Howto parse runlength encoded binary subformat with antlr

给定以下输入:

AA:4:2:@5@xxAAx:2:a:

@5@ 部分定义了长度为 5 的二进制子格式的开始。子格式可以包含任何类型的字符,并且很可能包含来自主格式的标记。 (例如,AA 是主格式中的 keyword/token)。

我想构建一个能够为整个二进制部分提取一个标记的词法分析器。

我已经尝试了几种方法(例如部分、语义谓词),但我没有让它们以正确的方式协同工作。

最后我自己找到了解决办法

下面是词法分析器定义的相关部分

@members {
    public int _binLength;
}

BINARYHEAD: '@' [0-9]+ '@'  { _binLength = Integer.parseInt(getText().substring(1,getText().length()-1)); } -> pushMode(RAW) ;

mode RAW;

BINARY: .+ {getText().length() <= _binLength}? -> popMode;

解决方案是基于在解析二进制字段的长度定义时设置的额外字段。之后使用语义谓词将二进制内容的有效性限制为该字段的大小。

欢迎提出任何简化 parseInt 调用的建议。