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 个字符 的标记,需要 yypushback
s。
因此,有没有办法限制 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}
(可能需要排成一行。)
给定像旧 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 个字符 的标记,需要 yypushback
s。
因此,有没有办法限制 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}
(可能需要排成一行。)