Advertisement
Ladies_Man

#COMPLR Lab6 (Flex) COMPLETE

Apr 26th, 2016
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.73 KB | None | 0 0
  1. /*Порождение лексического анализатора с помощью flex 2.5.35
  2.  
  3. Строковые литералы: ограничены двойными кавычками, для включения двойной
  4. кавычки она удваивается, для продолжения литерала на следующей строчке
  5. текста в конце текущей строчки ставится знак "\".
  6. Числовые литералы: либо последовательности десятичных цифр, либо последовательности
  7. шестнадцатеричных цифр, начинающиеся с "$".
  8. Идентификаторы: последовательности буквенных символов ASCII, цифр и знаков "$", начинающиеся с буквы.
  9. */
  10.  
  11. flex flexlutor.l
  12. gcc lex.yy.c -lfl
  13. ./a.out
  14.  
  15.  
  16.  
  17. %option noyywrap bison-bridge bison-locations
  18.  
  19. %{
  20.  
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23.  
  24. #define TAG_IDENT       1
  25. #define TAG_NUMBER      2
  26. #define TAG_STRING      3
  27. #define TAG_ERROR       4
  28.  
  29. char *tag_names[] = {
  30.     "END_OF_PROGRAM", "IDENT", "NUMBER", "STRING", "ERROR"
  31. };
  32.  
  33. struct Position {
  34.     int line, pos, index;
  35. };
  36.  
  37. void print_pos(struct Position *p) {
  38.     printf("(%d, %d)", p->line, p->pos);
  39. }
  40.  
  41. struct Fragment {
  42.     struct Position starting, following;
  43. };
  44.  
  45. typedef struct Fragment YYLTYPE;
  46.  
  47. void print_frag(struct Fragment *f) {
  48.     print_pos(&(f->starting));
  49.     printf(" - ");
  50.     print_pos(&(f->following));
  51. }
  52.  
  53. union Token {
  54.     char *tokenName;
  55. };
  56.  
  57. typedef union Token YYSTYPE;
  58.  
  59. int continued;
  60. struct Position cur;
  61.  
  62. #define YY_USER_ACTION                  \
  63. {                                       \
  64.     int i;                              \
  65.     if (!continued)                     \
  66.         yylloc->starting = cur;         \
  67.     continued = 0;                      \
  68.     for (i = 0; i < yyleng; i++) {      \
  69.         if ('\n' == yytext[i]) {        \
  70.             cur.line++;                 \
  71.             cur.pos = 1;                \
  72.         }                               \
  73.         else                            \
  74.             cur.pos++;                  \
  75.         cur.index++;                    \
  76.     }                                   \
  77.     yylloc->following = cur;            \
  78. }                                       \
  79.  
  80. void init_scanner(char *program) {
  81.     continued = 0;
  82.     cur.line = 1;
  83.     cur.pos = 1;
  84.     cur.index = 0;
  85.     yy_scan_string(program);
  86. }
  87.  
  88. void err(char *msg) {
  89.     printf("Error ");
  90.     print_pos(&cur);
  91.     printf(": %s\n", msg);
  92. }
  93.  
  94. %}
  95.  
  96. STRING      ["]([^"\n\\]|["]["]|[\\][\n])*["]
  97. NUMBER      [0-9]+|\$0[xX][a-fA-F0-9]+
  98. IDENT       [a-zA-Z][a-zA-Z0-9\$]*
  99.  
  100. %%
  101.  
  102. [\n\t ]+
  103.  
  104. {IDENT}     {
  105.                yylval->tokenName = yytext;
  106.                return TAG_IDENT;
  107.            }
  108.  
  109. {NUMBER}    {
  110.                yylval->tokenName = yytext;
  111.                return TAG_NUMBER;
  112.            }
  113.  
  114. {STRING}    {
  115.                yylval->tokenName = yytext;
  116.                return TAG_STRING;
  117.            }
  118.  
  119. <<EOF>>     return 0;
  120.  
  121. .           {
  122.                err("Unexpected character");
  123.                return TAG_ERROR;
  124.            }
  125.  
  126. %%
  127.  
  128. #define PROGRAM "1337  $xXx \"string with \"\" doubled quotes\"\" and  \\\n linebreak\" $0xFF An7h0ny 3NUM L33t"
  129.  
  130. int main()
  131. {
  132.     int tag;
  133.     YYSTYPE value;
  134.     YYLTYPE coords;
  135.  
  136.     init_scanner(PROGRAM);
  137.  
  138.     do {
  139.         tag = yylex(&value, &coords);
  140.         if (0 != tag && TAG_ERROR != tag) {
  141.           printf("%s ", tag_names[tag]);
  142.             print_frag(&coords);
  143.             printf(": %s\n", value.tokenName);
  144.         }
  145.     } while (0 != tag);
  146.  
  147.     return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement