代码不是用英语写的(变量名,但这应该不是问题)。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
1条答案
按热度按时间os8fio9y1#
yytext
是一个变量,而不是函数,而且它的值只能在(f)lex动作中使用。在解析器动作中复制
yytext
已经太晚了,必须在词法分析器动作中完成。每次lexer被请求一个新的token,它都会覆盖
yytext
,所以yytext
最多是生成中的最后一个token,但它也可能是下一个token,因为有时解析器需要查看下一个token才知道它可以减少一个生成。