首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JFlex最大读取长度

JFlex最大读取长度
EN

Stack Overflow用户
提问于 2021-05-16 16:15:55
回答 1查看 76关注 0票数 0

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

代码语言:javascript
复制
CCCCCDIDENTIFIER     E S             10

人物

代码语言:javascript
复制
 1-5:  comment
   6:  specification type
7-21:  identifier name
...And so on

现在,考虑到JFlex是基于RegExp的,我们将有一个RegExp,如:

代码语言:javascript
复制
[a-zA-Z][a-zA-Z0-9]{0,14} {0,14}

用于identifier name令牌。

然而,这个RegExp 可以比identifier name可能的15个字符更长地匹配令牌,这需要yypushback的。

因此,是否有一种方法来限制JFlex为特定令牌读取多少字符?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-17 03:42:53

基于正则表达式的词法分析并不是解析固定字段输入的合适工具。您可以在已知的字符位置将输入拆分为字段,这要容易得多,而且要快得多。而且它不需要对正则表达式进行繁琐的处理。

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

对于包含比单个标识符更复杂的内容的固定长度字段,您可能需要使用StringReader或其他类似的方法将该字段输入到lexer中。

虽然我确信它没有用,但这里有一个正则表达式,它匹配以一个单词开头并以空格完成的15个字符:

代码语言:javascript
复制
[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}

(这可能需要排在一条很长的队伍上。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67558980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档