本系列之前的文章:

Antlr4的分析错误处理

Antlr4实现数学四则运算

Antlr4添加中文变量赋求值,括号,各种问题

Antlr4: 修改语法规则更接近普通BNF格式

Antlr4实现简单语言之整数比较表达式

这一步, 实现了最简单的单条件, 只有"条件为真"时执行单语句. 例如:

变量=1
如果 变量<2 变量=变量×2
变量

返回2

实现

语法规则修改, 将原本的'声明'拆分出多个规则:

声明
: 赋值声明
| 如果声明
| 求值声明
| T新行
; 如果声明
: '如果' 表达式 声明
; 赋值声明
: T变量名 '=' 表达式 T新行
; 求值声明
: 表达式 T新行
;

"定制访问器"中, 赋值/求值声明只需修改类型, 添加的"如果声明"部分(需改名为"条件声明"之类):

  @Override
public 节点 visit如果声明(如果声明Context 上下文) {
条件节点 节点 = new 条件节点();
节点.条件 = visit(上下文.表达式());
节点.条件.原始文本 = 上下文.表达式().getText();
节点.条件为真分支 = visit(上下文.声明());
return 节点;
}

语法树节点新增类型:

public class 条件节点 extends 节点 {

  public 节点 条件;
public 节点 条件为真分支;
}

"运行器"的"求值"方法中添加条件节点的处理:

     else if (节点 instanceof 条件节点) {
Object 条件 = 求值(((条件节点) 节点).条件);
if (条件 instanceof Boolean) {
return (boolean)条件 ? 求值(((条件节点) 节点).条件为真分支) : null;
} else {
System.err.println("[运行时错误] 条件部分需为布尔值: " + ((条件节点) 节点).条件.原始文本);
return null;
}
}

下面, 需要添加条件语句中对换行以及条件执行多个语句的支持, 需要选择是用{}还是其他特殊规则决定条件语句范围.

2018-02-18 Antlr4实现简单语言之条件语句的更多相关文章

  1. go语言的条件语句和循环语句

    一,条件语句 常见的就是if语句: 单支条件语句:     if   条件 :执行语句   (注,如果是没有逻辑运算符连接的话,是可以不需要括号的,也可以加上括号,如:if (条件):执行语句) 双支 ...

  2. 2018-01-17 Antlr4实现简单语言之整数比较表达式

    续上文Antlr4: 修改语法规则更接近普通BNF格式. 例程 为先=1 为先 为2 => 返回false '为'作为关键词, 与数字可以连写, 但必须与变量名用空格间隔: 变量一=1 变量二= ...

  3. 【C语言】-条件语句-switch语句

    switch语句: 用于直接处理不同情况下的多路问题. switch语句又可称为开关语句,其执行流程和多分支if语句类似. switch (表达式) { case 常量表达式1:语句组1;break; ...

  4. C语言预处理条件语句的 与或运算

    1.#ifdef 与或运算 #ifdef  (MIN)  && (MAX)  ----------------------------错误使用 #if  defined(MIN)  & ...

  5. (旧)子数涵数·C语言——条件语句

    首先,我们讲一下理论知识,在编程中有三种结构,分别是顺序结构.条件结构.循环结构,如果用流程图来表示的话就是: 那么在C语言中,如何灵活运用这三种结构呢?这就需要用到控制语句了. 而条件语句便是控制语 ...

  6. Go 语言条件语句

    条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 下图展示了程序语言中条件语句的结构: Go 语言提供 ...

  7. Go语言【第五篇】:Go条件语句

    Go语言条件 条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为true来决定是否执行指定语句,并在条件为false的情况再执行另外的语句.下图展示了程序语言中条件语句的结构: Go语言提 ...

  8. GO语言基础条件、跳转、Array和Slice

    1. 判断语句if 1. 条件表达式没有括号(这点其他语言转过来的需要注意) 2. 支持一个初始化表达式(可以是并行方式,即:a, b, c := 1, 2, 3) 3. 左大括号必须和条件语句或 e ...

  9. 【下载分】C语言for循环语句PK自我活动

    想了解自己C语言for语句的掌握程度吗?敢和自己PK较量一番吗?參加"C语言for循环语句PK自我活动",仅仅要成绩70分以上.就可赢得CSDN下载分. 12道题目题库动态读取,每 ...

随机推荐

  1. Visual Stuido快捷键

    转自:http://www.cnblogs.com/TankXiao/p/3164995.html 整理了一些VS的快捷键 格式化整个文档:(Ctrl + K, Ctrl + D)智能感知:(Ctrl ...

  2. XCode 无法识别设备

    XCode 取消Unpair Device 后不能读取设备 1:退出XCode 2:断开设备连接 3:在终端执行‘sudo pkill usbmuxd’ 4:重启XCode 5:连接设备即可

  3. Android框架式编程之MVP架构

    MVP(Model-View-Presenter)模式.是将APP的结构分为三层:View - Presenter - Model. View 1. 提供UI交互 2. 在presenter的控制下修 ...

  4. Spring Boot实现热部署

    在Spring Boot实现代码热部署是一件很简单的事情,代码的修改可以自动部署并重新热启动项目. 引用devtools依赖 <dependency> <groupId>org ...

  5. 重磅:Spring Boot 2.0 正式发布!

    Spring Boot 2.0 正式发布! 2018/03/01最新消息,传得沸沸扬扬的Spring Boot 2.0 正式发布了. 小编去看了下Spring Boot的官网,正式版本已经释放出来了! ...

  6. @pathvariable和@RequestParam的区别

    @PathVariable 获取的是请求路径url中的值: (http://xxx.xxx.com/get_10.html,侧重于请求的URL路径里面的{xx}变量 ) //获取url中某部分的值 @ ...

  7. ubuntu下 远程连接windows服务器工具Remmina

    工具不错 https://blog.csdn.net/skykingf/article/details/71539237

  8. WebView使用_WebView监听网页下载_DownloadManager使用

    最近在做一个较简单的项目:通过一个webview来显示一个网页的App 这个网页有下载的功能,关于这一功能需要用到两个知识点: 1.webview监听网页的下载链接.(webview默认情况下是没有开 ...

  9. Atom编辑器中安装Emmet插件失败的问题

    今天使用Atom编辑器安装Emmet插件的时候,刚开始的时候报错: 报错内容如下: Installing “emmet@2.4.3” failed.Show output… Compiler tool ...

  10. SpringCloud Eureka服务注册及发现——服务端/客户端/消费者搭建

    Eureka 是 Netflix 出品的用于实现服务注册和发现的工具. Spring Cloud 集成了 Eureka,并提供了开箱即用的支持.其中, Eureka 又可细分为 Eureka Serv ...