String 使用$x从规则中获取字符串

String 使用$x从规则中获取字符串,string,bison,flex-lexer,String,Bison,Flex Lexer,我正试图在野牛镇做这样的事 loop_for: FOR var_name COLONEQUALS expression TO {printf("%s<=", $2);} expression STEP {printf("%s+=", $2);} expression {printf(")\n");} Code ENDFOR 野牛规则: loop_for: FOR var_name {strcpy(myvar,

我正试图在野牛镇做这样的事

loop_for:   FOR var_name COLONEQUALS expression TO
            {printf("%s<=", $2);} expression STEP
            {printf("%s+=", $2);} expression {printf(")\n");}
            Code ENDFOR
野牛规则:

loop_for:   FOR var_name {strcpy(myvar, $<strV>2);} COLONEQUALS expression TO {printf("%s<=", myvar);} expression STEP {printf("%s+=", myvar);} expression {printf(")\n");} Code ENDFOR
var_name:   name_first_is_char
name_first_is_char: character | character name2
name2:  | character name2 | digit name2
我得到的结果是:

for ( i = 0 ; i :=<= 10 ; i :=+= 1

for(i=0;i:=否,
$x
符号不仅限于整数值(当然,
x
必须是整数,但
$x
表示的值不限于整数值)

看看这个问题是否有帮助:


我通过在flex中使用正则表达式识别变量名,并将它们传递给字符串,然后将其从Bison中删除,并可随时使用,从而成功地绕过了Bison的$x

所以有些改变是

弯曲

野牛

野牛

loop\u for:for var\u name COLONEQUALS NUMBER TO NUMBER STEP NUMBER

{ %s= %s;%s> p>你需要考虑的是YyType是一个字符的指针。这个字符序列总是在Flex中改变,但是YyType(指针)是常量。您最初的flex规则只是在yylval中设置该指针。因此,当解析器继续时,它也会吞没输入中的:=。这就是为什么在flex中,您应该复制字符串,并在匹配后立即将其存储在某个位置。该位置可能是yylval union中的某个字段。在此之前,我始终为所有常量和变量名使用malloc空格e在Bison中使用它们。

我读了这个问题,以及其中链接的问题,它们非常有用。我想在FLEX中,我必须使用一个规则,将所有字符解析在一起,并执行类似“yylval.strV=yytext;”的操作。但是,我发现这样我就不能对“and”和“OR”使用单独的FLEX规则"哦,天啊。等等,没有。在把这些规则移到字符解析规则之后,我就把它编译了。我会回来更新的。谢谢你的信息,这实际上解释了我上面提供的解决方案背后的理论。看起来你在试着写一个解释器?你可能想考虑一下。防止内存泄漏的符号表。
FOR i := 0 TO 10 STEP 1
for ( i = 0 ; i :=<= 10 ; i :=+= 1
var_name:   name_first_is_char {memset(myvar, '\0', BUFFER_LENGTH); sprintf(myvar, "%s", $<strV>1);}
char tempvar[1000];
[a-zA-Z][a-zA-Z0-9]*    {printf("%s",yytext); strcpy(tempvar,yytext); lisnew=0; yylval.strV = yytext; return VARNAME;}
extern char tempvar[];
var_name:    VARNAME {strcpy(myvar, tempvar);}
loop_for:   FOR var_name COLONEQUALS number TO {printf("%s<=", myvar);} number STEP {printf("%s+=", myvar);} number {printf(")\n"); instabs(); printf("{\n"); t++; instabs();} Code ENDFOR
[a-zA-Z][a-zA-Z0-9]*    { yylval = strdup(yytext); return VARNAME;}
[1-9][0-9]*|0           { yylval = strdup(yytext); return NUMBER; }
loop_for:   FOR var_name COLONEQUALS NUMBER TO NUMBER STEP NUMBER
    { printf("for (%s = %s; %s <= %s; %s += %s)\n", $2, $4, $2, $6, $2, $8); }