ANTLR-是否可以处理语法中指定长度的变量标记? 示例字符串

ANTLR-是否可以处理语法中指定长度的变量标记? 示例字符串,antlr,grammar,Antlr,Grammar,023abc7defghij 标题 字符0,1=以下块的大小 大块 第一个字符=以下字符串的长度 以下字符=具有指定长度的字符串 示例结果 在上面的例子中,这意味着: 02->2下面的块 将跟随3->3个字符串 abc->三个字符串 7->7个字符串将紧跟其后 defghij->七个字符的字符串 问题: 我能写一个描述这种字符串形式的语法吗? 我需要解释“长度”信息,然后构建具有指定长度的标记,用长度信息和字符串填充对象 我希望我能把这个描述得通俗易懂。我找不到描述或解决我的问题的信息。我假设您

023abc7defghij

标题 字符0,1=以下块的大小

大块 第一个字符=以下字符串的长度

以下字符=具有指定长度的字符串

示例结果 在上面的例子中,这意味着:

02->2下面的块

将跟随3->3个字符串

abc->三个字符串

7->7个字符串将紧跟其后

defghij->七个字符的字符串

问题: 我能写一个描述这种字符串形式的语法吗? 我需要解释“长度”信息,然后构建具有指定长度的标记,用长度信息和字符串填充对象


我希望我能把这个描述得通俗易懂。我找不到描述或解决我的问题的信息。

我假设您的实际问题有点复杂,因为如果
“023abc7defghij”
是您的实际输入,我不会使用像ANTLR这样的解析器生成器,而只会使用一些简单的字符串操作

也就是说,这里有一个可能的解决方案:

由于您的
在前面是未知的,因此您不能创建除单个
数字
其他
标记以外的任何标记,该标记将是除数字以外的任何字符。请注意,您实际上并不需要
标题
信息:您只需解析
“3”
,然后获取接下来的3个字符,然后解析
“7”
并获取接下来的7个字符。。。一直到文件的结尾

这种语言的语法可以如下所示:

语法T;
作语法分析
:文件EOF
;
文件
:标题块*
;
标题
:位数
;
大块
:数字任意*
;
任何
:位数
|其他
;
数字
:  '0'..'9'
;
其他
:  .
;
但是现在的
规则是不明确的:它现在不知道何时停止使用字符。这可以使用一个计数器来完成,当满足某个条件时(在这种情况下,计数器
int n
已倒计时),该计数器将使来自
any*
停止消耗

上面的语法(包括该谓词和一些
println
-语句)如下所示:

语法T;
作语法分析
:文件EOF
;
文件
:header{System.out.println(“header=“+$header.text);}
(chunk{System.out.println(“chunk=“+$chunk.text);})*
;
标题
:位数
;
大块
:Digit{int n=Integer.valueOf($Digit.text);}({n>0}?=>any{n--;})*
;
任何
:位数
|其他
;
数字
:  '0'..'9'
;
其他
:  .
;
可通过以下类别进行测试:

import org.antlr.runtime.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
字符串source=“023abc7defghij”;
TLexer lexer=新的TLexer(新的AntlStringStream(源));
TParser parser=newtparser(newcommontokenstream(lexer));
parser.parse();
}
}
如果现在生成一个lexer和parser,编译所有
.java
文件并运行
Main
类:

java-cp antlr-3.3.jar org.antlr.Tool T.g
javac-cp antlr-3.3.jar*.java
java-cp.:antlr-3.3.jar Main
您将看到以下内容被打印到控制台:

header=02
区块=3abc
chunk=7defghij

感谢您的精彩解释,巴特!我曾想过使用ANTLR来实现这一点,但现在,我坚持使用字符串操作,正如您所建议的那样。我真正的问题比我简单的例子要复杂得多。再次感谢您的帮助-您的示例非常有启发性。对于未来的读者:请注意,antlr4+中的语法已经更改(参见示例)