first pass at flex lexer

Co-authored-by: Jenessyl <Jenessyl@users.noreply.github.com>
This commit is contained in:
vel 2024-10-22 16:22:26 -07:00
parent 14746ee3e5
commit de6ef0ac02
Signed by: velvox
GPG Key ID: 59D9762F674151DF
5 changed files with 74 additions and 9 deletions

View File

@ -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) {

View File

@ -1,6 +1,5 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
PROCEDURE DIVISION.
DISPLAY "Hello World!"
DISPLAY 'Hello World!'
STOP RUN.
if

View File

@ -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)

View File

@ -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; }

View File

@ -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;