KAVA 恩,简单的脚本语言,HOHO

花了好几个周末,- - 累死我了~

把词法自动生成,LR,LALR语法自动生成写了一下

目的当然是写一个简单的语言,现在差不多把最最简单的东西实现了,因为以前习惯用C++,因此保留C++里的运算符(除了前++前--,不为啥,因为我用得少,并且没有指针了),以及所有的运算符优先级,不过‘^’符号变成了幂运算,FOR,WHILE,IF,BREAK,CONTINUE都保持,本来觉得 a,b = b,a 这样的运算仅仅是让交换两个变量时好看点(不知道从哪看到的介绍- -,没办法,离开代码好多年- -),为了保持C++里的逗号运算优先级,因此不打算支持,加入了一个 ‘<>’ 用于交换两个变量的值,但是,发现那个运算还可以让函数返回多个值,恩,这个挺好的,还是要有的,但,我还是不想改变逗号的优先级,因为这会我感觉改变了好多好多好多,比如

1. a=b,c=d,e=f;  这样在C++里的赋值语句,如果逗号优先级改变了,会好奇怪 - -

2. 还有 if(a=3,b) 的语句...

因此,加入一个 ‘<-’这样的符号,作为多个变量的赋值,于是就可以写成 a,b <- function();   不过这个语句不支持连续运算,即 a,b <- c,d <- e,f,也不能 a = b,c <- 4,5(这个看起来就让人有歧义),所以仅支持 a,b <- 3; 或者 a,b <- 3,4,5; 或者 a,b <- a=3,b=a,c 等,也不能做为判断语句,即if while for 中的用于判断的语句。

有时间加入函数调用和闭包 o_o, 不看不知道,发现C#和JAVA的语法有了好多改变 ...

随便逛了论坛,发现这些在别人看来都是很成熟很简单的东西了,不过还是写着玩吧,因为大学时就想写... 

 

// ----------------------------- 代码

a=5;
b=0;
while(a-->0)
for(i=1; i<10; i++)
{
if(b>100)
break;
b+=(a+i);
}
c=d=e=a+2;

// ----------------------------- parse 过程

使用产生式规约 : functionlist:
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : expr: REAL
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 = expr2
——————————————————————————
赋值运算,转:
     op = op_assign
  flag1 = f_var
   arg1 = 0
  flag2 = f_const
   arg2 = 0
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr1: expr2
使用产生式规约 : gassignORexpr1:expr1
使用产生式规约 : stat1: gassignORexpr1 ;
使用产生式规约 : functionlist:functionlist stat1
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : expr: REAL
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 = expr2
——————————————————————————
赋值运算,转:
     op = op_assign
  flag1 = f_var
   arg1 = 1
  flag2 = f_const
   arg2 = 1
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr1: expr2
使用产生式规约 : gassignORexpr1:expr1
使用产生式规约 : stat1: gassignORexpr1 ;
使用产生式规约 : functionlist:functionlist stat1
使用产生式规约 : WHILE2: WHILE
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 --
——————————————————————————
后--运算,转换为字节码:
     op = op_decr
    arg = 0
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr: REAL
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 > expr2
——————————————————————————
双目运算,转换为字节码:
     op = op_gt
  flag1 = f_stack
   arg1 = 1
  flag2 = f_const
   arg2 = 1
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr1: expr2
使用产生式规约 : jump:
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : expr: REAL
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 = expr2
——————————————————————————
赋值运算,转:
     op = op_assign
  flag1 = f_var
   arg1 = 2
  flag2 = f_const
   arg2 = 2
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr1: expr2
使用产生式规约 : gassignORexpr1:expr1
使用产生式规约 : for_init:gassignORexpr1
使用产生式规约 : FOR_LOOP:
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : expr: REAL
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 < expr2
——————————————————————————
双目运算,转换为字节码:
     op = op_lt
  flag1 = f_var
   arg1 = 2
  flag2 = f_const
   arg2 = 3
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : for_check:expr2
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 ++
——————————————————————————
后++运算,转换为字节码:
     op = op_incr
    arg = 2
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr1: expr2
使用产生式规约 : gassignORexpr1:expr1
使用产生式规约 : for_act: gassignORexpr1
使用产生式规约 : statlist:
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : expr: REAL
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 > expr2
——————————————————————————
双目运算,转换为字节码:
     op = op_gt
  flag1 = f_var
   arg1 = 1
  flag2 = f_const
   arg2 = 4
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr1: expr2
使用产生式规约 : jump:
使用产生式规约 : stat1: break ;
使用产生式规约 : block: stat1
使用产生式规约 : elsepart:
使用产生式规约 : stat1: IF ( expr1 ) jump block elsepart
——————————————————————————
IF条件语句Jump1,转换为字节码:
     op = op_jumpfalse
  flag1 = f_stack
   arg1 = 1
   arg2 = 3
