如何编写不区分大小写的 Lex 模式规则?

How to write case insensitive Lex pattern rules?

我的文件结构是,

`pragma TOKEN1_NAME TOKEN1_VALUE
`pragma TOKEN2_NAME TOKEN2_VALUE
`pragma TOKEN3_NAME TOKEN3_VALUE
`pragma TOKEN4_NAME TOKEN4_VALUE
 TEXT{

 // A valid VHDL or verilog
 }
`pragma TOKEN2_NAME TOKEN2_VALUE
 TEXT{

   // VHDL or verilog
 }

因为我同时处理 Verilog 和 VHDL.I 需要通过考虑 VHDL 不区分大小写来重组我的令牌名称。 我想对 cases.What 都使用单个解析器,这可能是最有效的方法吗? flex 是否支持某种功能以允许不区分大小写的模式匹配,如果文件格式是 Verilog,我们稍后可以检查标记名称是否经过清理(全部为小写字母)?

Flex 使用以下语法支持模式内部不区分大小写:

(?i:...)

:) 之间的模式将不考虑大小写进行扫描。

而不是 暗示输入是 "sanitized",变成小写,或以任何方式修改。如果你愿意,那是你的责任。这意味着(例如):

(?i:KeyWord)

将匹配任何输入 KEYWORDkeywordkEywOrd

如果你有一个古老的 flex 版本(早于 2.5.34,2007 年底发布)并且出于某种原因你不想升级,你需要习惯这样写模式:

[Kk][Ee][Yy][Ww][Oo][Rr][Dd]

您仍然可以在旧的扫描仪定义文件中找到示例。