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