2016-02-27 84 views
1

我想用lex打印以C語言編寫的函數的參數。現在,我想在格式打印的參數:在LEX中打印部分匹配的字符串

參數:

int類型的X1

float類型

物聯網X2試圖至今: 1)我能夠打印參數,但輸出中包含起始和結束括號。 用於該匹配正則表達式是:

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,X2浮動);

這是代碼的一部分,而不是完整的代碼。任何幫助表示讚賞

回答

3

你想實際解析輸入文本,闖入相關的部分。這是解析器(比如野牛)的工作,而不是正則表達式識別器(比如flex),儘管你需要一個正則表達式識別器來識別這些記號。

如果你真的需要做到這純粹是在(F)法,您可以使用啓動狀態建立一個(有限)解析器:

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

這樣任何一種不平凡的解析器是無錯誤容易和乏味。使用像bison或yacc這樣的工具要好得多。

+0

這很完美!謝謝。 – Unknown94