Mercurial > ~dholland > hg > ag > index.cgi
diff tests/agcl/contrib/bug-I158.syn @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/agcl/contrib/bug-I158.syn Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,503 @@ + +{ + +/* + YABASIC --- a tiny integrated Basic Compiler/Interpreter + + BISON - part + + this Program is subject to the GNU General Public License; + see the file yabasic.c for details. +*/ + + +#undef WINDOWS +#include "yabasic.h" /* definitions of yabasic */ +#include <malloc.h> + +#if HAVE_ALLOCA_H +#include <alloca.h> +#endif + +void __yy_bcopy(char *,char *,int); /* prototype missing */ + +int yylineno=1; +int yylex(void); + +} + +/* float number *//* integer number *//* token of command *//* number of newlines *//* quoted string *//* general symbol *//* string of digits *//* string symbol */ +(double ) step_part + +(double ) const + +(double ) number + +(int ) intnum + +(char *) symbol_or_lineno + +(int ) hashed_number + +(int ) SEP + +(int ) EOFILE + + +FNUM + -> simple real + -> simple real:x, 'e'+'E', '+'?,exponent:e =x*pow(10,e); + -> simple real:x, 'e'+'E', '-',exponent:e =x*pow(10,-e); + +simple real + -> integer part:i, '.', fraction part:f = i+f; + -> integer part, '.'? + -> '.', fraction part:f = f; + +integer part + -> digit:d = d-'0'; + -> integer part:x, digit:d = 10*x + d-'0'; + +fraction part + -> digit:d =(d-'0')/10.; + -> digit:d, fraction part:f =(d-'0' + f)/10.; + +(int) exponent + -> digit:d = d-'0'; + -> exponent:x, digit:d = 10*x + d-'0'; + +(int) name //value of name token is length of name string + -> letter: c =pushChar(c), 1; + -> name:k, letter+digit: c =pushChar(c), k+1; + + +(char *) SYMBOL + -> name:k =strdup(popString(k)); + +(char *) STRSYM + -> name:k, '$' =pushChar('$'), strdup(popString(k+1)); + +(char *) DIGITS + -> digit string:k =strdup(popString(k)); + +(int) digit string + -> digit:d =pushChar(d), 1; + -> digit string:k, digit:d =pushChar(d), k+1; + +(char *) STRING + -> '"', string text:k, '"' =strdup(popString(k)); + -> '"', string text:k, '\n' =strdup(popString(k)); + +GOSUB, LABEL, ON + +INTERRUPT, BREAK, CONTINUE, SEP, EOFILE + +IF, THEN, ELSE, ENDIF + +PRINT, INPUT, LINE, RETURN, DIM, END, AT, SCREEN, REVERSE + +AND, OR, NOT + +NE, LE, GE, LT, GT, EQ + +READ, DATA, RESTORE + +OPEN, CLOSE + +WINDOW, DOT, LINE, CIRCLE, TEXT, CLEAR, PRINTER + +WAIT, BELL, MAP, XMAP, YMAP, ARROW, XTICK, YTICK + + +SIN, ASIN, COS, ACOS, TAN, ATAN, EXP, LOG, SQRT, MYEOF + +INT, FRAC, MOD, RAN, LEN, VAL, LEFT, RIGHT, MID, LEN, MIN, MAX + +STR, INKEY, CHR, ASC, UPPER, LOWER, TRIM, LTRIM, RTRIM, INSTR + +SYSTEM, SYSTEM2, PEEK, PEEK2, POKE, DATE, TIME + + + +[ + left {OR} + left {AND} + left {NOT} + left {'-', '+'} + left {'*', '/'} + left {'^'} + nonassoc {UMINUS} +] + +letter = 'a-z' + 'A-Z' +digit = '0-9' +eof = 0 + -1 + +NAME + -> letter + -> NAME, letter+digit + + +program $ + -> statement list, eof + +statement list + -> + -> statement_list, !{ +if (errorlevel<=ERROR) {YYABORT;}}, + SEP, !{ +yylineno+=$3;}, + statement + +statement /* empty */ + -> + -> string_assignment + -> assignment + -> for_loop + -> if_clause + -> "GOTO", symbol_or_lineno ={create_goto($2);} + -> "GOSUB", symbol_or_lineno ={create_gosub($2);} + -> ON, INTERRUPT, BREAK ={create_exception(TRUE);} + -> ON, INTERRUPT, CONTINUE ={create_exception(FALSE);} + -> ON, expression, "GOTO", !{create_skipper();}, goto_list ={create_nop();} + -> ON, expression, "GOSUB", !{create_skipper();}, gosub_list ={create_nop();} + -> LABEL, symbol_or_lineno ={create_label($2);} + -> OPEN, hashed_number, ',', string_expression, ',', string_expression ={create_myopen($2,'+');} + -> OPEN, hashed_number, ',', string_expression ={create_myopen($2,'-');} + -> CLOSE, hashed_number ={create_myclose($2);} + -> PRINT, printintro, printlist, !{ +create_revert(FALSE);}, + semicolon + -> INPUT, inputintro, inputlist ={lastinput->args=0;} + -> READ, readlist + -> DATA, datalist + -> RESTORE ={create_restore("");} + -> RESTORE, symbol_or_lineno ={create_restore($2);} + -> RETURN ={create_return();} + -> DIM, dimlist + -> OPEN, WINDOW, expression, ',', expression ={create_openwin(FALSE);} + -> OPEN, WINDOW, expression, ',', expression, ',', string_expression ={create_openwin(TRUE);} + -> DOT, mapping ={create_dot();} + -> LINE, mapping, "TO", mapping ={create_line('l');} + -> CIRCLE, mapping, ',', expression ={create_circle()} + -> TEXT, string_expression, ',', mapping ={create_text(TRUE);} + -> TEXT, mapping, ',', string_expression ={create_text(FALSE);} + -> MAP, expression, ',', expression, ',', expression, ',', expression, "TO", expression, ',', expression, ',', expression, ',', expression ={create_makemap();} + -> ARROW, mapping, "TO", mapping ={create_line('a');} + -> XTICK, mapping, ',', string_expression ={create_tick(1);} + -> YTICK, mapping, ',', string_expression ={create_tick(3);} + -> XTICK, mapping ={create_tick(0);} + -> YTICK, mapping ={create_tick(2);} + -> CLOSE, WINDOW ={create_closewin();} + -> CLEAR, WINDOW ={create_clearwin();} + -> CLEAR, SCREEN ={create_clearscreen();} + -> OPEN, PRINTER ={create_openprinter(0);} + -> OPEN, PRINTER, string_expression ={create_openprinter(1);} + -> CLOSE, PRINTER ={create_closeprinter();} + -> WAIT, expression ={create_mywait();} + -> BELL ={create_bell();} + -> INKEY ={create_function(MYINKEY); create_popstrsym(NULL);} + -> SYSTEM2, '(', string_expression, ')' ={create_function(MYSYSTEM2); + create_popdblsym(NULL);} + -> POKE, string_expression, ',', string_expression ={create_poke('s');} + -> POKE, string_expression, ',', expression ={create_poke('d');} + -> END ={create_myend();} + +string_assignment + -> STRSYM, EQ, string_expression ={create_popstrsym($1);} + -> MID, '(', STRSYM, !{ +create_pushstrptr($3);}, + ',', expression, ',', expression, ')', EQ, string_expression ={create_changestring(MYMID);} + -> LEFT, '(', STRSYM, !{ +create_pushstrptr($3);}, + ',', expression, ')', EQ, string_expression ={create_changestring(MYLEFT);} + -> RIGHT, '(', STRSYM, !{ +create_pushstrptr($3);}, + ',', expression, ')', EQ, string_expression ={create_changestring(MYRIGHT);} + -> STRSYM, '(', !{ +pushcounter();}, + indexlist, ')', EQ, string_expression ={create_doarray($1,ASSIGNSTRINGARRAY);} + -> MID, '(', STRSYM, '(', !{ +pushcounter();}, + indexlist, ')', !{ +create_doarray($3,GETSTRINGPOINTER);}, + ',', expression, ',', expression, ')', EQ, string_expression ={create_changestring(MYMID);} + -> LEFT, '(', STRSYM, '(', !{ +pushcounter();}, + indexlist, ')', !{ +create_doarray($3,GETSTRINGPOINTER);}, + ',', expression, ')', EQ, string_expression ={create_changestring(MYLEFT);} + -> RIGHT, '(', STRSYM, '(', !{ +pushcounter();}, + indexlist, ')', !{ +create_doarray($3,GETSTRINGPOINTER);}, + ',', expression, ')', EQ, string_expression ={create_changestring(MYRIGHT);} + +string_expression + -> STRSYM ={create_pushstrsym($1);} + -> string_function + -> STRING ={if ($1==NULL) {error(ERROR,"String not terminated");create_pushstr("");} else {create_pushstr($1);}} + -> string_expression, '+', string_expression ={create_concat();} + -> STRSYM, '(', !{ +pushcounter();}, + indexlist, ')' ={create_doarray($1,CALLSTRINGARRAY);} + -> '(', string_expression, ')' + +string_function + -> LEFT, '(', string_expression, ',', expression, ')' ={create_function(MYLEFT);} + -> RIGHT, '(', string_expression, ',', expression, ')' ={create_function(MYRIGHT);} + -> MID, '(', string_expression, ',', expression, ',', expression, ')' ={create_function(MYMID);} + -> STR, '(', expression, ')' ={create_function(MYSTR);} + -> STR, '(', expression, ',', string_expression, ')' ={create_function(MYSTR2);} + -> INKEY ={create_function(MYINKEY);} + -> CHR, '(', expression, ')' ={create_function(MYCHR);} + -> UPPER, '(', string_expression, ')' ={create_function(MYUPPER);} + -> LOWER, '(', string_expression, ')' ={create_function(MYLOWER);} + -> LTRIM, '(', string_expression, ')' ={create_function(MYLTRIM);} + -> RTRIM, '(', string_expression, ')' ={create_function(MYRTRIM);} + -> TRIM, '(', string_expression, ')' ={create_function(MYTRIM);} + -> SYSTEM, '(', string_expression, ')' ={create_function(MYSYSTEM);} + -> DATE ={create_function(MYDATE);} + -> TIME ={create_function(MYTIME);} + -> PEEK2, '(', string_expression, ')' ={create_function(MYPEEK2);} + +assignment + -> SYMBOL, EQ, expression ={create_popdblsym($1);} + -> SYMBOL, '(', !{ +pushcounter();}, + indexlist, ')', EQ, expression ={create_doarray($1,ASSIGNARRAY);} + +expression + -> number ={create_pushdbl($1);} + -> function + -> SYMBOL ={create_pushdblsym($1);} + -> SYMBOL, '(', !{ +pushcounter();}, + indexlist, ')' ={create_doarray($1,CALLARRAY);} + -> '(', expression, ')' + -> expression, '+', expression ={create_dblbin('+');} + -> expression, '-', expression ={create_dblbin('-');} + -> expression, '*', expression ={create_dblbin('*');} + -> expression, '/', expression ={create_dblbin('/');} + -> expression, '^', expression ={create_dblbin('^');} + -> '-', expression /* 1ef4:fa2arec <֠ */ ={create_negate();} + +mapping + -> expression, ',', expression + -> MAP, '(', expression, ',', expression, ')' ={create_map();} + +function + -> SIN, '(', expression, ')' ={create_function(MYSIN);} + -> ASIN, '(', expression, ')' ={create_function(MYASIN);} + -> COS, '(', expression, ')' ={create_function(MYCOS);} + -> ACOS, '(', expression, ')' ={create_function(MYACOS);} + -> TAN, '(', expression, ')' ={create_function(MYTAN);} + -> ATAN, '(', expression, ')' ={create_function(MYATAN);} + -> ATAN, '(', expression, ',', expression, ')' ={create_function(MYATAN2);} + -> EXP, '(', expression, ')' ={create_function(MYEXP);} + -> LOG, '(', expression, ')' ={create_function(MYLOG);} + -> SQRT, '(', expression, ')' ={create_function(MYSQRT);} + -> INT, '(', expression, ')' ={create_function(MYINT);} + -> FRAC, '(', expression, ')' ={create_function(MYFRAC);} + -> MOD, '(', expression, ',', expression, ')' ={create_function(MYMOD);} + -> RAN, '(', expression, ')' ={create_function(MYRAN);} + -> RAN, '(', ')' ={create_function(MYRAN2);} + -> MIN, '(', expression, ',', expression, ')' ={create_function(MYMIN);} + -> MAX, '(', expression, ',', expression, ')' ={create_function(MYMAX);} + -> XMAP, '(', expression, ')' ={create_function(MYXMAP);} + -> YMAP, '(', expression, ')' ={create_function(MYYMAP);} + -> LEN, '(', string_expression, ')' ={create_function(MYLEN);} + -> VAL, '(', string_expression, ')' ={create_function(MYVAL);} + -> ASC, '(', string_expression, ')' ={create_function(MYASC);} + -> INSTR, '(', string_expression, ',', string_expression, ')' ={create_function(MYINSTR);} + -> SYSTEM2, '(', string_expression, ')' ={create_function(MYSYSTEM2);} + -> PEEK, '(', string_expression, ')' ={create_function(MYPEEK);} + +const + -> number ={$$=$1;} + -> '+', number ={$$=$2;} + -> '-', number ={$$=-$2;} + +number + -> FNUM ={$$=$1;} + -> DIGITS ={$$=atoi($1);} + +intnum + -> DIGITS ={$$=atoi($1);} + +symbol_or_lineno + -> DIGITS ={$$=$1;} + -> SYMBOL ={$$=$1;} + +dimlist + -> SYMBOL, '(', !{ +pushcounter();}, + indexlist, ')' ={create_dim($1,'d');} + -> dimlist, ',', SYMBOL, '(', !{ +pushcounter();}, + indexlist, ')' ={create_dim($3,'d');} + -> STRSYM, '(', !{ +pushcounter();}, + indexlist, ')' ={create_dim($1,'s');} + -> dimlist, ',', STRSYM, '(', !{ +pushcounter();}, + indexlist, ')' ={create_dim($3,'s');} + +indexlist + -> expression ={inccounter();} + -> indexlist, ',', expression ={inccounter();} + +for_loop + -> "FOR", SYMBOL, EQ, expression, !{ +pushname($2);create_popdblsym($2);pushgoto(); + create_pushdblsym($2);}, + "TO", expression, step_part, !{ + + create_dblrelop(($8>0)?'{':'}'); + create_decide(); + pushlabel();}, + SEP, !{ +yylineno+=$10;}, + statement_list, !{ + + create_pushdbl($8); + create_pushdblsym($2); + create_dblbin('+'); + create_popdblsym($2); + swap();popgoto();poplabel();}, + next_or_eofile, next_symbol + +next_or_eofile + -> "NEXT" + -> EOFILE ={end_of_file=TRUE; + error(ERROR,"'next'-statement is missing"); YYABORT;} +step_part + -> /* can be omitted */ ={$$=1.0;} + -> "STEP", const ={$$=$2;} + +next_symbol + -> /* can be omitted */ ={pop();} + -> SYMBOL ={if (strcmp(pop()->pointer,$1)) + {error(ERROR,"'for' and 'next' do not match"); YYABORT;} + } + +if_clause + -> IF, condition, !{ +create_decide();pushlabel();}, + THEN, statement_list, !{ +pushlabel();swap();poplabel();}, + else_part, !{ +poplabel();}, + endif_or_eof + +endif_or_eof + -> ENDIF + -> EOFILE ={end_of_file=TRUE; + error(ERROR,"'endif'-statement is missing"); YYABORT;} + +condition + -> '(', condition, ')' + -> condition, OR, condition ={create_boole('|');} + -> condition, AND, condition ={create_boole('&');} + -> NOT, condition ={create_boole('!');} + -> string_expression, EQ, string_expression ={create_strrelop('=');} + -> string_expression, NE, string_expression ={create_strrelop('!');} + -> string_expression, LT, string_expression ={create_strrelop('<');} + -> string_expression, LE, string_expression ={create_strrelop('{');} + -> string_expression, GT, string_expression ={create_strrelop('>');} + -> string_expression, GE, string_expression ={create_strrelop('}');} + -> expression, EQ, expression ={create_dblrelop('=');} + -> expression, NE, expression ={create_dblrelop('!');} + -> expression, LT, expression ={create_dblrelop('<');} + -> expression, LE, expression ={create_dblrelop('{');} + -> expression, GT, expression ={create_dblrelop('>');} + -> expression, GE, expression ={create_dblrelop('}');} + -> MYEOF, '(', hashed_number, ')' ={create_testeof($3);} + +else_part /* can be omitted */ + -> + -> ELSE, statement_list + +inputlist + -> input + -> input, ',', inputlist + +input + -> SYMBOL ={create_myread('d');create_popdblsym($1);} + -> SYMBOL, '(', !{ +pushcounter();}, + indexlist, ')' ={create_myread('d');create_doarray($1,ASSIGNARRAY);} + -> STRSYM ={create_myread('s');create_popstrsym($1);} + -> STRSYM, '(', !{ +pushcounter();}, + indexlist, ')' ={create_myread('s');create_doarray($1,ASSIGNSTRINGARRAY);} + +readlist + -> readitem + -> readlist, ',', readitem + +readitem + -> SYMBOL ={create_readdata('d');create_popdblsym($1);} + -> SYMBOL, '(', !{ +pushcounter();}, + indexlist, ')' ={create_readdata('d');create_doarray($1,ASSIGNARRAY);} + -> STRSYM ={create_readdata('s');create_popstrsym($1);} + -> STRSYM, '(', !{ +pushcounter();}, + indexlist, ')' ={create_readdata('s');create_doarray($1,ASSIGNSTRINGARRAY);} + +datalist + -> STRING ={create_strdata($1);} + -> const ={create_dbldata($1);} + -> datalist, ',', STRING ={create_strdata($3);} + -> datalist, ',', const ={create_dbldata($3);} + +printlist /* possible empty */ + -> + -> expression ={create_print('d');} + -> printlist, ',', expression ={create_print('d');} + -> string_expression ={create_print('s');} + -> printlist, ',', string_expression ={create_print('s');} + +inputintro + -> ={create_myswitch(0);create_readline(NULL);} + -> stream + -> position ={create_myswitch(0);create_readline(NULL);} + -> !{ +create_myswitch(0);}, + prompt + -> position, !{ +create_myswitch(0);}, + prompt + +printintro + -> /* can be empty */ ={create_myswitch(0);} + -> stream + -> REVERSE ={create_revert(TRUE);create_myswitch(0);} + -> position ={create_myswitch(0);} + -> REVERSE, position ={create_revert(TRUE);create_myswitch(0);} + +prompt + -> STRING ={create_readline($1);} + +position + -> AT, '(', expression, ',', expression, ')' ={create_mymove();} + +stream + -> '#', intnum ={create_myswitch($2);} + +hashed_number + -> '#', intnum ={$$=$2;} + -> intnum /* need not contain hash */ ={$$=$1;} + +semicolon /* can be left out */ + -> ={create_print('n');} + -> ';' + +goto_list + -> symbol_or_lineno ={create_goto($1);create_findnop();} + -> goto_list, ',', symbol_or_lineno ={create_goto($3);create_findnop();} + +gosub_list + -> symbol_or_lineno ={create_gosub($1);create_findnop();} + -> gosub_list, ',', symbol_or_lineno ={create_gosub($3);create_findnop();}