1 /* VM-independent routine code frontend: flex scanner. 2 3 Copyright (C) 2016, 2017 Luca Saiu 4 Updated in 2019 and 2020 by Luca Saiu 5 Written by Luca Saiu 6 7 This file is part of Jitter. 8 9 Jitter is free software: you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation, either version 3 of the License, or 12 (at your option) any later version. 13 14 Jitter is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with Jitter. If not, see <http://www.gnu.org/licenses/>. */ 21 22 23 %{ 24 #include <jitter/jitter.h> 25 #include <jitter/jitter-routine-parser.h> 26 27 /* Re-declare two automatically-defined flex functions with 28 __attribute__((unused)), to prevent an annoying GCC warning. */ 29 static int input (yyscan_t yyscanner) 30 __attribute__ ((unused)); 31 static void yyunput (int c, char * yy_bp , yyscan_t yyscanner) 32 __attribute__ ((unused)); 33 34 /* Provide aliases for a few identifiers not renamed by %option prefix. */ 35 #define YYSTYPE JITTER_STYPE 36 #define YYLTYPE JITTER_LTYPE 37 %} 38 %option bison-bridge bison-locations nodefault noyywrap prefix="jitter_" 39 %option reentrant yylineno 40 41 BINARY_NATURAL 0b[0-1]+ 42 OCTAL_NATURAL 0(o?)[0-7]+ 43 DECIMAL_NATURAL (0|([1-9][0-9]*)) 44 HEXADECIMAL_NATURAL 0x([0-9]|[a-f]|[A-F])+ 45 46 BINARY_INTEGER [-+]?{BINARY_NATURAL} 47 OCTAL_INTEGER [-+]?{OCTAL_NATURAL} 48 DECIMAL_INTEGER [-+]?{DECIMAL_NATURAL} 49 HEXADECIMAL_INTEGER [-+]?{HEXADECIMAL_NATURAL} 50 51 IDENTIFIER [_a-zA-Z][-+._~@/\\a-zA-Z0-9]* 52 LABEL_PREFIX "$" 53 REGISTER_LETTER [a-z] 54 REGISTER "%"{REGISTER_LETTER}{DECIMAL_NATURAL} 55 56 WHITESPACE [\ \t\n\r]+ 57 COMMENT "#".*(\n|\r) 58 59 %% 60 61 ({WHITESPACE}|{COMMENT})+ { /* Do nothing. */ } 62 {BINARY_INTEGER} { return SIGNED_BINARY_LITERAL; } 63 {OCTAL_INTEGER} { return SIGNED_OCTAL_LITERAL; } 64 {DECIMAL_INTEGER} { return SIGNED_DECIMAL_LITERAL; } 65 {HEXADECIMAL_INTEGER} { return SIGNED_HEXADECIMAL_LITERAL; } 66 {BINARY_INTEGER}[uU] { return UNSIGNED_BINARY_LITERAL; } 67 {OCTAL_INTEGER}[uU] { return UNSIGNED_OCTAL_LITERAL; } 68 {DECIMAL_INTEGER}[uU] { return UNSIGNED_DECIMAL_LITERAL; } 69 {HEXADECIMAL_INTEGER}[uU] { return UNSIGNED_HEXADECIMAL_LITERAL; } 70 {REGISTER} { return REGISTER; } 71 "+" { return PLUS; } 72 "-" { return MINUS; } 73 "*" { return TIMES; } 74 "/" { return DIV; } 75 "%" { return MOD; } 76 "+"[uU] { return UNSIGNED_PLUS; } 77 "-"[uU] { return UNSIGNED_MINUS; } 78 "*"[uU] { return UNSIGNED_TIMES; } 79 "/"[uU] { return UNSIGNED_DIV; } 80 "%"[uU] { return UNSIGNED_MOD; } 81 "(" { return OPEN_PARENS; } 82 ")" { return CLOSE_PARENS; } 83 "BYTESPERWORD" { return BYTESPERWORD; } 84 "LGBYTESPERWORD" { return LGBYTESPERWORD; } 85 "BITSPERWORD" { return BITSPERWORD; } 86 {IDENTIFIER} { return INSTRUCTION_NAME; } 87 {LABEL_PREFIX}{IDENTIFIER} { return LABEL_LITERAL; } 88 {LABEL_PREFIX}{IDENTIFIER}":" { return LABEL; } 89 , { return COMMA; } 90 . { jitter_scan_error (yyscanner); } 91 92 %% 93