2013-11-04 63 views
2

處理考慮這種lex.l文件:半保留字在撓曲/野牛

%{ 
#include "y.tab.h" 
%} 

digit   [0-9] 
letter  [a-zA-Z] 

%% 
"+"     { return PLUS;  } 
"-"     { return MINUS;  } 
"*"     { return TIMES;  } 
"/"     { return SLASH;  } 
"("     { return LPAREN;  } 
")"     { return RPAREN;  } 
";"     { return SEMICOLON; } 
","     { return COMMA;  } 
"."     { return PERIOD;  } 
":="     { return BECOMES; } 
"="     { return EQL;  } 
"<>"     { return NEQ;  } 
"<"     { return LSS;  } 
">"     { return GTR;  } 
"<="     { return LEQ;  } 
">="     { return GEQ;  } 
"begin"    { return BEGINSYM; } 
"call"    { return CALLSYM; } 
"const"    { return CONSTSYM; } 
"do"     { return DOSYM;  } 
"end"    { return ENDSYM;  } 
"if"     { return IFSYM;  } 
"odd"    { return ODDSYM;  } 
"procedure"   { return PROCSYM; } 
"then"    { return THENSYM; } 
"var"    { return VARSYM;  } 
"while"    { return WHILESYM; } 
{letter}({letter}|{digit})* { 
         yylval.id = strdup(yytext); 
         return IDENT;  } 
{digit}+    { yylval.num = atoi(yytext); 
         return NUMBER;  } 
[ \t\n\r]   /* skip whitespace */ 
.     { printf("Unknown character [%c]\n",yytext[0]); 
         return UNKNOWN; } 
%% 

int yywrap(void){return 1;} 

在這個例子中標識不能是保留字,因爲這將上述匹配。 在這種情況下是否允許定義標識符作爲保留字?

回答

5

我認爲你正在尋找的是解析器告訴詞法分析器在給定上下文中保留哪些詞的方法。然而,這並不容易,特別是因爲解析器在任何操作發生之前都經常讀取lookahead標記。

一個簡單的辦法是適當地設置yylval任何半保留字,然後用類似這樣的作品在您的解析器:

id_or_procedure: IDENTIFIER | PROCSYM; 

id_or_conditional: IDENTIFIER | THENSYM | ODDSYM; 

這是不容易保持,因爲它需要你去找出哪些半保留字適用於哪些上下文。但是,如果您只有幾個半保留字,並且只保留在某些特定的上下文中,那麼這是非常可行的。