给定像旧的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令牌。
然而,这个RegExp 可以比identifier name可能的15个字符更长地匹配令牌,这需要yypushback的。
因此,是否有一种方法来限制JFlex为特定令牌读取多少字符?
发布于 2021-05-17 03:42:53
基于正则表达式的词法分析并不是解析固定字段输入的合适工具。您可以在已知的字符位置将输入拆分为字段,这要容易得多,而且要快得多。而且它不需要对正则表达式进行繁琐的处理。
无论如何,即使[a-zA-Z][a-zA-Z0-9]{0,14}[ ]{0,14}正确地处理了令牌长度,它也不是正确的表达式,因为标记实际上是开头的单词,没有空格字符。
对于包含比单个标识符更复杂的内容的固定长度字段,您可能需要使用StringReader或其他类似的方法将该字段输入到lexer中。
虽然我确信它没有用,但这里有一个正则表达式,它匹配以一个单词开头并以空格完成的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}(这可能需要排在一条很长的队伍上。)
https://stackoverflow.com/questions/67558980
复制相似问题