Giter Club home page Giter Club logo

basic-compiler-cbq's Introduction

basic-compiler-cbq

basic-compiler-cbq 是一个基于 Java 实现的简单计算器,采用 Pratt parsing 技术,支持加减乘除、乘方^、以及复杂运算等操作。该项目主要用于编译原理课程设计。

2024-03-20 18-02-23.png

项目结构

该项目的目录结构如下:

.
├── src
│   └── main
│       ├── java.jzxy.cbq
│       │     ├── ast	   			  # (Abstract Syntax Tree) 抽象语法树
│       │        ├── Expression.java 
│       │        ├── InfixExpression.java
│       │        │   ├── IntegerExpression.java
│       │        │   ├── Node.java
│       │        │   └── PrefixExpression.java
│       │     ├── evaluator							 	  # 计算 AST
│       │        │   └── Evaluator.java
│       │     ├── lexer 								  # 词法分析
│       │        │   └── Lexer.java
│       │        ├── Main.java
│       │     ├── object								  # Obj
│       │        │   ├── MInt.java
│       │        │   └── MObj.java
│       │     ├── parser								  # 解析器	
│       │     │      ├── InfixParseFn.java
│       │     │      ├── Parser.java
│       │     │      ├── Precedence.java
│       │     │      └── PrefixParseFn.java
│       │     └── token									  # token
│       │            ├── Token.java
│       │            └── TokenType.java 
│       └── resources
└── test												  # 测试
├── LexerTest.java 
└── TestLoggerExtension.java 

功能特点

  • 支持基本的算术运算,包括加减乘除。
  • 支持乘方运算 ^
  • 支持复杂表达式的解析和计算。
  • 使用 Pratt parsing 技术进行表达式解析。

Pratt parsing 是一种自顶向下的解析技术,通过将表达式分解成嵌套的操作符和操作数来工作。每个操作符都有相应的优先级,而 Pratt 解析器则利用这些优先级来决定表达式的结构。例如,乘法操作符的优先级高于加法,因此 Pratt 解析器会先解析乘法表达式,然后再处理加法。

如何使用

在这个计算器项目中,词法分析器(Lexer)首先将输入的数学表达式字符串分解为 token 序列。然后,解析器(Parser)使用这些 token,根据定义的优先级和解析函数,构建一个 AST。最后,计算器使用求值器(Evaluator)对这个 AST 进行计算,得出最终结果。

每个操作符都有对应的解析函数,分别用于处理中缀(InfixParseFn)和前缀(PrefixParseFn)表达式。这些解析函数负责识别和构造 AST 中的相应节点。

整个计算器的工作流程大致如下:

  1. 输入数学表达式。
  2. 词法分析器将输入转换为 token 序列。
  3. 解析器读取 token 序列,并根据操作符的优先级构建 AST。
  4. 求值器遍历 AST,并计算出结果。
public class Main {
    public static void main(String[] args) {
        String code = "3 + 5 * (10 - 4)";
        // 将 code 拆分为 token 并解析 tokens 并构建 AST
        Expression expression = new Parser(new Lexer(code)).parseMain();
        // 计算 AST
        System.out.println("code:  " + code + "\nresult: " + Evaluator.eval(expression));

        System.out.println("===========TokenList=============");
        // 输出 tokens
        List<Token> tokens = new Lexer(code).getTokenList();
        tokens.forEach(System.out::println);
        System.out.println("===========TokenList=============");

    }
}

image-20240321082338534

image-20240321082402569

环境要求

  • Java 8 或以上版本。

编译和运行

  1. 克隆项目到本地:
git clone https://github.com/caobaoqi1029/basic-compiler-cbq.git

贡献

如果您有任何改进意见或功能请求,请通过 issue 提交。

许可证

本项目采用 MIT 许可证

basic-compiler-cbq's People

Contributors

caobaoqi1029 avatar gitbutler-client avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.