2011-05-03 82 views
0

我正在寻找一种方法来解析文件的特定部分。例如,让我们看看:Bison Flex令牌用于读取每个未定义的令牌

if {$cpf_step == "pre_restruct"} { 
create_power_domain  -name domain_GPU_SW \ 
      -shutoff_condition "!$mali_pso_condition_pin" \ 
      -instances "$GPU_SW_instances_list" 
} else { 
create_power_domain  -name domain_GPU_SW \ 
      -shutoff_condition "!$mali_pso_condition_pin" 
}    

我对create_power_domain命令感兴趣。我有一个使用不同标记的规则。下面是我使用规则 [编辑]当然,有一些事情前,这种提取物藏汉其他一个create_power_domain命令,我感兴趣的解析[/编辑]

file :list_of_statement 
; 

list_of_statement: statement 
    | list_of_statement statement 
    ; 

statement: power_domain 
| T_EVERY_OTHER_THING_I_READ 
; 

power_domain: K_CREATE_POWERDOMAIN K_NAME K_IDENTIFIER options_list 

现在,你可以理解,我想以后只检查每个电源域是否与语法对应,而我不想关心其他所有内容。

在我的Flex标记生成器,我试过
.* {return T_EVERY_OTHER_THING_I_READ; } 但后来我想起莱克斯尝试找到最长匹配的正则表达式,这意味着现在一切都将是一个T_EVERY_OTHER_THING_I_READ令牌,我不会找到我的例如K_CREATE_POWERDOMAIN。

我的问题是如何忽略不属于我感兴趣的规则的一部分?

如果你有进一步的问题随时问。

谢谢

回答

1

假设power_domain由空格,制表符或换行分隔,不包括那些来自T_EVERY_OTHER_THING_I_READ应该帮助,所以尝试像[^\n\r\t ]* {return T_EVERY_OTHER_THING_I_READ; }(未经测试)

+0

这似乎这样的伎俩。谢谢。现在我只能将我感兴趣的内容考虑在内,我只需要找出如何忽略power_domain之外的某个K_NAME之类的内容。现在我选择像'statement:power_domain \t | list_of_identifier \t | K_NAME',但我会尝试简单地找到如何将每个令牌设置为T_EVERY_OTHER_THING_I_READ,前提是我没有找到K_CREATE_POWERDOMAIN!再次感谢您 – djfoxmccloud 2011-05-03 09:54:29

+0

我回到我的标记器上,事实上这条规则不适用于我的其他标记。太多的人被归类为T_EVERY_OTHER_THING_I_READ – djfoxmccloud 2011-06-08 12:56:53