——————————————————————————
使用产生式规约 : statlist:statlist stat1
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 + expr2
——————————————————————————
双目运算,转换为字节码:
     op = op_add
  flag1 = f_var
   arg1 = 0
  flag2 = f_var
   arg2 = 2
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr: ( expr2 )
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 += expr2
——————————————————————————
赋值运算,转:
     op = op_addassign
  flag1 = f_var
   arg1 = 1
  flag2 = f_stack
   arg2 = 1
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr1: expr2
使用产生式规约 : gassignORexpr1:expr1
使用产生式规约 : stat1: gassignORexpr1 ;
使用产生式规约 : statlist:statlist stat1
使用产生式规约 : block: { statlist }
使用产生式规约 : stat1: FOR ( for_init ; FOR_LOOP for_check ; for_act ) block
——————————————————————————
FOR break,转换为字节码:
     op = op_jump
    arg = 6
——————————————————————————
——————————————————————————
FOR语句,op_jumpfalse,转换为字节码:
     op = op_jumpfalse
  flag1 = f_stack
   arg1 = 1
   arg2 = 11
——————————————————————————
使用产生式规约 : block: stat1
使用产生式规约 : stat1: WHILE2  ( expr1 ) jump block
——————————————————————————
WHILE语句,op_jumpfalse,转换为字节码:
     op = op_jumpfalse
  flag1 = f_stack
   arg1 = 1
   arg2 = 16
——————————————————————————
使用产生式规约 : functionlist:functionlist stat1
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : var: NAME
使用产生式规约 : expr: var
使用产生式规约 : expr2: expr
使用产生式规约 : expr: REAL
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 + expr2
——————————————————————————
双目运算,转换为字节码:
     op = op_add
  flag1 = f_var
   arg1 = 0
  flag2 = f_const
   arg2 = 5
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 = expr2
——————————————————————————
赋值运算,转:
     op = op_assign
  flag1 = f_var
   arg1 = 5
  flag2 = f_stack
   arg2 = 1
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 = expr2
——————————————————————————
赋值运算,转:
     op = op_assign
  flag1 = f_var
   arg1 = 4
  flag2 = f_var
   arg2 = 5
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr: expr2 = expr2
——————————————————————————
赋值运算,转:
     op = op_assign
  flag1 = f_var
   arg1 = 3
  flag2 = f_var
   arg2 = 4
——————————————————————————
使用产生式规约 : expr2: expr
使用产生式规约 : expr1: expr2
使用产生式规约 : gassignORexpr1:expr1
使用产生式规约 : stat1: gassignORexpr1 ;
使用产生式规约 : functionlist:functionlist stat1
语法正确
——————————————————————————
   symbol table : count(6)
         t_real :    a = -1
         t_real :    b = 103
         t_real :    c = 1
         t_real :    d = 1
         t_real :    e = 1
         t_real :    i = 1
——————————————————————————
 constant table
   string table : count(0)
     real table : count(6)
                      5
                      0
                      1
                     10
                    100
                      2
    float table : count(0)
——————————————————————————
             栈 : m_itObj.count()==(0)
——————————————————————————
Press any key to continue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值