FLEX C++ ytext函数

cu6pst1q  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(89)

代码不是用英语写的(变量名,但这应该不是问题)。yytext函数没有复制我想复制的内容。下面是来自.l文件的相关代码:

`progr: declaratii bloc {printf("program corect sintactic\n");}
     ;

declaratii :  declaratie ';'
       | declaratii declaratie ';'
       | declaratii structura 
       | declaratii clasa ';'
       | declaratii function 
       | function
       | clasa ';'
       | structura 
       ;

declaratie : INT var_int 
           | INT lista_int
           | CHAR var_char
           | CHAR lista_char
           | FLOAT var_float
           | FLOAT lista_float
           | STRING var_string
           | STRING lista_string
           | BOOL var_bool
           | BOOL lista_bool
           ;

lista_int : ID '(' lista_param_int ')' {add("lista", "int");}
     | ID '(' ')' {add("lista", "int");}
     | lista_int ',' ID '(' lista_param_int ')' {add("lista", "int");}
     | lista_int ',' ID '(' ')' {add("lista", "int");}
     ;
var_int : ID {add("var", "int");}
     | var_int ','  ID {add("var", "int");}
     ;
lista_param_int : INT ID 
            | lista_param_int ',' INT ID 
            ;

lista_char : ID '(' lista_param_char ')' {add("lista", "char");}
     | ID '(' ')' {add("lista", "char");}
     | lista_char ',' ID '(' lista_param_char ')' {add("lista", "char");}
     | lista_char ',' ID '(' ')' {add("lista", "char");}
     ;

void add(char * tip, char * tipDate){
     symbol_table[contor].nume = strdup(yytext) ;
     symbol_table[contor].tip = tip;
     symbol_table[contor].tipDate = tipDate;
     contor++;
}

下面是文本文件(输入):

class Test{
    private:
        int @x;
    public:
        int @z;
    protected:
        char @o;
        int @tr2;
    protected:
        float @k;
        int @dasdas(int @var23);
};
struct structura{
    char @nume;
    char @tip;
};

float functie($int @var0 : char @sir : bool @binar){
    $int @var1;
    $@var1 := 1;
    $if'(@var1 :== 1){
        @var1 := 2;
        if'(@var1 :== 2){
            @var1 := 3;
        }
    }
    $@var1 := 8;
    $int @var2;
    $int @var3, @var4;
    $@var2 := 6;
}

int @a, @b, @c;
int @xz, @dsada;
int @d(), @xsadas(int @arata);
char @c;
begin_progr
@a := 3;
if'(@a :== 3){
    @a := 2;
}
end_progr

这是输出(它只正确地复制了','后面的变量,如您所见):

nume      tip      tipDate
;          var      int      
;          var      int      
;          var      char      
;          var      int      
;          var      float      
)          lista      int      
;          var      char      
;          var      char      
:          var      int      
:          var      char      
)          var      bool      
;          var      int      
;          var      int      
,          var      int      
@var4          var      int      
,          var      int      
@b          var      int      
@c          var      int      
,          var      int      
@dsada          var      int      
)          lista      int      
)          lista      int      
;          var      char
os8fio9y

os8fio9y1#

yytext是一个变量,而不是函数,而且它的值只能在(f)lex动作中使用。
在解析器动作中复制yytext已经太晚了,必须在词法分析器动作中完成。
每次lexer被请求一个新的token,它都会覆盖yytext,所以yytext最多是生成中的最后一个token,但它也可能是下一个token,因为有时解析器需要查看下一个token才知道它可以减少一个生成。

相关问题