如何使用 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
调用的建议。
给定以下输入:
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
调用的建议。