summaryrefslogtreecommitdiff
path: root/test/trans.d/case/gotocallret3_d.rl
diff options
context:
space:
mode:
Diffstat (limited to 'test/trans.d/case/gotocallret3_d.rl')
-rw-r--r--test/trans.d/case/gotocallret3_d.rl123
1 files changed, 123 insertions, 0 deletions
diff --git a/test/trans.d/case/gotocallret3_d.rl b/test/trans.d/case/gotocallret3_d.rl
new file mode 100644
index 00000000..eb95f265
--- /dev/null
+++ b/test/trans.d/case/gotocallret3_d.rl
@@ -0,0 +1,123 @@
+/*
+ * @LANG: d
+ * @GENERATED: true
+ */
+
+import std.stdio;
+import std.string;
+
+class gotocallret
+{
+char comm;
+int top;
+int stack[32];
+
+%%{
+ machine gotocallret;
+
+ # A reference to a state in an unused action caused a segfault in 5.8. */
+ action unusedAction {fentry(garble_line);
+}
+
+ action err_garbling_line {printf( "%.*s", "error: garbling line\n" );}
+ action goto_main {fnext main;}
+ action recovery_failed {printf( "%.*s", "error: failed to recover\n" );}
+
+ # Error machine, consumes to end of
+ # line, then starts the main line over.
+ garble_line := ( (any-'\n')*'\n')
+ >err_garbling_line
+ @goto_main
+ $/recovery_failed;
+
+ action hold_and_return {fhold;fnret;}
+
+ # Look for a string of alphas or of digits,
+ # on anything else, hold the character and return.
+ alp_comm := alpha+ $!hold_and_return;
+ dig_comm := digit+ $!hold_and_return;
+
+ # Choose which to machine to call into based on the command.
+ action comm_arg {if ( comm >= 97 )
+{
+ fncall alp_comm;
+}
+else {
+ fncall dig_comm;
+}
+}
+
+ # Specifies command string. Note that the arg is left out.
+ command = (
+ [a-z0-9] @{comm = fc;
+} ' ' @comm_arg @{printf( "%.*s", "prints\n" );} '\n'
+ ) @{printf( "%.*s", "correct command\n" );};
+
+ # Any number of commands. If there is an
+ # error anywhere, garble the line.
+ main := command* $!{fhold;fnext garble_line;};
+}%%
+
+
+
+%% write data;
+int cs;
+int blen;
+char buffer[1024];
+
+void init()
+{
+ %% write init;
+}
+void exec( const(char) data[] )
+{
+ const(char) *p = data.ptr;
+ const(char) *pe = data.ptr + data.length;
+ const(char) *eof = pe;
+ char _s[];
+
+ %% write exec;
+}
+
+void finish( )
+{
+ if ( cs >= gotocallret_first_final )
+ writefln( "ACCEPT" );
+ else
+ writefln( "FAIL" );
+}
+static const char[][] inp = [
+"lkajsdf\n",
+"2134\n",
+"(\n",
+"\n",
+"*234234()0909 092 -234aslkf09`1 11\n",
+"1\n",
+"909\n",
+"1 a\n",
+"11 1\n",
+"a 1\n",
+"aa a\n",
+"1 1\n",
+"1 123456\n",
+"a a\n",
+"a abcdef\n",
+"h",
+"a aa1",
+];
+
+int inplen = 17;
+
+}
+int main()
+{
+ gotocallret m = new gotocallret();
+ int i;
+ for ( i = 0; i < m.inplen; i++ ) {
+ m.init();
+ m.exec( m.inp[i] );
+ m.finish();
+ }
+ return 0;
+}
+