3 * SPDX-License-Identifier: MIT
5 * Copyright 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 * Common Trace Formal Lexer
10 #include "plugins/ctf/common/src/metadata/tsdl/ast.hpp"
11 #include "plugins/ctf/common/src/metadata/tsdl/logging.hpp"
12 #include "plugins/ctf/common/src/metadata/tsdl/parser-wrap.hpp"
13 #include "plugins/ctf/common/src/metadata/tsdl/scanner.hpp"
15 #define YY_FATAL_ERROR(_msg) BT_CPPLOGF_STR_SPEC(currentCtfScanner->logger, _msg)
17 #define PARSE_INTEGER_LITERAL(base) \
20 yylval->ull = strtoull(yytext, NULL, base); \
22 _BT_CPPLOGE_APPEND_CAUSE_LINENO( \
23 currentCtfScanner->logger, \
25 "Cannot parser constant integer: " \
26 "base={}, text=\"{}\"", base, yytext); \
31 extern thread_local const ctf_scanner *const currentCtfScanner;
34 %x comment_ml comment_sl string_lit char_const
35 %option reentrant yylineno noyywrap bison-bridge
36 %option extra-type="struct ctf_scanner *"
38 INTEGER_SUFFIX (U|UL|ULL|LU|LLU|Ul|Ull|lU|llU|u|uL|uLL|Lu|LLu|ul|ull|lu|llu)
43 UCHARLOWERCASE \\u{HEXDIGIT}{4}
44 UCHARUPPERCASE \\U{HEXDIGIT}{8}
45 ID_NONDIGIT {NONDIGIT}|{UCHARLOWERCASE}|{UCHARUPPERCASE}
46 IDENTIFIER {ID_NONDIGIT}({ID_NONDIGIT}|{DIGIT})*
50 * Using start conditions to deal with comments
54 "/*" BEGIN(comment_ml);
55 <comment_ml>[^*\n]* /* eat anything that's not a '*' */
56 <comment_ml>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */
58 <comment_ml>"*"+"/" BEGIN(INITIAL);
60 "//"[^\n]*\n /* skip comment */
62 L?\"(\\.|[^\\"])*\" { if (import_string(yyextra, yylval, yytext, '\"') < 0) return CTF_ERROR; else return CTF_STRING_LITERAL; }
63 L?\'(\\.|[^\\'])*\' { if (import_string(yyextra, yylval, yytext, '\'') < 0) return CTF_ERROR; else return CTF_CHARACTER_LITERAL; }
65 "[" return CTF_LSBRAC;
66 "]" return CTF_RSBRAC;
67 "(" return CTF_LPAREN;
68 ")" return CTF_RPAREN;
71 "->" return CTF_RARROW;
77 := return CTF_TYPEASSIGN;
79 ; return CTF_SEMICOLON;
80 "..." return CTF_DOTDOTDOT;
84 align setstring(yyextra, yylval, yytext); return CTF_TOK_ALIGN;
85 const setstring(yyextra, yylval, yytext); return CTF_CONST;
86 char setstring(yyextra, yylval, yytext); return CTF_CHAR;
87 clock setstring(yyextra, yylval, yytext); return CTF_CLOCK;
88 double setstring(yyextra, yylval, yytext); return CTF_DOUBLE;
89 enum setstring(yyextra, yylval, yytext); return CTF_ENUM;
90 env setstring(yyextra, yylval, yytext); return CTF_ENV;
91 event setstring(yyextra, yylval, yytext); return CTF_EVENT;
92 floating_point setstring(yyextra, yylval, yytext); return CTF_FLOATING_POINT;
93 float setstring(yyextra, yylval, yytext); return CTF_FLOAT;
94 integer setstring(yyextra, yylval, yytext); return CTF_INTEGER;
95 int setstring(yyextra, yylval, yytext); return CTF_INT;
96 long setstring(yyextra, yylval, yytext); return CTF_LONG;
97 short setstring(yyextra, yylval, yytext); return CTF_SHORT;
98 signed setstring(yyextra, yylval, yytext); return CTF_SIGNED;
99 stream setstring(yyextra, yylval, yytext); return CTF_STREAM;
100 string setstring(yyextra, yylval, yytext); return CTF_STRING;
101 struct setstring(yyextra, yylval, yytext); return CTF_STRUCT;
102 trace setstring(yyextra, yylval, yytext); return CTF_TRACE;
103 callsite setstring(yyextra, yylval, yytext); return CTF_CALLSITE;
104 typealias setstring(yyextra, yylval, yytext); return CTF_TYPEALIAS;
105 typedef setstring(yyextra, yylval, yytext); return CTF_TYPEDEF;
106 unsigned setstring(yyextra, yylval, yytext); return CTF_UNSIGNED;
107 variant setstring(yyextra, yylval, yytext); return CTF_VARIANT;
108 void setstring(yyextra, yylval, yytext); return CTF_VOID;
109 _Bool setstring(yyextra, yylval, yytext); return CTF_BOOL;
110 _Complex setstring(yyextra, yylval, yytext); return CTF_COMPLEX;
111 _Imaginary setstring(yyextra, yylval, yytext); return CTF_IMAGINARY;
112 [1-9]{DIGIT}*{INTEGER_SUFFIX}? PARSE_INTEGER_LITERAL(10); return CTF_INTEGER_LITERAL;
113 0{OCTALDIGIT}*{INTEGER_SUFFIX}? PARSE_INTEGER_LITERAL(8); return CTF_INTEGER_LITERAL;
114 0[xX]{HEXDIGIT}+{INTEGER_SUFFIX}? PARSE_INTEGER_LITERAL(16); return CTF_INTEGER_LITERAL;
116 {IDENTIFIER} BT_CPPLOGT_SPEC(currentCtfScanner->logger, "Got identifier: id=\"{}\"", yytext); setstring(yyextra, yylval, yytext); if (is_type(yyextra, yytext)) return ID_TYPE; else return IDENTIFIER;
117 [ \t\r\n] ; /* ignore */
118 . _BT_CPPLOGE_APPEND_CAUSE_LINENO(currentCtfScanner->logger, yylineno, "Invalid character: char=\"{}\", val={:#02x}", isprint((unsigned char) yytext[0]) ? yytext[0] : '\0', yytext[0]); return CTF_ERROR;