简体   繁体   English

FLEX C++ yytext function

[英]FLEX C++ yytext function

The code isn't wrote in English(variable names, but that shouldn't be a problem).代码不是用英文写的(变量名,但这应该不是问题)。 The yytext function doesn't copy what I want to copy. yytext function 没有复制我想复制的内容。 Here is the relevant code from.l file:这是.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++;
}

Here is the text file (input):这是文本文件(输入):

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

And there is the output (It copys corectly only the variables which are after the ',' as you see):还有 output(如您所见,它只复制 corectly 之后的变量):

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   

yytext is a variable, not a function. Moreover, it's a variable whose value is only available inside a (f)lex action. yytext是一个变量,而不是 function。此外,它是一个变量,其值仅在 (f)lex 操作中可用。

Making a copy of yytext inside a parser action is way too late.在解析器操作中制作yytext的副本为时已晚。 You have to do it in the lexer action.您必须在词法分析器操作中执行此操作。

Every time the lexer is asked for a new token, it overwrites yytext , so at best yytext is the last token in the production.每次要求词法分析器提供新标记时,它都会覆盖yytext ,因此yytext最多是产生式中的最后一个标记。 But it might be the next token, because sometimes the parser needs to look at the next token before it knows it can reduce a production.但它可能是下一个标记,因为有时解析器需要查看下一个标记才能知道它可以减少生产。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM