我们需要从我们的数据文件中提取可变长度的文本块,并且一直在尝试编写一个语法文件。有两个主要挑战。首先,文本是可变长度的。其次,没有锚可以帮助我们定位文本块。基本上,我们正在尝试解析大型机生成的基于文本的字母,以从文件的特定部分提取信息,然后使用来自 ANTLR 的键值对来填充 Adobe 表单。在 ANTLR 4.0 中,我们确定了一种将所有单词合并为一个标记的方法,并将它们合并,空格分隔,形成一个字符串。由于解析器和词法分析器在 4.0 中被重写,我们在 3.5 中没有相同的功能。寻求您的意见以解决问题。以下是我们一直在尝试的几件事。
我们尝试了这种编写语义谓词的方法。我们能够得到单词,但我们无法在单词之间插入空格。
@init{ int N = 0; }
: ( { N <= 3 }? ) =>( WORD { N++; } )+
这是包含空白的第三种方法。我们可以在每个规则中处理它,而不是跳过WS
它,但它可能会占用大量内存,这可能会导致内存空间不足的问题。
name: WORD WS WORD WS WORD;
WS : ( ' '|'\t'|'\r'|'\n' )+