FLEX:有没有办法一次返回多个标记


7

在flex中,我想为正则表达式的一个匹配返回多个标记。有没有办法做到这一点?

0

你是指所有比赛?你正在使用正则表达式函数或字符串函数吗?使用全局标志。

至于flex,我认为你不能这样做。您一次测试一种模式的匹配,因此可能超出范围。你为什么要那个?作为优化?范围界定问题?

  0

说实话,我相当新的flex和我不确定。我以为我正在使用正则表达式和字符串匹配的组合。 下面是一个例子 “(” \t \t {返回L_PAREN;} {INT} {yylval.Int =的atoi(yytext中);返回INT;} 我想是能够在一次返回两个令牌。 22 2月. 092009-02-22 09:44:23


2

我一直这样做的方法是创建一个待返回令牌队列,并在yylex()开头,检查令牌并返回它们。


-1

通常,这是由扫描器顶部的解析器处理的,它为您提供了更简洁的代码。你可以模仿在一定程度上与各州:

%option noyywrap 

%top { 
#define TOKEN_LEFT_PAREN 4711 
#define TOKEN_RIGHT_PAREN 4712 
#define TOKEN_NUMBER  4713 
} 

%x PAREN_STATE 
%% 
"("   BEGIN(PAREN_STATE); return TOKEN_LEFT_PAREN; 
<PAREN_STATE>{ 
    [0-9]+ return TOKEN_NUMBER; 
    ")"  BEGIN(INITIAL); return TOKEN_RIGHT_PAREN; 
    .|\n  /* maybe signal syntax error here */ 
} 
%% 
int main (int argc, char *argv []) 
{ 
    int i; 

    while ((i = yylex())) 
    printf ("%d\n", i); 

    return 0; 
} 

但是这将变得非常凌乱,只要你的语法变得更加复杂。