我想在lex中打印用C编写的函数的参数。现在我希望以下面的格式打印参数:
参数:
类型为int的x1
类型为float的x2
到目前为止尝试的事情: 1)我能够打印参数但是包含在otuput中的起始和结束括号。 用于此匹配的正则表达式为:
datatypes (("int")|("float")|("void")|("double")|("char")|("short")|("long"))
blanks [ ]
letter [a-z]
digits [0-9]
id ({letter}|_)({letter}|{digits}|_)*
arguments "("{datatypes}{blanks}+{id}{blanks}*","{blanks}*{datatypes}{blanks}+{id}{blanks}*")";
这是声明部分。在规则部分:
%%
{arguments} {ECHO; fprintf(outputfile1,""Arguments:"%s\n",yytext);}
%%
获得的输出: 参数:(int x1,float x2);
这是代码的一部分,而不是完整的代码。任何帮助表示赞赏
答案 0 :(得分:3)
您想要实际解析输入文本,分成相关部分。这是解析器(例如bison)的工作,而不是正则表达式识别器(如flex),尽管你需要一个正则表达式识别器来识别令牌。
如果你真的需要纯粹在(f)lex中这样做,你可以使用开始状态构建一个(有限的)解析器:
%s ARGLIST1, ARGLIST2, ARGLIST3
%{
static char type[16];
%}
%%
<INITIAL>"(" { fprintf(output, "Arguments:\n");
BEGIN(ARGLIST1); }
<ARGLIST1>{datatypes} { strcpy(type, yytext); BEGIN(ARGLIST2); }
<ARGLIST2>{id} { fprintf(output, "%s of type %s\n", yytext, type);
BEGIN(ARGLIST3); }
<ARGLIST3>"," { BEGIN(ARGLIST1); }
<ARGLIST3>")" { BEGIN(INITIAL); }
{blanks} ;
为任何类型的非平凡解析器执行此操作都容易出错且乏味。使用像野牛或yacc这样的工具要好得多。