Advertisement
Guest User

Untitled

a guest
Jul 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var oper= ["+", "=","-", "*", "/", "<", ">", ">=", "<=", "==", "(", ")", "?" , ":", "!", "||", "&&" ,";", " "/* "+=" , "-=", "++", "--", "*=", "/="" */ ];
  2. var sOper= ["=", "|","&"];
  3.  
  4. class Pos {
  5.     constructor(str,pos) {
  6.         this.str = str;
  7.         this.pos = pos;
  8.     }
  9.     skip() {
  10.         return new Pos(this.str,this.pos+1);
  11.     }
  12.  
  13.     skipWhile(char) {
  14.         while (this.getChar() === char) {
  15.             this.pos++;
  16.         }
  17.         return new Pos(this.str,this.pos);
  18.     }
  19.  
  20.     getChar() {
  21.         return this.str[this.pos];
  22.     }
  23.  
  24.     getVal(type) {
  25.         if (type === "oper") {
  26.             let t = this;
  27.             let res = "";
  28.             let a = this.getChar();
  29.             res+=a;
  30.             t = t.skip();
  31.             a= t.getChar();
  32.             if  (sOper.some(t=>t===a)) {
  33.                 res += a;
  34.                 t = t.skip();
  35.                 a = t.getChar();
  36.             }
  37.             this.pos = t.pos;
  38.             return res;
  39.         } else if (type === "number"){
  40.             let t = this;
  41.             let res = "";
  42.             let a = this.getChar();
  43.             while(!oper.some(t=>t=== a)){
  44.                 if  (a >= '0' && a <= '9') {
  45.                     res += a;
  46.                     t = t.skip();
  47.                     a = t.getChar();
  48.                 } else {
  49.                     alert("error of Syntax1");
  50.                     return "error";
  51.                 }
  52.             }
  53.             this.pos = t.pos;
  54.             return res;
  55.         } else {
  56.             let t = this;
  57.             let res = "";
  58.             let a = this.getChar();
  59.             while(!oper.some(t=>t=== a)){
  60.                 if  (a >= 'a' && a <= 'z' || a >= '0' && a <= '9' || a >= 'A' && a <= 'Z' ) {
  61.                     res += a;
  62.                     t = t.skip();
  63.                     a = t.getChar();
  64.                 } else {
  65.                     alert("error of Syntax2");
  66.                     return "error";
  67.                 }
  68.             }
  69.             this.pos = t.pos;
  70.             return res;
  71.         }
  72.     }
  73.  
  74. }
  75.  
  76. class token {
  77.     constructor(str){
  78.         this.tkn= new Pos(str,0);
  79.         this.next();
  80.     }
  81.  
  82.     next(){
  83.         this.start = this.tkn.skipWhile(" ");
  84.         var a = this.start.getChar();
  85.       //  console.log(a);
  86.         if (oper.some(t => t === a)){
  87.             this.val=this.start.getVal("oper");
  88.             this.id="oper";
  89.         } else if (a >= 'a' && a <= 'z' || a >= 'A' && a <= 'Z') {
  90.             this.val = this.start.getVal("ident");
  91.             this.id="ident";
  92.             if (this.val === "true" || this.val === "false"){
  93.                 this.id="boolean";
  94.             }
  95.         } else if (a >= '0' && a <= '9') {
  96.             this.val = this.start.getVal("number");
  97.             this.id = "number";
  98.         } else {
  99.             console.log("error of token3");
  100.             return "error"
  101.         }
  102.         if (this.val === "error"){
  103.             //исключение
  104.         }
  105.         this.tkn=this.start;
  106.     }
  107.  
  108.     getVal(){
  109.         return this.val;
  110.     }
  111.     getId(){
  112.         return this.id;
  113.     }
  114.  
  115. }
  116.  
  117. var t = new token("var lol= 235+sd/sdw3 + 23;");
  118. /*while(t.getVal() != ";"){
  119.     alert(t.getVal());
  120.     t.next();
  121. }*/
  122. var sym;
  123.  
  124.  
  125. var m = new Map();
  126. class map {
  127.     constructor (key, any) {
  128.         m.set(key, any);
  129.     }
  130.  
  131. }
  132.  
  133. let s = new Set();
  134.  
  135. class set {
  136.     constructor(name) {
  137.         s.add(name)
  138.     }
  139. }
  140.  
  141. s.add('sd');
  142. s.add('sdw3');
  143. new map('sd', 10);
  144. new map('sdw3', 2);
  145. new map('z', 15);
  146. var str = 'var lol= 235+sd/sdw3 + 23;';
  147. console.log("result = " + parse());
  148.  
  149. function parse() {
  150.     //var a = new token(str);
  151.     var n;
  152.     if (';' !== t.getVal()) {
  153.         //console.log(t.getVal());
  154.         n = parseE();
  155.        // console.log(n);
  156.         parse();
  157.         return n;
  158.     }
  159.     else {
  160.         //return 'Syntax Error'
  161.         return parseE();
  162.     }
  163. }
  164.  
  165. function parseEE() {
  166.     var a =  parseNew(parseF());
  167.     console.log("ans "+a);
  168. }
  169.  
  170. //<E>  ::= <T> <E’>.
  171. function parseE() {
  172.     if (t.getId() === 'boolean') {
  173.         parseEE();
  174.     }
  175.     return parse_E(parseT());
  176. }
  177.  
  178. //<comparison> ::=
  179. //      <arith_expr> <comparison_op> <arith_expr>
  180. function parseNew(n)  {
  181.     if (t.getVal() === '>=') {
  182.         t.next();
  183.         return (n >= parseF());
  184.     } else if (t.getVal() === '<=') {
  185.         t.next();
  186.         return (n <= parseF());
  187.     }
  188.     else if (t.getVal() === '>') {
  189.         t.next();
  190.         return (n > parseF());
  191.     }
  192.     else if (t.getVal() === '==') {
  193.         t.next();
  194.         return (n === parseF());
  195.     }
  196.     else if (t.getVal() === '<') {
  197.         t.next();
  198.         return (n < parseF());
  199.     }
  200.     return n;
  201. }
  202.  
  203. //<arith_expr> ::=
  204. //         <arith_expr> + <term>
  205. //         | <arith_expr> - <term>
  206. //         | <term>.
  207. function parse_E(n) {
  208.     if (t.getVal() === '+') {
  209.         t.next();
  210.         return parse_E(n + parseT());
  211.     }
  212.     if (t.getVal() === '-') {
  213.         t.next();
  214.         return parse_E(n - parseT());
  215.     }
  216.     return n;
  217. }
  218.  
  219. //<T>  ::= <F> <T’>.
  220. function parseT() {
  221.     return parse_T(parseF());
  222. }
  223.  
  224. //<term> ::=
  225. //         <term> * <factor>
  226. //         | <term> / <factor>
  227. //         | <factor>.
  228. function parse_T(n) {
  229.     if (t.getVal() === '*') {
  230.         t.next();
  231.         return parse_T(n * parseF());
  232.     }
  233.     if (t.getVal() === '/') {
  234.         t.next();
  235.         return parse_T(n / parseF());
  236.     }
  237.     if (t.getId() === 'boolean') {
  238.         parseEE();
  239.     }
  240.     return n;
  241. }
  242.  
  243. //<value> ::=
  244. //  var <ident> = <expr> .
  245. //  | <expr> .
  246. //  | <ident> = <expr> .
  247. function parseF() {
  248.     if (Number(t.getVal())) {
  249.         var num = t.getVal();
  250.         t.next();
  251.         return num;
  252.     }
  253.     else if (Symbol(t.getVal())) {
  254.         if (t.getVal() === 'var') {
  255.             t.next();
  256.             var key = t.getVal();
  257.             s.add(key);
  258.             t.next();
  259.             if (t.getVal() === '=') {
  260.                 t.next();
  261.                 m.set(key, parseE());
  262.                 return;
  263.             }
  264.             else {
  265.                 s.add(key);
  266.             }
  267.         }
  268.        // console.log(t);
  269.         if (s.has(t.getVal())) {
  270.             var key = t.getVal();
  271.             t.next();
  272.             if (t.getVal() === '=') {
  273.                 t.next();
  274.                 m.set(key, parseE());
  275.             }
  276.             var n;
  277.             var i = m.get(t.getVal());
  278.             t.next();
  279.             return i;
  280.         }
  281.         else {
  282.             //console.log('SE');
  283.             return 'SE';
  284.         }
  285.     }
  286.     else if (sym === '(') {
  287.         t.next();
  288.         var n = parseE();
  289.         //проверка, что есть ")"
  290.         // expect(Tag.RPAREN);
  291.         return n;
  292.     }
  293.     if (t.getVal() === '-') {
  294.         // expect(Tag.DIF);
  295.         return -1 * parseF();
  296.     }
  297.     if (t.getId() === 'boolean') {
  298.         t.next();
  299.         parseEE();
  300.     }
  301.     //не должен выводить ничего
  302.     //return 1000;
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement