From 47bb3f5219e438860e67ad06c0d3da03a3137184 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 7 Apr 2018 08:27:35 -0400 Subject: [PATCH] Add lexer tokens for integer, float, string constants and identifiers --- src/parser/parser.l | 31 +++++++++++++++++++++++++++++++ src/parser/parser.y | 7 +++++++ 2 files changed, 38 insertions(+) diff --git a/src/parser/parser.l b/src/parser/parser.l index 155c0e5..8b5deaf 100644 --- a/src/parser/parser.l +++ b/src/parser/parser.l @@ -83,4 +83,35 @@ continue return TOK_CONTINUE; sizeof return TOK_SIZEOF; + +'[^\\]' return TOK_CHAR_CONST; +'\\.' return TOK_CHAR_CONST; +'\\n' (void)'\n'; return TOK_CHAR_CONST; +'\\t' (void)'\t'; return TOK_CHAR_CONST; +'\\r' (void)'\r'; return TOK_CHAR_CONST; +'\\b' (void)'\b'; return TOK_CHAR_CONST; +'\\f' (void)'\f'; return TOK_CHAR_CONST; +[0-9]+([uU][lL]?[lL]?)? return TOK_INT_CONST; +0[xX][0-9a-fA-F]+([uU][lL]?[lL]?)? return TOK_INT_CONST; +[0-9]*\.[0-9]*[fF]? return TOK_FLOAT_CONST; + +\" BEGIN(str); +{ +\" return TOK_STR_CONST; +\\x[0-9A-Fa-f]{2} { + /* hexadecimal escape code */ + unsigned int val; + (void) sscanf(yytext + 2, "%x", &val); +} +\\n (void)'\n'; +\\t (void)'\t'; +\\r (void)'\r'; +\\b (void)'\b'; +\\f (void)'\f'; +\\. (void)yytext[1]; +[^\\\"]+ (void)yytext; +} + +[a-zA-Z_][a-zA-Z_0-9]* return TOK_IDENTIFIER; + %% diff --git a/src/parser/parser.y b/src/parser/parser.y index 507ee01..ff677a4 100644 --- a/src/parser/parser.y +++ b/src/parser/parser.y @@ -86,6 +86,13 @@ static void handle_error(const char * str, const YYLTYPE * yylloc); %token TOK_SIZEOF; + +%token TOK_CHAR_CONST; +%token TOK_INT_CONST; +%token TOK_FLOAT_CONST; +%token TOK_STR_CONST; +%token TOK_IDENTIFIER; + %% translation_unit: TOK_PLUS;