我有一个大型文本文档,其中包含一些纯文本和类定义。我想要的是使用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:对不起我的英语。
答案 0 :(得分:1)
不要在flex模式中使用冒号(除非你想匹配冒号)。模式
"class":
只会匹配
class:
Flex总是选择最长的匹配。如果多个规则与最长匹配匹配,则它仅优先于早期规则。所以,如果你有
class { return CLASS; }
.* { return LINE; }
,输入
class something
Flex将整条线匹配为LINE。只会为仅包含单词class
(不包含空格)的行选择class
规则。
因此,您需要在令牌识别中更精确一些。通常,即使对于简单的应用程序,您也需要正确处理(几乎)所有标记,包括字符串文字和注释。 (在这种情况下,您可以将许多关键字作为标识符进行匹配,因为您只关心几个关键字,但这只是一个小的简化。)