我们先来想一下语法

一般脚本语言不需要定义类型直接在赋值的时候确定

  1. 我们主要考虑一下变量的类型
a = 1;
b = 1.1;
c = "str";

一般来讲,我们使用这三种类型,整形,浮点型,字符串型

不过我们以后还可能使用原生类型等

  1. 变量的基本运算和其他语言基本相同
a = b + 12.4;
c = "hehe" + a + "haha"
  1. 函数定义 我们可以模仿一下js的函数定义方式,不过变量使用的时候我们需要声明才可以使用全局变量
function func(){global outervar;}
  1. 简单的流程控制
for(a = 0;a<10;a++) {break;continue;}
if(a){}

文法

我们先简单写一下文法,因为bison是LALR文法,注意一下和LL系列文法的区别

如果是自己要制作编程语言的话不妨参考一下C语言的bison文法:http://www.quut.com/c/ANSI-C-grammar-y-1998.html

一般情况下,非终结符我们规定都是小写的,终结符都是大写的

先看开头部分

translation_unit: definition_or_statement
| translation_unit definition_or_statement
;

我们认为所有的语句,函数等都会规约成 translation_unit ,多个语句或者是定义可以被规约成一个,

|是代表或的意思,;这小段文法的结束

definition_or_statement:function_definition
|statement
;

一般语句和定义可以由语句或者函数定义规约

函数定义我们认为类似于这样的 function funcname(arg1,arg2){} 和下面对应,我们可以定义有参数和无参的函数

function_definition: FUNCTION IDENTIFIER LP arglist RP block
|FUNCTION IDENTIFIER LP RP block
;

语句:

statement:expression_statement
|global_declaration
|for_statement
|if_statement
|break_statement
|continue_statement
|return_statement
;

表达式语句:我们每个语句都是由;结尾的,SEMICOLON就是分号

expression_statement:expression SEMICOLON
;

表达式 一般就都有值,可以计算的,比如赋值,加减乘除计算等等

LALR 文法一般是运算级高的先规约,一般情况下常量先规约,一般是单目运算符,括号,函数调用先规约

primary_expression:SUB primary_expression /* 取负 */
|LP expression RP /* 括号 */
|IDENTIFIER /* 变量名 */
|STRING_LITERAL /* 字符串 */
|INT_LITERAL /* 整数 */
|DOUBLE_LITERAL /* 浮点 */
|IDENTIFIER LP RP /* 无参数函数调用 */
|IDENTIFIER LP arglist RP
;

下面开始简单的四则运算乘除法会比加减有更高的优先级别,所以primary_expression优先规约成mul_div_expression

mul_div_expression:primary_expression
|mul_div_expression DIV primary_expression
|mul_div_expression MUL primary_expression
;

加减法:

add_sub_expression:mul_div_expression
|add_sub_expression ADD mul_div_expression
|add_sub_expression SUB mul_div_expression
;

同理比较运算和等于不等于运算省略

上面的可以规约为赋值表达式 (ASSIGN 是等于=在lex文件中定义)

expression: value_expression
|IDENTIFIER ASSIGN expression

表达式可以在上面规约为语句,因此表达式部分的文法就完成了

if语句也很简单

if_statement: IF LP expression RP block
;

for语句:

for_statement: FOR LP expression_option SEMICOLON expression_option SEMICOLON expression_option  RP block
;

程序块:

block:LC RC
|LC statement_list RC
;

break,return,continue都一样

break_statement:BREAK SEMICOLON
;
continue_statement:CONTINUE SEMICOLON
;

还有一些没解释的都很容易理解

现在已经定义的全部文法:

translation_unit: definition_or_statement
| translation_unit definition_or_statement
;
definition_or_statement:function_definition
|statement
;
function_definition: FUNCTION IDENTIFIER LP arglist RP block
|
FUNCTION IDENTIFIER LP RP block
;
statement:expression_statement
|global_declaration
|for_statement
|if_statement
|break_statement
|continue_statement
|return_statement
;
expression_statement:expression SEMICOLON
;
expression: value_expression
|IDENTIFIER ASSIGN expression
;
value_expression: compare_expression
|value_expression EQ compare_expression
|value_expression NE compare_expression
;
compare_expression:add_sub_expression
|compare_expression GT add_sub_expression
|compare_expression GE add_sub_expression
|compare_expression LT add_sub_expression
|compare_expression LE add_sub_expression
;
add_sub_expression:mul_div_expression
|add_sub_expression ADD mul_div_expression
|add_sub_expression SUB mul_div_expression
;
mul_div_expression:primary_expression
|mul_div_expression DIV primary_expression
|mul_div_expression MUL primary_expression
;
primary_expression:SUB primary_expression
|LP expression RP
|IDENTIFIER
|STRING_LITERAL
|INT_LITERAL
|DOUBLE_LITERAL
|IDENTIFIER LP RP
|IDENTIFIER LP arglist RP
;
statement_list:statement_list statement
|statement
;
block:LC RC
|LC statement_list RC ;
arglist:arglist COMMA arg
|
arg
;
arg: IDENTIFIER
;
expression_option:
|expression
;
for_statement: FOR LP expression_option SEMICOLON expression_option SEMICOLON expression_option RP block
;
if_statement: IF LP expression RP block
;
break_statement:BREAK SEMICOLON
;
continue_statement:CONTINUE SEMICOLON
;
return_statement:RETURN IDENTIFIER
;
global_declaration:GLOBAL IDENTIFIER
;

