summaryrefslogtreecommitdiff
path: root/src/common/pscript.icn
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/pscript.icn')
-rw-r--r--src/common/pscript.icn44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/common/pscript.icn b/src/common/pscript.icn
new file mode 100644
index 0000000..d9b2ee7
--- /dev/null
+++ b/src/common/pscript.icn
@@ -0,0 +1,44 @@
+# Program to sanitize Yacc output and minor changes to it to suit the Icon
+# translator.
+
+# procedure to skip optional white space.
+procedure sws()
+ return tab( many( ' \t' ) ) | ""
+end
+
+$ifdef _CYGWIN
+ $define YY_STATE "yystate"
+$else # _CYGWIN
+ $define YY_STATE "yy_state"
+$endif # _CYGWIN
+
+procedure main()
+ local line, prefix
+
+ while line := read() do {
+ if line == "#" then next # omit lone #s -- illegal now
+ else line ? {
+ if write(="#endif") then next # omit illegal stuff
+ else if (prefix := tab(find("yyerror"))) & ="yyerror" & sws() & ="(" &
+ sws() & ="\"" then {
+ #
+ # We are beyond the 'yyerror( "'. Write the part of the
+ # line before the call, then decide what to do about
+ # the error message that follows.
+ #
+ writes(prefix)
+ if ="syntax error\"" then
+ writes("yyerror(yychar, yylval, ", YY_STATE)
+ else if ="yacc stack overflow\"" then
+ writes("tsyserr(\"parse stack overflow\"")
+ else
+ writes("tsyserr(\"parser: ")
+ write(tab(0))
+ }
+ else if ="extern char *malloc(), *realloc();" then {
+ # let proto.h handle this declaration.
+ }
+ else write(tab(0))
+ }
+ }
+end