微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JFlex 最大读取长度

如何解决JFlex 最大读取长度

给定像旧的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 令牌。
但是,此正则表达式可以匹配超过 15 个字符标记identifier name 可能需要 yypushback

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

解决方法

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

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

对于包含比单个标识符更复杂的内容的固定长度字段,您可能希望使用 StringReader 或类似工具将该字段输入到词法分析器中。


虽然我确定它没有用,但这里有一个正则表达式,它匹配以单词开头并以空格完成的 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}

(这可能需要排在很长的一行。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。