在yytext中只有flex中匹配字符串的一部分

时间:2011-03-17 20:41:41

标签: lex flex-lexer

我是新手,但我想知道我是否可以使用flex,用正则表达式解析某些东西,yytext只会是匹配序列的一部分。例如:@abcd{efgh,。我希望匹配abcd一次,然后使用它efgh,,但我需要使用@和{来匹配它们。这是可能的还是我必须在C中完全处理它?<​​/ p>

1 个答案:

答案 0 :(得分:1)

您可以在'/'运算符中使用以下上下文。对于eaxmple,

abcd/efgh

只有当字符串“abcd”后跟“efgh”时才匹配,后一个字符串留在输入上,所以它将是下一个匹配标记的(部分)。

我不确定你对“@”和“{”的确切要求是什么 - 你想要匹配它们但只是忽略它们,或者你想将它们作为单独的标记返回?对于前者,您可以使用"@abcd"/"{efgh",然后只使用yytext + 1来获取“abcd”。后者更复杂,但可以使用flex的状态来完成。您可以执行以下操作:

%x at

%%

"@"        { BEGIN(at); return *yytext; }
<at>"abcd" { BEGIN(INITIAL); return ABCD; }

匹配“abcd”只有当它紧跟在自己匹配的“@”之后才会匹配。

你可以使用start状态在flex中做很多复杂的事情,但是通常尝试解析非常规语言是一个坏主意 - 你最好使用像野牛这样的解析工具。