From de6ef0ac023f4dcdbc4cc0d17f1fa3b9c755653d Mon Sep 17 00:00:00 2001 From: Riley Smith Date: Tue, 22 Oct 2024 16:22:26 -0700 Subject: [PATCH] first pass at flex lexer Co-authored-by: Jenessyl --- lab-3/main.c | 2 +- lab-3/samples/hello-world.cbl | 3 +-- lab-3/samples/sorting-snippet.cbl | 2 +- lab-3/scanner.flex | 44 ++++++++++++++++++++++++++++--- lab-3/token.h | 32 +++++++++++++++++++++- 5 files changed, 74 insertions(+), 9 deletions(-) diff --git a/lab-3/main.c b/lab-3/main.c index 4a96a9e..66a6605 100644 --- a/lab-3/main.c +++ b/lab-3/main.c @@ -8,7 +8,7 @@ extern char *yytext; int main(int argc, char *argv[]) { FILE *file; - const char *filename = "samples/hello.py"; // Default filename + const char *filename = "samples/sorting-snippet.cbl"; // Default filename // Check if a filename is provided as a command-line argument if (argc > 1) { diff --git a/lab-3/samples/hello-world.cbl b/lab-3/samples/hello-world.cbl index 3c78e9b..737f19e 100644 --- a/lab-3/samples/hello-world.cbl +++ b/lab-3/samples/hello-world.cbl @@ -1,6 +1,5 @@ IDENTIFICATION DIVISION. PROGRAM-ID. HELLO-WORLD. PROCEDURE DIVISION. - DISPLAY "Hello World!" + DISPLAY 'Hello World!' STOP RUN. -if \ No newline at end of file diff --git a/lab-3/samples/sorting-snippet.cbl b/lab-3/samples/sorting-snippet.cbl index a0eae92..8324e47 100644 --- a/lab-3/samples/sorting-snippet.cbl +++ b/lab-3/samples/sorting-snippet.cbl @@ -13,7 +13,7 @@ WORKING-STORAGE SECTION. 05 WS-INDEX PIC S9(4) COMP. PROCEDURE DIVISION. -*> * Initialize test data +*> Initialize test data MOVE "30" TO WS-SORT-ROW(1) MOVE "10" TO WS-SORT-ROW(2) MOVE "50" TO WS-SORT-ROW(3) diff --git a/lab-3/scanner.flex b/lab-3/scanner.flex index 021db23..0838033 100644 --- a/lab-3/scanner.flex +++ b/lab-3/scanner.flex @@ -3,10 +3,46 @@ %} DIGIT [0-9] LETTER [a-zA-Z] -%% -(" "|\t|\n) /* skip whitespace */ -IDENTIFICATION { return TOKEN_IDENTIFICATION; } -DIVISION { return TOKEN_KEYWORD_DIVISION; } +NAME [a-zA-Z0-9][a-zA-Z0-9_-]*[a-zA-Z0-9] +%% +(" "|\t|\n) /* skip whitespace */ +\*>\ ?.* { return TOKEN_COMMENT; } +IDENTIFICATION { return TOKEN_IDENTIFICATION; } +DIVISION { return TOKEN_KEYWORD_DIVISION; } +PROGRAM-ID { return TOKEN_PROGRAM_ID; } +PROCEDURE { return TOKEN_PROCEDURE; } +DATA { return TOKEN_KEYWORD_DATA; } +SECTION { return TOKEN_KEYWORD_SECTION; } +WORKING-STORAGE { return TOKEN_WORKING_STORAGE; } +DISPLAY { return TOKEN_DISPLAY; } +STOP { return TOKEN_STOP; } +RUN { return TOKEN_RUN; } +MOVE { return TOKEN_MOVE; } +TO { return TOKEN_KEYWORD_TO; } +VARYING { return TOKEN_VARYING; } +FROM { return TOKEN_KEYWORD_FROM; } +BY { return TOKEN_KEYWORD_BY; } +UNTIL { return TOKEN_UNTIL; } +PERFORM { return TOKEN_PERFORM; } +END-PERFORM { return TOKEN_END_PERFORM; } +IF { return TOKEN_IF; } +END-IF { return TOKEN_END_IF; } +SPACE { return TOKEN_SPACE; } + +\+ { return TOKEN_ADD; } +\- { return TOKEN_SUB; } +\> { return TOKEN_GREATER_THAN; } +\< { return TOKEN_LESS_THAN; } + +"\""[^"]*"\"" { return TOKEN_STRING; } +"\'"[^']*"\'" { return TOKEN_STRING; } +"(" { return TOKEN_LEFT_PARENTHESIS; } +")" { return TOKEN_RIGHT_PARENTHESIS; } + + +\. { return TOKEN_DOT; } +{NAME} { return TOKEN_IDENT; } +{DIGIT} { return TOKEN_INTEGER; } %% int yywrap() { return 1; } diff --git a/lab-3/token.h b/lab-3/token.h index 993c7a1..7ffcc96 100644 --- a/lab-3/token.h +++ b/lab-3/token.h @@ -1,12 +1,42 @@ typedef enum { TOKEN_EOF = 0, + // Identification Keywords TOKEN_IDENTIFICATION, TOKEN_KEYWORD_DIVISION, + TOKEN_KEYWORD_DATA, + TOKEN_KEYWORD_SECTION, TOKEN_PROGRAM_ID, + TOKEN_WORKING_STORAGE, TOKEN_PROCEDURE, + + // Program Keywords TOKEN_DISPLAY, TOKEN_STOP, TOKEN_RUN, + TOKEN_MOVE, + TOKEN_KEYWORD_TO, + TOKEN_PERFORM, + TOKEN_VARYING, + TOKEN_KEYWORD_FROM, + TOKEN_KEYWORD_BY, + TOKEN_UNTIL, + TOKEN_END_PERFORM, + TOKEN_IF, + TOKEN_END_IF, + TOKEN_SPACE, + + // Identifiers + TOKEN_IDENT, TOKEN_STRING, - TOKEN_DOT + TOKEN_INTEGER, + TOKEN_LEFT_PARENTHESIS, + TOKEN_RIGHT_PARENTHESIS, + TOKEN_DOT, + TOKEN_COMMENT, + + // Operators + TOKEN_ADD, + TOKEN_SUB, + TOKEN_GREATER_THAN, + TOKEN_LESS_THAN, } token_t; \ No newline at end of file