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

如何使用antlr解析运行长度编码的二进制子格式,antlr,antlr4,Antlr,Antlr4,考虑到以下输入: AA:4:2:@5@xxAAx:2:a: 第@5@部分定义长度为5的二进制子表单的开头。子格式可以包含任何类型的字符,并且可能包含来自主格式的标记。(例如,AA是主格式中的关键字/标记) 我想构建一个lexer,它能够为整个二进制部分提取一个令牌 我已经尝试了几种方法(例如,分部谓词、语义谓词),但我没有让它们以正确的方式协同工作。最终我自己找到了解决方案 以下是lexer定义的相关部分 @members { public int _binLength; } BIN

考虑到以下输入:

AA:4:2:@5@xxAAx:2:a:
第@5@部分定义长度为5的二进制子表单的开头。子格式可以包含任何类型的字符,并且可能包含来自主格式的标记。(例如,AA是主格式中的关键字/标记)

我想构建一个lexer,它能够为整个二进制部分提取一个令牌


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

最终我自己找到了解决方案

以下是lexer定义的相关部分

@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;
@成员{
公共整数长度;
}
二进制头:'@'[0-9]+'@'{u binLength=Integer.parseInt(getText().substring(1,getText().length()-1));}->pushMode(原始);
模式原始;
二进制:.+{getText().length()popMode;
解决方案基于在解析二进制字段的长度定义时设置的额外字段。之后,使用语义谓词将二进制内容的有效性限制为该字段的大小


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

最终我自己找到了解决方案

以下是lexer定义的相关部分

@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;
@成员{
公共整数长度;
}
二进制头:'@'[0-9]+'@'{u binLength=Integer.parseInt(getText().substring(1,getText().length()-1));}->pushMode(原始);
模式原始;
二进制:.+{getText().length()popMode;
解决方案基于在解析二进制字段的长度定义时设置的额外字段。之后,使用语义谓词将二进制内容的有效性限制为该字段的大小

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