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

把词法自动生成,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

KAVA 恩,简单的脚本语言,HOHO相关推荐

  1. java 易变变量_提高java编程质量 - (一)易变业务使用脚本语言编写

    脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型: 2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务 3.简单:脚本语言语 ...

  2. MAX Script 脚本语言

    引用:http://edu.itbulo.com/200604/94354.htm [导读]我们知道,使用3D Studio MAX 4.0系统可以帮你轻而易举地创建复杂的场景,并让任何对象生成动画, ...

  3. TCL脚本语言基础介绍

    Tcl简介(一):Tcl 语法 Tcl 语法 Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦,这片文章对 Tcl有很好的描述和说明.如 ...

  4. TCL脚本语言详解(1)

    语言简介 TCL是一种很通用的脚本语言,功能强大.最早称为"工具命令语言""Tool Command Language",但是目前已经不是这个含义,不过我们仍然 ...

  5. python是脚本语言、主要用作系统编程和_关于Python是不是脚本语言的探讨

    很多人认为Python是单纯的脚本语言,认为它是一门简单的语言.其实,脚本语言并不是所谓的简单,而是简洁.Python可以使得一些复杂的编程任务变得简单而不是简单的编程语言.所以要是给Python一个 ...

  6. python是不是脚本_关于Python是不是脚本语言的探讨

    很多人认为Python是单纯的脚本语言,认为它是一门简单的语言.其实,脚本语言并不是所谓的简单,而是简洁.Python可以使得一些复杂的编程任务变得简单而不是简单的编程语言.所以要是给Python一个 ...

  7. python是脚本还是编程语言_关于Python是不是脚本语言的探讨

    很多人认为Python是单纯的脚本语言,认为它是一门简单的语言.其实,脚本语言并不是所谓的简单,而是简洁.Python可以使得一些复杂的编程任务变得简单而不是简单的编程语言.所以要是给Python一个 ...

  8. pythonios脚本语言-iOS开发Swift篇—(一)简单介绍

    一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为"雨燕",是它的LOGO 是一只燕子,跟Objective-C一样,可以用于 ...

  9. 最近写了一个简单的面向对象的脚本语言 Q 语言

    最近写了一个简单的面向对象的脚本语言 Q 语言,语法类似于 Javascript, 加入了一些 python 的语法功能. 同时实现了部分的 Javascript prototype 的功能 (个人觉 ...

最新文章

  1. 成为算法工程师的路上,掌握什么思维会让自我提升突飞猛进?
  2. 使用java检测网络连接状况
  3. 8.3 matlab图形用户界面设计方法
  4. Base64Util 用户名和密码Base64编码Java代码
  5. 织梦手机版list.php,解决织梦一级目录作域名list.php无法跳转到手机站的问题
  6. php mvc多态实例,asp.net mvc-多态模型绑定
  7. IP地址子网掩码位数换算方法及解释子网掩码的作用
  8. vue一个页面用两个以上页面 时时刷新
  9. Python开发手册
  10. ubuntu 18.04 安装谷歌输入法
  11. 【题解】【AcWing】3505. 最长ZigZag子序列
  12. python123测验答案第七周_测验7: 文件和数据格式化 (第7周)
  13. 摘录整理:日本文化常识之历史篇
  14. Hie with the Pie
  15. C. The Intriguing Obsession
  16. 做wish用多大的虚拟服务器,虚拟海外仓适应于wish,ebay,速卖通,自营平台
  17. 如何手动制作透明的图片相框 可以供android使用
  18. 手把手教你Java/JDK安装与环境搭建
  19. 数字化采购管理 招标采购系统源码
  20. 华为magicbook2019锐龙 无线网卡驱动下载

热门文章

  1. php实现秒杀倒计时,小程序中实现电商秒杀倒计时的效果
  2. 大地女神该亚与第一代天神乌拉诺斯
  3. java毕业生设计校园统一网络授课平台系统计算机源码+系统+mysql+调试部署+lw
  4. (双币对冲)博弈大师套利-EA基于风险最小化,利润最大化研发宗旨,最稳定的盈利方法非对冲套利莫属
  5. 为什么大家说mysql数据库单表最大两千万?
  6. 感受一下卸载“腾讯电脑管家”的痛
  7. vue、Menu 导航菜单、Menu属性事件、vue Menu 全部导航菜单、vue Menu 全部属性事件
  8. Collection类之详解(一)
  9. 【Java】正则表达式的使用以及解析XML
  10. Advanced Hall Sensors Ltd