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); }