JFlex 最大读取长度

JFlex maximum read length

给定像旧 IBM RPG 这样的位置语言,我们可以有一行

CCCCCDIDENTIFIER     E S             10

其中字符

 1-5:  comment
   6:  specification type
7-21:  identifier name
...And so on

现在,鉴于 JFlex 基于 RegExp,我们将有一个 RegExp,例如:

[a-zA-Z][a-zA-Z0-9]{0,14} {0,14}

对于 identifier name 令牌。
但是,此正则表达式 可以匹配长度超过 identifier name 可能的 15 个字符 的标记,需要 yypushbacks。

因此,有没有办法限制 JFlex 为特定令牌读取的字符数?

基于正则表达式的词法分析确实不是解析固定字段输入的正确工具。您可以将输入拆分为已知字符位置的字段,这样更容易也更快。而且它不需要对正则表达式大惊小怪。

无论如何,即使 [a-zA-Z][a-zA-Z0-9]{0,14}[ ]{0,14} 正确处理了令牌长度,它也不是正确的表达式,因为令牌实际上是开头的单词,没有 space 个字符。

对于包含比单个标识符更复杂的内容的固定长度字段,您可能希望使用 StringReader 或类似的东西将该字段提供给词法分析器。


虽然我确定它没有用,但这里有一个正则表达式,它匹配以单词开头并以 spaces:

结尾的 15 个字符
[a-zA-Z][ ]{14} |
[a-zA-Z][a-zA-Z0-9][ ]{13} |
[a-zA-Z][a-zA-Z0-9]{2}[ ]{12} |
[a-zA-Z][a-zA-Z0-9]{3}[ ]{11} |
[a-zA-Z][a-zA-Z0-9]{4}[ ]{10} |
[a-zA-Z][a-zA-Z0-9]{5}[ ]{9} |
[a-zA-Z][a-zA-Z0-9]{6}[ ]{8} |
[a-zA-Z][a-zA-Z0-9]{7}[ ]{7} |
[a-zA-Z][a-zA-Z0-9]{8}[ ]{6} |
[a-zA-Z][a-zA-Z0-9]{9}[ ]{5} |
[a-zA-Z][a-zA-Z0-9]{10}[ ]{4} |
[a-zA-Z][a-zA-Z0-9]{11}[ ]{3} |
[a-zA-Z][a-zA-Z0-9]{12}[ ]{2} |
[a-zA-Z][a-zA-Z0-9]{13}[ ] |
[a-zA-Z][a-zA-Z0-9]{14}

(可能需要排成一行。)