Есть ли способ зацикливания пара действий шаблона в программе lex? - PullRequest
0 голосов
/ 08 января 2019

Мне было интересно, есть ли средства зацикливания в разделе правил программы lex, где я могу повторять и шаблон, и действие.

как то так:

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

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

//Some functions

Можно ли сделать такую ​​итерацию?

Я ищу способ написать лексическую программу, которая бы идентифицировала все ключевые слова на языке С.

1 Ответ

0 голосов
/ 09 января 2019

Я не уверен, как именно циклы помогут вам решить эту проблему. (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; }
...