Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- #include <stdio.h> /* printf() */
- #include <string.h> /* strcpy */
- #include <stdlib.h> /* atoi(), atof() */
- #include "common.h" /* MAX_STR_LEN */
- #include "c.tab.h" /* deklaracja symboli końcowych */
- /* wypisanie informacji o znalezionym symbolu końcowym */
- int process_token(const char *text, const char *TokenType,
- const char *TokenVal, const int TokenID);
- int comm_beg = 0; /* wiersz rozpoczęcia komentarza */
- %}
- /* deklaracja warunków początkowych analizatora */
- /* (nie deklarujemy domyślnego warunku INITIAL) */
- /* ..................... */
- %x STRING
- %x COMMENT
- %option yylineno
- %%
- /* tu należy umieścić odpowiednie reguły w odpowiedniej kolejności */
- /* B: Slowa kluczowe */
- char return process_token(yytext, "KW_CHAR", "", KW_CHAR);
- unsigned return process_token(yytext, "KW_UNSIGNED", "", KW_UNSIGNED);
- short return process_token(yytext, "KW_SHORT", "", KW_SHORT);
- int return process_token(yytext, "KW_INT", "", KW_INT);
- long return process_token(yytext, "KW_LONG", "", KW_LONG);
- float return process_token(yytext, "KW_FLOAT", "", KW_FLOAT);
- void return process_token(yytext, "KW_VOID", "", KW_VOID);
- for return process_token(yytext, "KW_FOR", "", KW_FOR);
- double return process_token(yytext, "KW_DOUBLE", "", KW_DOUBLE);
- if return process_token(yytext, "KW_IF", "", KW_IF);
- else return process_token(yytext, "KW_ELSE", "", KW_ELSE);
- while return process_token(yytext, "KW_WHILE", "", KW_WHILE);
- do return process_token(yytext, "KW_DO", "", KW_DO);
- struct return process_token(yytext, "KW_STRUCT", "", KW_STRUCT);
- /* C: Biale znaki */
- [ \n\t]+
- /* D */
- "//".*$
- /* E */
- "++" return process_token(yytext, "INC", "", INC);
- "<=" return process_token(yytext, "LE", "", LE);
- /* F: Identyfikatory */
- [A-Za-z_][A-Za-z0-9_]* return process_token(yytext, "IDENT", yytext, IDENT);
- /* G: Liczby Calkowite */
- [0-9]+ return process_token(yytext, "INTEGER_CONST", yytext, INTEGER_CONST);
- /* G: Zmiennoprzecinkowe */
- (([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+))([eE](\+|-)?[0-9]{1,2})? return process_token(yytext, "FLOAT_CONST", yytext, FLOAT_CONST);
- /* I: stale znakowe */
- '[^'\n]{1,2}' return process_token(yytext, "CHARACTER_CONST", yytext, CHARACTER_CONST);
- /* J wykrywanie symboli końcowych jednoznakowych */
- [;{},=\[\]()\+\-\*/<>\?\:\.] return process_token(yytext, yytext, "", *yytext);
- /* Podpunkty K - O */
- /* K Dyrektywy */
- ^#include.*$ return process_token("Przetwarzenie", yytext, "", IDENT);
- ^#define.*$ return process_token("Przetwarzenie", yytext, "", IDENT);
- /* L Napisy warunki poczatkowe */
- <INITIAL>\" { BEGIN(STRING); yymore(); }
- <STRING>\" { BEGIN(INITIAL); return process_token(yytext, "STRING_CONST", yytext, STRING_CONST); }
- <STRING>. yymore();
- <STRING>\n { printf("Niezamkniety napis otwarty w wierszu %d\n", yylineno - 1); BEGIN(INITIAL); }
- /* Komentarze (na warunkach poczatkowych M, N, O */
- <INITIAL>"/*" { yymore(); BEGIN(COMMENT); comm_beg = yylineno; }
- <COMMENT>.|\n { yymore(); }
- <COMMENT>"*/" { BEGIN(INITIAL); }
- <INITIAL>"*/" { printf("Nieoczekiwane zamkniecie komentarza w wierszu %d\n", yylineno); }
- %%
- /* Nazwa: process_token
- * Cel: Wypisanie informacji o wykrytym elemencie i przekazanie
- * tej informacji wyżej z ewentualną wartością elementu, jeśli
- * takowa występuje.
- * Parametry: text - (i) tekst, do którego nastąpiło dopasowanie;
- * TokenType - (i) napis będący tekstową reprezentacją
- * nazwy typu elementu;
- * TokenVal - (i) wartość elementu, o ile występuje;
- * TokenID - (i) identyfikator typu elementu zadeklarowany
- * za pomocą dyrektywy %token
- * w pliku c.y lub kod pojedynczego
- * znaku (w pliku analizatora składniowego
- * występuje ujęty w apostrofy).
- * Zwraca: Identyfikator typu elementu (TokenID).
- * Uwagi: Informacja o wykrytym elemencie zwracana jest
- * w trzech kolumnach. W pierwszej wypisywany jest tekst,
- * do którego nastąpiło dopasowanie, w drugiej - typ elementu,
- * w trzeciej - wartość elementu (o ile występuje).
- */
- int process_token(const char *text, const char *TokenType,
- const char *TokenVal, const int TokenID)
- {
- int l;
- printf("%-20.20s%-15s %s\n", text, TokenType, TokenVal);
- switch (TokenID) {
- case INTEGER_CONST:
- yylval.i = atoi(text); break;
- case FLOAT_CONST:
- yylval.d = atof(text); break;
- case IDENT:
- strncpy(yylval.s, text, MAX_STR_LEN); break;
- case STRING_CONST:
- l = strlen(TokenVal);
- strncpy(yylval.s, TokenVal + 1, l - 2 <= MAX_STR_LEN ? l - 1 : MAX_STR_LEN);
- break;
- case CHARACTER_CONST:
- yylval.i = text[1]; break;
- }
- return(TokenID);
- }
- int yywrap( void )
- { /* funkcja wywoływana po napotkaniu końca strumienia wejściowego
- /* sprawdzenie, czy warunek poczatkowy YY_START różni się od INITIAL. */
- /* Jeżeli tak, to oznacza to niezamknięty komentarz lub stała tekstową
- - wypisujemy informację o błędzie. */
- /* ..................... */
- if(YYSTATE == COMMENT)
- printf("Brak zamkniecia komentarza otwartego w wierszu %d\n", comm_beg);
- return( 1 ); /* koniecznie, by analiza nie rozpoczęła się od nowa */
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement