使用flex识别变量名不重复字符

Using flex to identify variable name without repeating characters

我不太确定如何表达我的问题,很抱歉标题粗略。

我正在尝试创建一个可以识别具有以下限制的变量名称的模式:

例如,这些都是有效的:

但以下内容无效:

我现在的标识符能够满足前三个要求,但我真的很难改变它,这样它就不会选择完全是字母 X 的变量。

这是我目前的情况:[a-z][a-z0-9\-]* {return (NAME);}

任何人都可以建议一种编辑方法以避免仅由字母 X 组成的变量吗?

处理此类要求的最简单方法是使用一种模式匹配特殊字符串,另一种模式随后出现在文件中,匹配所有字符串:

[xX]+                    { /* matches all-x tokens */ }
[[:alpha:]][[:alnum:]-]* { /* handle identifiers */ }

这是有效的,因为 lex(以及几乎所有 lex 派生词)select 如果两个模式匹配相同的最长标记,则第一个匹配。

当然,你需要知道你想用特殊符号做什么。如果你只是想接受它作为某种令牌类型,那没问题;你只是那样做。另一方面,如果打算将其分解为子标记,也许是单个字母,那么您将不得不使用 yyless(),并且您可能希望切换到新的词法分析状态以避免重复匹配同样长的 X 序列。但也许这对你的情况并不重要。

有关详细信息和示例,请参阅 the flex manual