本文介绍了如何来标记中的字符串Lex和Yacc的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
参照Reading在LEX YACC 新的生产线给语法错误
我们使用的lex文件
%{
/ *
解析器SSA;
* / #包括LT&;&stdio.h中GT;
#包括LT&;&stdlib.h中GT;
的#includey.tab.h
%}
%%
[\\ t] +;
\\ n; [IF] +的printf(第一个输入\\ n);
[其他] +回报(OP);
[=] +回报(等于);
[+] +回报(OP);
[*] +回报(OP);
[ - ] +回报(OP); [\\&下;] [B] [B] [] + [1-9] [\\]的计算值{返回(BBLOCK);} ([_] [A-Z]])|([A-Z] [_] [0-9] +)|([0-9] +){回报(VAR);} 。 ;
%%
是我应该做的,如果我想获得令牌作为一个字符串即A_2
怎么办呢????
输入文件
A_2 = 1-6 + B_3;
a_8 = b_7 - C_5;
解决方案
您可以在您的野牛文件中定义的记号类型:
%{工会
字符*串;
}%令牌LT;字符串> VAR
,然后替换
回归(VAR);
与
yylval.string =的malloc(yyleng); sprintf的(yylval.string%s,yytext中);返回VAR;
with reference to Reading new line giving syntax error in LEX YACC lex file we are using
%{
/*
parser for ssa;
*/
#include<stdio.h>
#include<stdlib.h>
#include"y.tab.h"
%}
%%
[\t]+ ;
\n ;
[if]+ printf("first input\n");
[else]+ return(op);
[=]+ return(equal);
[+]+ return(op);
[*]+ return(op);
[-]+ return(op);
[\<][b][b][ ]+[1-9][\>] {return(bblock);}
([[_][a-z]])|([a-z][_][0-9]+)|([0-9]+) {return(var);}
. ;
%%
what should i do if i want to get token as a string i.e a_2how to do it????
input file is
a_2 = _6 + b_3;
a_8 = b_7 - c_5;
解决方案
You can define token type in your bison file:
%union{
char *string;
}
%token <string> var
and then replace
return(var);
with
yylval.string=malloc(yyleng); sprintf(yylval.string,"%s",yytext);return var;
这篇关于如何来标记中的字符串Lex和Yacc的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!