使用bison和yacc制作脚本语言(2)的更多相关文章

  1. 使用bison和yacc制作脚本语言(1)

    使用bison和yacc制作脚本语言(1) 环境: 环境 windows 10 Cygwin64 语言 C 工具 mingw bison flex 主要是使用bison和flex这两个软件,编译器无所 ...

  2. 使用bison和yacc制作脚本语言(3)

    我们现在已经可以写好文法了,下一步我们打算开始正式创建工程了 在工程目录下,我们创建如下文件夹 ./include ./memory ./ms include文件夹下我们将放头文件 memory是内存 ...

  3. 使用bison和yacc制作脚本语言(4)

    我们现在开始设计数据结构: interpreter.h #ifndef INTERPRETER #define INTERPRETER #include "../include/eval.h ...

  4. [Java面试九]脚本语言知识总结.

    核心内容概述 1.JavaScript加强,涉及到ECMAScript语法.BOM对象.DOM对象以及事件. 2.Ajax传统编程. 3.jQuery框架,九种选择器为核心学习内容 4.JQuery ...

  5. Perl,Python,Ruby,Javascript 四种脚本语言比较

    Perl 为了选择一个合适的脚本语言学习,今天查了不少有关Perl,Python,Ruby,Javascript的东西,可是发现各大阵营的人都在吹捧自己喜欢的语言,不过最没有争议的应该是Javascr ...

  6. JAVA平台上的网络爬虫脚本语言 CrawlScript

    JAVA平台上的网络爬虫脚本语言 CrawlScript 网络爬虫即自动获取网页信息的一种程序,有很多JAVA.C++的网络爬虫类库,但是在这些类库的基础上开发十分繁琐,需要大量的代码才可以完成一 个 ...

  7. Shell简介:1分钟理解什么是Shell 脚本语言 解释器 以及编译器和编译语言

    Shell简介:1分钟理解什么是Shell 脚本语言 解释器 以及编译器和编译语言 现在我们使用的操作系统(Windows.Mac OS.Android.iOS 等)都是带图形界面的,简单直观,容易上 ...

  8. PCB 规则引擎之脚本语言JavaScript应用评测

    世界上没有好做的软件,觉得好做,只是你的系统简单而已,而不是哪个行业简单,特别像我们PCB制造企业务逻辑的很复杂的,仅仅靠决策树中的每个节点布置决策逻辑是不能满足要求的,所以我们在制作PCB规则引擎必 ...

  9. Procomm Plus 与ASPECT脚本语言在基于远程终端设备上的测试应用

    产测 ---------------------------------------------------- 原文:http://www.bixuanzl.com/20180801/1084478. ...

随机推荐

  1. linux中进入mysql时报错Access denied for user 'root'@'localhost' (using password: YES)解决方案

    之前在linux中装完mysql后直接在命令行窗口输入mysql就会进入数据库了,但是今天输入mysql命令后直接报错,如下图: 之后输入:mysql -uroot -p 提示输入密码:***** 还 ...

  2. DB TABLE实践

    我的数据库设计实践(一)   兜兜转转,突然发现我现在已经是一个老司机了,一直写代码都很忙,没有把很多点点滴滴的记录下来,今天开始就开始一个系列,分析当年我接触或者我设计过的表结构,有好有坏,有欢喜也 ...

  3. 为什么说 Java 程序员必须掌握 Spring Boot ?

    原作者https://www.cnblogs.com/ityouknow/p/9175980.html Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,就单从我个人 ...

  4. [原]如何在Android用FFmpeg+SDL2.0之同步音频

    同步音频的原理可以参考:http://dranger.com/ffmpeg/tutorial05.html  本文是在 [原]如何在Android用FFmpeg+SDL2.0之同步视频 的基础上面继续 ...

  5. 阅读MySQL文档第21章摘抄

    触发程序是与表相关的数据库对象. mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); Query OK, 0 ro ...

  6. C 语言实现多态的原理:函数指针

    C语言实现多态的原理:函数指针 何为函数指针?答案:C Programming Language. 能够查阅下,从原理上来讲,就是一个内存地址.跳过去运行相应的代码段. 既然如此,在运行时决定跳到哪个 ...

  7. protobuf编码

     proto2 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的语言无关.平台无 ...

  8. 21、整合Druid数据源

    1).引入外部的数据源(Druid) <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependenc ...

  9. ASP.NET Core 程序发布到Linux(Centos7)爬坑实战

    前言 前阶段弄了个Linux系统想倒腾倒腾.NET Core,结果看了下网上的资料,大部分都是过期的,走了不少弯路,不过还好,今下午总算捣鼓出来了.Linux命令太多了,唉.血的教训:安装一定要看官网 ...

  10. HDU 1013 Digital Roots(to_string的具体运用)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1013 Digital Roots Time Limit: 2000/1000 MS (Java/Othe ...