lex程序中有没有一种循环模式操作对的方法?

时间:2019-01-08 19:27:29

标签: flex-lexer lex

我想知道lex程序的规则部分是否有循环的方式,可以在其中重复模式和动作。

类似这样的东西:

%{
  char *pattern[] = {a,b,c,d,e}
%}

%%
 for(i=0,i<5,i++){
   (pattern[1]){action[i]}
 }
%%

//Some functions

是否可以进行此类迭代?

我正在寻找一种编写可以识别所有C语言关键字的lex程序的方法。

1 个答案:

答案 0 :(得分:0)

我不确定循环将如何帮助您解决此问题。 (F)lex已经循环,反复查找令牌,直到返回某些动作(或达到EOF并返回默认的EOF动作)。

要识别关键字,只需将关键字写成模式:

%{
  int keywords = 0;
%}   
%option noyywrap
%%
 /* List of keywords taken from http://port70.net/~nsz/c/c11/n1570.html#6.4.1 */
auto                    { ++keywords; }
break                   { ++keywords; }
case                    { ++keywords; }
char                    { ++keywords; }
const                   { ++keywords; }
continue                { ++keywords; }
default                 { ++keywords; }
do                      { ++keywords; }
 /* Etc. */
[[:alpha:]_][[:alnum:]_]*                ; /* Ignore other identifiers */
\.?[[:digit:]]([[:alnum:].]|[EePp][+-])* ; /* And pp-numbers */
 /* The next one matches too much; it will cause keywords inside comments
  * and quoted strings to be accepted. So you still have some work to do. */
[^[:alnum:]]+                            ; /* And everything else */

%%
int main(void) {
  yylex();
  printf("%d keywords found.\n", keywords);
  return 0;
}

如果您需要区分关键字,则需要做一些更复杂的事情。但是好的文本编辑器应该让您将关键字列表转换为任何简单的重复操作,例如

auto     { return TOKEN_auto; }