如何使用flex / bison跳过不必要的文本序列?

时间:2015-04-23 16:21:35

标签: bison flex-lexer

我有一个大型文本文档,其中包含一些纯文本和类定义。我想要的是使用flex / bison将类定义与纯文本分开。

我尝试了下一个提示:

test.l
...
"class" :  { return CLASS;} 
"aligned": { return ALIGNED;} 
"extends": { return EXTENDS;} 
...
.* {return UNKNOWN;}

test.y
DocText : plainText
 | classDefinitions 
 | plainText classDefinitions DocText
 { printf (" parsed iso doc!\n" );};

plainText: UNKNOWN | UNKNOWN plainText;

这不起作用。谁能请我就如何解决这个问题给我一些建议。

PS:对不起我的英语。

1 个答案:

答案 0 :(得分:1)

  1. 不要在flex模式中使用冒号(除非你想匹配冒号)。模式

    "class":
    

    只会匹配

    class:
    
  2. Flex总是选择最长的匹配。如果多个规则与最长匹配匹配,则它仅优先于早期规则。所以,如果你有

    class { return CLASS; }
    .*    { return LINE; }
    

    ,输入

    class something
    

    Flex将整条线匹配为LINE。只会为仅包含单词class(不包含空格)的行选择class规则。

  3. 因此,您需要在令牌识别中更精确一些。通常,即使对于简单的应用程序,您也需要正确处理(几乎)所有标记,包括字符串文字和注释。 (在这种情况下,您可以将许多关键字作为标识符进行匹配,因为您只关心几个关键字,但这只是一个小的简化。)