Lex中的操作可以访问各个正则表达式组吗?
(注意:我猜不是,因为组字符-括号是根据用于更改优先级的documentation而定的。但是,如果是这样,您是否推荐一种可以做到这一点的替代C / C ++扫描仪生成器?编写我自己的词法分析器并不是很热。)
例:
假设我有以下输入:foo [tagName attribute="value"] bar
,我想使用Lex / Flex提取标签。我当然可以写出以下规则:
\[[a-z]+[[:space:]]+[a-z]+=\"[a-z]+\"\] printf("matched %s", yytext);
但是假设我要访问字符串的某些部分,例如属性,但不必再次解析yytext(因为字符串已经被扫描,因此再次扫描部分字符串实际上没有任何意义)。因此,最好使用这样的东西(正则表达式组):
\[[a-z]+[[:space:]]+[a-z]+=\"([a-z]+)\"\] printf("matched attribute %s", $1);
最佳答案
您可以将其分开以启动条件。像这样:
%x VALUEPARSE ENDSTATE
%%
char string_buf[100];
<INITIAL>\[[a-z]+[[:space:]]+[a-z]+=\" {BEGIN(VALUEPARSE);}
<VALUEPARSE>([a-z]+) (strncpy(string_buf, yytext, yyleng);BEGIN(ENDSTATE);} //getting value text
<ENDSTATE>\"\] {BEGIN(INITIAL);}
%%
关于替代的C / C ++扫描仪生成器-我将QT类QRegularExpression用于相同的事情,匹配后很容易获得regex组。