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

时间:2015-01-05 19:47:37

标签: vhdl verilog yacc flex-lexer lex

我的文件结构是,

`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。我需要重新构建我的令牌名称,记住VHDL不区分大小写。 我想对这两种情况使用单一解析器。同样的最有效方法是什么? flex是否支持某种功能以允许不区分大小写的模式匹配,如果文件的格式是Verilog,我们以后可以检查是否清除了令牌名称(包含所有小写字母)?

1 个答案:

答案 0 :(得分:5)

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

(?i:...)

之间的模式将被扫描而不考虑大小写。

暗示输入已被清理",变成小写,或以任何方式修改。如果你想这样做,那是你的责任。它意味着(例如):

(?i:KeyWord)

将匹配任何输入KEYWORDkeywordkEywOrd等。

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

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

您仍会在较旧的扫描仪定义文件中找到示例。