花了好几个周末,- - 累死我了~
把词法自动生成,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