繁体   English   中英

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

[英]Using flex to identify variable name without repeating characters

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

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

  • 必须以字母开头
  • 第一个字母后面可以跟字母、数字和连字符的任意组合
  • 第一个字母后面可以没有任何内容
  • 变量名不能完全是 X([xX]+ 在这个语法中是一个单独的标识符)

因此,例如,这些都是有效的:

  • 变量123
  • 养蜂人
  • E-3

但以下内容无效:

  • XXXX
  • X
  • 3变量
  • 5个

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

这是我到目前为止所拥有的: [az][a-z0-9\-]* {return (NAME);}

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

处理这种要求的最简单方法是使用一种模式来匹配异常字符串,另一种模式随后出现在文件中,它匹配所有字符串:

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

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

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

有关详细信息和示例,请参阅flex 手册

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM