Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define MAX_STR_LEN 100
- #include "ada.tab.h"
- int process_token(const char *text, const char *TokenType,
- const char *TokenVal, const int TokenID);
- int wiersze = 0;
- %}
- /* pomocnicze */
- NUM [0-9]
- ALPHA [a-zA-Z]
- BIGALPHA [A-Z]
- ALPHANUM [a-zA-Z0-9]
- ALPHA_NUM [a-zA-Z0-9_]
- %x STRING
- %x COMMENT
- %%
- /* komentarze */
- /*"--".*$ ; */
- <INITIAL>"--" { BEGIN COMMENT; }
- <COMMENT>[^\n]+ ;
- <COMMENT>\n { BEGIN INITIAL; }
- /* usuwanie białych znaków */
- [ \t]+ ;
- \n { wiersze++; }
- /* stałe napisowe STRING_CONST */
- /* \"(\\.|[^\"])*\" { return process_token(yytext, "STRING_CONST", yytext, STRING_CONST); } */
- <INITIAL>\" { BEGIN STRING; }
- <STRING>(\\.|[^\"])* { return process_token(yytext, "STRING_CONST", yytext, STRING_CONST); }
- <STRING>\" { BEGIN INITIAL; }
- /* stałe znakowe CHARACTER_CONST */
- \'.\' { return process_token(yytext, "CHARACTER_CONST", yytext, CHARACTER_CONST); }
- /* stałe całkowite INTEGER_CONST */
- {NUM}+ { return process_token(yytext, "INTEGER_CONST", yytext, INTEGER_CONST); }
- /* stałe zmiennoprzecinkowe FLOAT_CONST */
- {NUM}+"."{NUM}+(e\-?{NUM}+)? { return process_token(yytext, "FLOAT_CONST", "", FLOAT_CONST); }
- /* słowa kluczowe KW_słowo */
- with { return process_token(yytext, "KW_WITH", "", KW_WITH); }
- use { return process_token(yytext, "KW_USE", "", KW_USE); }
- procedure { return process_token(yytext, "KW_PROCEDURE", "", KW_PROCEDURE); }
- is { return process_token(yytext, "KW_IS", "", KW_IS); }
- constant { return process_token(yytext, "KW_CONSTANT", "", KW_CONSTANT); }
- begin { return process_token(yytext, "KW_BEGIN", "", KW_BEGIN); }
- "end" { return process_token(yytext, "KW_END", "", KW_END); }
- "for" { return process_token(yytext, "KW_FOR", "", KW_FOR); }
- in { return process_token(yytext, "KW_IN", "", KW_IN); }
- range { return process_token(yytext, "KW_RANGE", "", KW_RANGE); }
- loop { return process_token(yytext, "KW_LOOP", "", KW_LOOP); }
- package { return process_token(yytext, "KW_PACKAGE", "", KW_PACKAGE); }
- body { return process_token(yytext, "KW_BODY", "", KW_BODY); }
- out { return process_token(yytext, "KW_OUT", "", KW_OUT); }
- "if" { return process_token(yytext, "KW_IF", "", KW_IF); }
- then { return process_token(yytext, "KW_THEN", "", KW_THEN); }
- "else" { return process_token(yytext, "KW_ELSE", "", KW_ELSE); }
- /* identyfikatory */
- {ALPHA}{ALPHA_NUM}* { return process_token(yytext, "IDENT", yytext, IDENT); }
- /* operatory przypisania, zakresu, <=, >= */
- ":=" { return process_token(yytext, "ASSIGN", "", ASSIGN); }
- ".." { return process_token(yytext, "RANGE", "", RANGE); }
- "<=" { return process_token(yytext, "LE", "", LE); }
- ">=" { return process_token(yytext, "GE", "", GE); }
- /* pozostałe znaki - identyfikatorem jest kod znaku */
- . { return process_token(yytext, yytext, "", yytext[0]); }
- %%
- int yywrap()
- {
- if(YYSTATE == STRING)
- printf("Niezamkniety napis, rozpoczety w wierszu %d\n", wiersze);
- return 1;
- }
- /* 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 ada.y.
- * 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(text);
- strncpy(yylval.s, text + 1, l - 2 <= MAX_STR_LEN ? l - 1 : MAX_STR_LEN);
- break;
- case CHARACTER_CONST:
- yylval.i = text[1]; break;
- }
- return(TokenID);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement