如何使用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
调用的建议