2018-02-18 Antlr4实现简单语言之条件语句

简介: 在前作基础上, 使用Antlr4添加简单的条件语句. Based on previous work in the series, add support for simple conditional statement using Antlr4.

本系列之前的文章:

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;
      }
    }

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

相关文章
|
2月前
|
C++
C++语言中流程控制
C++语言中流程控制
14 0
|
2月前
|
C++
在C++语言中条件语句的类型
在C++语言中条件语句的类型
14 0
|
2月前
|
Python
Python语言的表达式
Python语言的表达式
|
2月前
|
存储 C语言
C 语言——表达式
C 语言——表达式
10 0
|
2月前
|
数据挖掘 Java 编译器
python基础语法——条件语句和循环语句
本文基于pycharm编译器,也可以使用Anaconda 里的编译器,将讲解一些python的一些基础语法知识,是对上篇文章的补充,可以和我写的python数据分析——Python语言基础(数据结构基础)结合起来看,有些知识点可能在这篇文章写的不是很全面。
32 0
|
2月前
|
Java C++ Python
Python分支结构内联if讲解
Python分支结构内联if讲解
16 0
|
3月前
|
Rust 安全
Rust语言中的控制流:条件语句、循环与模式匹配详解
本文将深入探讨Rust编程语言中的控制流构造,包括条件语句、循环和模式匹配。我们将了解如何使用这些工具来构建高效、可读和安全的代码。此外,我们还将探讨Rust在这些构造中提供的一些独特功能和优化。
|
6月前
|
Rust
Rust 基础入门 —— 语句与表达式
语句与表达式 这一节,我们接触的是rust中的有一个基本类型 我将其称之为 —— 逻辑结构,这个是我自己命名的,但我觉得很贴切。
36 3
06-Groovy-循环语句及关键字
06-Groovy-循环语句及关键字
|
12月前
|
存储 编译器 程序员
2.C 语言基本语法
2.C 语言基本语法
89 0