Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/awk -f
- function p(x){
- print x;
- }
- function expr(x ,top){
- top = stack["top"];
- if (x ~ /^[+-]?[0-9]+$/) {
- stack[++stack["top"]] = x;
- }else if (x == "+" && top > 1) {
- stack[top-1] += stack[top];
- stack["top"]--;
- } else if (x == "-" && top > 1) {
- stack[top-1] -= stack[top];
- stack["top"]--;
- } else if (x == "*" && top > 1) {
- stack[top-1] *= stack[top];
- stack["top"]--;
- } else if (x == "/" && top > 1) {
- stack[top-1] /= stack[top];
- stack["top"]--;
- } else if (x == "^" && top > 1) {
- stack[top-1] ^= stack[top];
- stack["top"]--;
- }else if(x ~ /^[a-zA-Z]+$/){
- stack[++stack["top"]] = env[x];
- } else {
- printf("error: cannot evaluate %s\n", x)
- stack["top"] = 0
- }
- }
- function push(x){
- stack[++stack["top"]] = x;
- }
- function pop( x){
- x = stack[stack["top"]--]
- return x
- }
- function jump(label){
- for(i=1;i<=len;i++){
- if(data[i] ~ ("^@label +" label " *$")){
- lp = i;
- break;
- }
- }
- }
- function ifskip(x){
- #print "skip> " (ifstack[ifstack["top"]]!=1)
- return ifstack[ifstack["top"]]!=1
- #if(ifstack[ifstack["top"]]==1){
- # return 0;
- #}else{
- # return 1;
- #}
- #ifstack[++ifstack["top"]] = pop()
- }
- function print_array(A, i,len,s){
- len=length(A);
- s = A[0] "|"
- for(i=1;i<=len;i++)
- s = s " " A[i];
- print s;
- }
- BEGIN {
- ifstack["top"] = 0
- ifstack[0] = 1;
- FS = " "
- i = 1;
- while(getline<"data2.txt">0)
- data[i++] = $0;
- #/*asort(data)*/
- #print "end";
- #for(i in data){
- # print i "->" data[i];
- #}
- len = length(data);
- for(lp=1;lp<=len;lp++){
- line = data[lp];
- #print "code" lp ">" line
- gsub(/^[ \t]+/,"",line)
- if(substr(line,1,1)=="@"){
- n = split(substr(line,2),tokens,FS);
- if(tokens[1]=="exit"){
- if(ifskip())continue
- exit;
- }else if(tokens[1]=="expr"){
- if(ifskip())continue
- for(i=2;i<=n;i++)
- expr(tokens[i]);
- }else if(tokens[1]=="debug"){
- if(ifskip())continue
- for(i=2;i<=n;i++)
- expr(tokens[i]);
- print pop()
- }else if(tokens[1]=="let"){
- if(ifskip())continue
- for(i=3;i<=n;i++)
- expr(tokens[i]);
- env[tokens[2]] = pop()
- }else if(tokens[1]=="goto"){
- if(ifskip())continue
- jump(tokens[2]);
- if(lp<=len)
- continue;
- else
- exit;
- }else if(tokens[1]=="branch"){
- if(ifskip())continue
- for(i=3;i<=n;i++)
- expr(tokens[i]);
- if(pop()){
- jump(tokens[2]);
- if(lp<=len)
- continue;
- else
- exit;
- }
- }else if(tokens[1]=="label"){
- ;
- }else if(tokens[1]=="if"){
- #print "ifstack " ifskip() " " ifstack["top"] " " ifstack[ifstack["top"]]
- #printf("ifstack%d>",ifskip())
- #print_array(ifstack)
- if(!ifskip()){
- for(i=2;i<=n;i++)
- expr(tokens[i]);
- ifstack[++ifstack["top"]] = (pop()!=0);
- }else{
- #print "<skip if>"
- ifstack[++ifstack["top"]] = -1;
- }
- #printf("ifstack>")
- #print_array(ifstack)
- }else if(tokens[1]=="else"){
- #printf("ifstack>")
- #print_array(ifstack)
- if(ifstack[ifstack["top"]]==1){
- ifstack[ifstack["top"]] = 0;
- }else if(ifstack[ifstack["top"]]==0)
- ifstack[ifstack["top"]] = 1;
- else
- ;
- #printf("ifstack>")
- #print_array(ifstack)
- }else if(tokens[1]=="endif"){
- #printf("ifstack>")
- #print_array(ifstack)
- delete ifstack[ifstack["top"]]
- ifstack["top"]--;
- #printf("ifstack>")
- #print_array(ifstack)
- #print "endif";
- }else if(tokens[1]=="elseif"){
- if(ifstack[ifstack["top"]]==1){
- ifstack[ifstack["top"]] = 0;
- }else if(ifstack[ifstack["top"]]==0){
- for(i=2;i<=n;i++)
- expr(tokens[i]);
- ifstack[ifstack["top"]] = (pop()!=0);
- }else
- ;
- }else if(tokens[1]=="gosub"){
- if(ifskip())continue
- callstack[++callstack["top"]] = lp
- jump(tokens[2])
- if(lp<=len)
- continue;
- else
- exit;
- }else if(tokens[1]=="return"){
- if(ifskip())continue
- jump(callstack[callstack["top"]--])
- if(lp<=len)
- continue;
- else
- exit;
- }else if(tokens[1]=="puts"){
- if(ifskip())continue
- #print tokens[2]
- printf("puts>")
- for(i=2;i<=n;i++)
- printf("%s ",""tokens[i]);
- print ""
- }else if(tokens[1]=="print"){
- if(ifskip())continue
- }else if(tokens[1]=="rem"){
- ;
- }else if(tokens[1]=="quest"){
- }
- }else{
- if(ifskip())continue
- print data[lp];
- getline;
- }
- }
- }
Add Comment
Please, Sign In to add comment