在LEX中打印匹配字符串的一部分

时间:2016-02-27 21:18:14

标签: compiler-construction flex-lexer lex

我想在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);

这是代码的一部分,而不是完整的代码。任何帮助表示赞赏

1 个答案:

答案 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这样的工具要好得多。

相关问题