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

Vhdl 如何编写不区分大小写的Lex模式规则?,vhdl,verilog,yacc,flex-lexer,lex,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 } 由于我同

我的文件结构是

`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?

flex使用以下语法支持模式内的大小写不敏感:

(?i:...)
将扫描:和之间的图案,而不考虑大小写

这并不意味着输入被“消毒”,变成小写,或以任何方式修改。这是你的责任,如果你想这样做的话。这意味着(例如):

将匹配任何输入
关键字
关键字
关键字
,等等

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

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

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

您认为用一种语法处理两种语言是一个好主意吗?您正在尝试将VHDL和Verilog嵌入到单个文件或文本流中吗?Flex/Lex使用-i参数支持此功能。它将生成不区分大小写的解析器。哪个版本的Flex支持此功能?我无法使用flex 2.5.4版中的功能,或者可能是我做错了什么。这是使用(?i:“begin”){//action}的正确方法吗?@AnkurGautam:您需要版本2.5.34(发布于2007-12-12),但我建议升级到当前版本,而不是从20年前的版本升级到7年前的版本。您的语法很好,尽管不需要引号,
(?i:begin)
也可以。
[Kk][Ee][Yy][Ww][Oo][Rr][Dd]