我是新手,但我想知道我是否可以使用flex,用正则表达式解析某些东西,yytext只会是匹配序列的一部分。例如:@abcd{efgh,
。我希望匹配abcd
一次,然后使用它efgh,
,但我需要使用@和{来匹配它们。这是可能的还是我必须在C中完全处理它?</ p>
答案 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中做很多复杂的事情,但是通常尝试解析非常规语言是一个坏主意 - 你最好使用像野牛这样的解析工具。