Initial check-in of TF-Fuzz.
Author: Gary Morrison <gary.morrison@arm.com>
Signed-off-by: Gary Morrison <gary.morrison@arm.com>
Change-Id: I8f739c3403bf2a2808f33c28910c7bda6aca7887
diff --git a/tools/tf_fuzz/parser/tf_fuzz_grammar.l b/tools/tf_fuzz/parser/tf_fuzz_grammar.l
new file mode 100644
index 0000000..d3f1cf6
--- /dev/null
+++ b/tools/tf_fuzz/parser/tf_fuzz_grammar.l
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+
+%{
+#include "class_forwards.hpp"
+#include "boilerplate.hpp"
+#include "gibberish.hpp"
+#include "compute.hpp"
+#include "string_ops.hpp"
+#include "data_blocks.hpp"
+#include "psa_asset.hpp"
+#include "sst_asset.hpp"
+#include "crypto_asset.hpp"
+#include "find_or_create_asset.hpp"
+#include "template_line.hpp"
+#include "tf_fuzz.hpp"
+#include "psa_call.hpp"
+#include "tf_fuzz_grammar.tab.hpp"
+
+int yycolumn = 1;
+
+//char *yytext;
+
+#define YY_USER_ACTION yylloc.first_line = yylloc.last_line = yylineno; \
+ yylloc.first_column = yycolumn; yylloc.last_column = yycolumn + yyleng - 1; \
+ yycolumn += yyleng; \
+ yylval.str = strdup(yytext);
+
+void yyerror (tf_fuzz_info *, const char *str)
+ /* not sure why it sends the yyparse() argument to yyerror(), but OK... */
+{
+ fprintf (stderr, "tf_fuzz template on line %d, at text = \"%s\": %s\n",
+ yylineno, yytext, str);
+ exit (1);
+}
+
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+%}
+
+%x BLOCK_COMMENT
+
+%option yylineno
+%option nodefault
+%option noyywrap
+%array
+
+%%
+
+\r ; /* ignore all \r */
+\/\/.*\n ; /* ignore C++-style line comments */
+purpose[ \t]+[^;]*; return PURPOSE;
+"/*" {BEGIN(BLOCK_COMMENT);}
+<BLOCK_COMMENT>"*/" {BEGIN(INITIAL);}
+<BLOCK_COMMENT>\n ;
+<BLOCK_COMMENT>. ;
+ /* Root commands: */
+set return SET;
+read return READ;
+remove return REMOVE;
+secure return SECURE;
+done return DONE;
+ /* PSA-asset types: */
+sst return SST;
+key return KEY;
+policy return POLICY;
+ /* Other root-command operands: */
+expect return EXPECT;
+pass return PASS;
+nothing return NOTHING;
+error return ERROR;
+\{ return OPEN_BRACE;
+\} return CLOSE_BRACE;
+; return SEMICOLON;
+name return NAME;
+uid return UID;
+data return DATA;
+\* return STAR;
+active return ACTIVE;
+deleted return DELETED;
+check return CHECK;
+assign return ASSIGN;
+print return PRINT;
+hash return HASH;
+neq return NEQ;
+dfname return DFNAME;
+shuffle return SHUFFLE;
+to return TO;
+of return OF;
+ /* Structure operands: */
+[a-zA-z][a-zA-Z_0-9]* {yylval.str = yytext; return IDENTIFIER_TOK;}
+[+-]?[0-9]* {yylval.valueN = atol(yytext); return NUMBER_TOK;}
+\'[a-zA-Z_0-9\/\.]+\' {yylval.str = yytext; return FILE_PATH_TOK;}
+\"[^\"]*\" {yylval.str = yytext; return LITERAL_TOK;}
+ /* inside quotes: anything but a quote, or nothing */
+[ \t\n\r] ; /* ignore white space */
+. yyerror ((tf_fuzz_info *) NULL, "Unexpected character");
+
+%%
+