Guest User

Untitled

a guest
Sep 1st, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Awk 6.03 KB | None | 0 0
  1. #!/usr/bin/awk -f
  2. function p(x){
  3.     print x;
  4. }
  5. function expr(x    ,top){
  6.     top = stack["top"];
  7.     if (x ~ /^[+-]?[0-9]+$/) {
  8.         stack[++stack["top"]] = x;
  9.     }else if (x == "+" && top > 1) {
  10.         stack[top-1] += stack[top];
  11.         stack["top"]--;
  12.     } else if (x == "-" && top > 1) {
  13.         stack[top-1] -= stack[top];
  14.         stack["top"]--;
  15.     } else if (x == "*" && top > 1) {
  16.         stack[top-1] *= stack[top];
  17.         stack["top"]--;
  18.     } else if (x == "/" && top > 1) {
  19.         stack[top-1] /= stack[top];
  20.         stack["top"]--;
  21.     } else if (x == "^" && top > 1) {
  22.         stack[top-1] ^= stack[top];
  23.         stack["top"]--;
  24.     }else if(x ~ /^[a-zA-Z]+$/){
  25.         stack[++stack["top"]] = env[x];
  26.     } else {
  27.         printf("error: cannot evaluate %s\n", x)
  28.         stack["top"] = 0
  29.     }
  30. }
  31. function push(x){
  32.      stack[++stack["top"]] = x;
  33. }
  34. function pop(    x){
  35.     x = stack[stack["top"]--]
  36.     return x
  37. }
  38. function jump(label){
  39.     for(i=1;i<=len;i++){
  40.         if(data[i] ~ ("^@label +" label " *$")){
  41.             lp = i;
  42.             break;
  43.         }
  44.     }
  45. }
  46. function ifskip(x){
  47.     #print "skip> " (ifstack[ifstack["top"]]!=1)
  48.     return ifstack[ifstack["top"]]!=1
  49.     #if(ifstack[ifstack["top"]]==1){
  50.     #    return 0;
  51.     #}else{
  52.     #    return 1;
  53.     #}
  54.     #ifstack[++ifstack["top"]] = pop()    
  55. }
  56. function print_array(A,   i,len,s){
  57.     len=length(A);
  58.     s = A[0] "|"
  59.     for(i=1;i<=len;i++)
  60.         s = s " " A[i];
  61.         print s;
  62. }
  63. BEGIN {
  64.     ifstack["top"] = 0
  65.     ifstack[0] = 1;
  66.     FS = " "
  67.     i = 1;
  68.     while(getline<"data2.txt">0)
  69.         data[i++] = $0;
  70.     #/*asort(data)*/
  71.     #print "end";
  72.     #for(i in data){
  73.     #    print i "->" data[i];
  74.     #}
  75.     len = length(data);
  76.     for(lp=1;lp<=len;lp++){
  77.         line = data[lp];
  78.         #print "code" lp ">" line
  79.         gsub(/^[ \t]+/,"",line)
  80.         if(substr(line,1,1)=="@"){
  81.             n = split(substr(line,2),tokens,FS);
  82.            
  83.             if(tokens[1]=="exit"){
  84.                 if(ifskip())continue
  85.                 exit;
  86.             }else if(tokens[1]=="expr"){
  87.                 if(ifskip())continue
  88.                 for(i=2;i<=n;i++)
  89.                     expr(tokens[i]);
  90.             }else if(tokens[1]=="debug"){
  91.                 if(ifskip())continue
  92.                 for(i=2;i<=n;i++)
  93.                     expr(tokens[i]);
  94.                 print pop()
  95.             }else if(tokens[1]=="let"){
  96.                 if(ifskip())continue
  97.                 for(i=3;i<=n;i++)
  98.                     expr(tokens[i]);
  99.                 env[tokens[2]] = pop()
  100.             }else if(tokens[1]=="goto"){
  101.                 if(ifskip())continue
  102.                 jump(tokens[2]);
  103.                 if(lp<=len)
  104.                     continue;
  105.                 else
  106.                     exit;
  107.             }else if(tokens[1]=="branch"){
  108.                 if(ifskip())continue
  109.                 for(i=3;i<=n;i++)
  110.                     expr(tokens[i]);
  111.                 if(pop()){
  112.                     jump(tokens[2]);
  113.                     if(lp<=len)
  114.                         continue;
  115.                     else
  116.                         exit;
  117.                 }
  118.             }else if(tokens[1]=="label"){
  119.                 ;
  120.             }else if(tokens[1]=="if"){
  121.                 #print "ifstack " ifskip() " " ifstack["top"] " " ifstack[ifstack["top"]]
  122.                 #printf("ifstack%d>",ifskip())
  123.                 #print_array(ifstack)
  124.                 if(!ifskip()){
  125.                     for(i=2;i<=n;i++)
  126.                         expr(tokens[i]);
  127.                     ifstack[++ifstack["top"]] = (pop()!=0);
  128.                 }else{
  129.                     #print "<skip if>"
  130.                     ifstack[++ifstack["top"]] = -1;
  131.                 }
  132.                 #printf("ifstack>")
  133.                 #print_array(ifstack)
  134.             }else if(tokens[1]=="else"){
  135.                 #printf("ifstack>")
  136.                 #print_array(ifstack)
  137.                 if(ifstack[ifstack["top"]]==1){
  138.                     ifstack[ifstack["top"]] = 0;
  139.                 }else if(ifstack[ifstack["top"]]==0)
  140.                     ifstack[ifstack["top"]] = 1;
  141.                 else
  142.                     ;
  143.                 #printf("ifstack>")
  144.                 #print_array(ifstack)                
  145.             }else if(tokens[1]=="endif"){
  146.                 #printf("ifstack>")
  147.                 #print_array(ifstack)
  148.                 delete ifstack[ifstack["top"]]
  149.                 ifstack["top"]--;
  150.                 #printf("ifstack>")
  151.                 #print_array(ifstack)
  152.                 #print "endif";
  153.             }else if(tokens[1]=="elseif"){
  154.                 if(ifstack[ifstack["top"]]==1){
  155.                     ifstack[ifstack["top"]] = 0;
  156.                 }else if(ifstack[ifstack["top"]]==0){
  157.                     for(i=2;i<=n;i++)
  158.                         expr(tokens[i]);
  159.                     ifstack[ifstack["top"]] = (pop()!=0);
  160.                 }else
  161.                     ;                
  162.             }else if(tokens[1]=="gosub"){
  163.                 if(ifskip())continue
  164.                 callstack[++callstack["top"]] = lp
  165.                 jump(tokens[2])
  166.                 if(lp<=len)
  167.                     continue;
  168.                 else
  169.                     exit;
  170.             }else if(tokens[1]=="return"){
  171.                 if(ifskip())continue
  172.                 jump(callstack[callstack["top"]--])
  173.                 if(lp<=len)
  174.                     continue;
  175.                 else
  176.                     exit;
  177.             }else if(tokens[1]=="puts"){
  178.                 if(ifskip())continue
  179.                 #print tokens[2]
  180.                 printf("puts>")
  181.                 for(i=2;i<=n;i++)
  182.                     printf("%s ",""tokens[i]);
  183.                 print ""
  184.             }else if(tokens[1]=="print"){
  185.                 if(ifskip())continue
  186.             }else if(tokens[1]=="rem"){
  187.                 ;
  188.             }else if(tokens[1]=="quest"){
  189.             }
  190.         }else{
  191.             if(ifskip())continue
  192.             print data[lp];
  193.             getline;
  194.         }
  195.     }
  196.  }
Add Comment
Please, Sign In to add comment