一个简单的java递归下降语法分析器例子

news2024/12/26 23:16:24
import parser.Parser;
import parser.RecursiveDescentParser;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 关键词
        List<String> keyList = new ArrayList<>(Arrays.asList("int","String"));
        // 关键词数
        List<Integer> keyNum = new ArrayList<>(Arrays.asList(1,2));
        // 运算符和界符
        List<String> symbolList = new ArrayList<>(Arrays.asList("+","-"));
        // 运算符和界符的数
        List<Integer> symbolNum = new ArrayList<>(Arrays.asList(10,11));

        // 从文件取出的字符
        String letter;
        // 将字符转为单词
        String words;

        String test ="int main() { int i,j; String a,b;} 123 ccd";

//        Parser parser = new Parser();
//        parser.analysis(test,keyList);

        // 测试语法分析,递归下降分析
        String input = "5+10*2";
        RecursiveDescentParser recursiveDescentParser = new RecursiveDescentParser(input);
        int rs = recursiveDescentParser.parseExpression();
        System.out.println("Result: " + rs);
    }
}

package parser;

/**
 * 递归下降解析
 * 文法规则:
 * expression = term + expression|term
 * term = = factor * term|factor
 * factor = (expression)|number
 * number = [0-9]+
 *
 */
public class RecursiveDescentParser {
    private String input;
    private int position;
    public RecursiveDescentParser(String input){
        this.input = input;
        this.position = 0;
    }

    public int parseExpression(){
        int term = parseTerm();
        if (position < input.length() && Character.toString(input.charAt(position)).equals("+")) {
            position++;
            int expression =parseExpression();
            return term+expression;
        }
        return term;
    }

    public int parseTerm(){
        int factor = parsefactor();
        if (position < input.length() && Character.toString(input.charAt(position)).equals("*")) {
            position++;
            int term =parseTerm();
            return factor*term;
        }
        return factor;
    }

    public int parsefactor(){
        if (position < input.length() && Character.toString(input.charAt(position)).equals("(")){
            position++;
            int expression =parseExpression();
            if (position < input.length() && Character.toString(input.charAt(position)).equals(")")){
                position++;
                return expression;
            }
        }else{
            StringBuilder number = new StringBuilder();
            while (position < input.length() && Character.isDigit(input.charAt(position))){
                number.append(input.charAt(position));
                position++;

                System.out.println("number: " + number);
            }
            return Integer.parseInt(number.toString());
        }

        throw new RuntimeException("错误输入");
    }
}

测试结果

如果看不懂,可以先学习一下上下文无关文法、产生式、终结符、非终结符的概念。

上下文无关文法、产生式、终结符、非终结符-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1619465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSH Key生成

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

G2024-04-24 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目3PowerShell项目1C++项目1非开发语言项目1LLaMA模型的C/C++移植 创建周期:306 天开发语言:C, C++协议类型:MIT Li…

详解数据结构:队列(含栈与队列扩展)

一、顺序队列 有一种线性序列&#xff0c;特点是先进先出&#xff0c;这种存储结构称为队列。队列也是一种线性表&#xff0c;只不过它是操作受限的线性表&#xff0c;只能再两端操作&#xff1a;一端进、一端出。进的一端称为队尾&#xff0c;出的一端称为队头。队列可以用顺…

西电超算使用方法-简易版

一、引言 西电超算不错&#xff0c;我很喜欢。本文仅供自己学习使用。 二、环境搭建 搭建环境需要有一些依赖库&#xff0c;但是其实西电超算说明手册并没有写的非常清楚。因此&#xff0c;这次实战演示一下&#xff0c;写一个运行sh文件脚本并提交作业。 1、选择GPU还是CP…

[计算机效率] 网站推荐:文字转语音

4.7 文字转语音 文字转语音的作用主要体现在以下几个方面&#xff1a; 便捷性&#xff1a;文字转语音功能为视觉障碍者提供了极大的便利。通过语音输出&#xff0c;他们可以更轻松地获取和理解信息&#xff0c;从而在日常生活中更加独立自主。 节省时间&#xff1a;对于那些需…

沐风老师3dMax万有引力插件ToGround使用方法详解

3dMax万有引力插件ToGround使用教程 3dMax万有引力插件ToGround&#xff0c;用于在复杂地形&#xff08;曲面&#xff09;上将对象放置在适当高度的实用工具。例如&#xff1a;将大量的人、植物和汽车快速放置在一个街道、公园和小跑道高度不同的区域尤其有用。 【适用版本】 …

工信部政策要求试点城市20%资金奖励中小企业用SaaS上云转型数字化

随着数字经济的不断发展&#xff0c;中小企业也迎来了前所未有的机遇和挑战。为了持续推动中小企业数字化转型&#xff0c;工信部出台了一项新政策&#xff0c;主要通过资金奖励的方式&#xff0c;鼓励中小企业采纳软件即服务&#xff08;SaaS&#xff09;模式&#xff0c;实现…

Redis入门到通关之Redis数据结构-List篇

文章目录 ☃️概述☃️数据结构☃️源码☃️其他 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端…

GAN的loss为nan的解决办法(成功)

跑了好几个GAN模型&#xff0c;一运行loss就巨大&#xff0c;几次epoch后就变NaN&#xff0c;或者直接就爆掉 有人说loss为nan是因为里面有log出问题了&#xff0c;但我想着文章里给的代码肯定得是能跑的啊 后来换了个电脑&#xff0c;重新把cyclegan的源码跑了一下&#xff…

[SWPUCTF 2022 新生赛]ez_ez_unserialize

要绕过wakeup函数&#xff0c;只要序列化的中的成员数大于实际成员数&#xff0c;即可绕过。 <?php class X {public $x fllllllag.php; }$anew X(); echo serialize($a); O:1:“X”:1:{s:1:“x”;s:13:“fllllllag.php”;} 修改为 O:1:“X”:3:{s:1:“x”;s:13:“flllll…

面向多源异质遥感影像地物分类的自监督预训练方法

源自&#xff1a;测绘学报 作者&#xff1a;薛志祥, 余旭初, 刘景正, 杨国鹏, 刘冰, 余岸竹, 周嘉男, 金上鸿 摘 要 近年来,深度学习改变了遥感图像处理的方法。由于标注高质量样本费时费力,标签样本数量不足的现实问题会严重影响深层神经网络模型的性能。为解决这一突出矛盾…

matlab绘图之在曲线上加竖直线

matlab绘图之在曲线上加竖直线 clear clc close all x0:1:20; yxlsread(compare.xlsx,A1:A18); plot(y,b) grid on; hhaxis; hold on; plot([10,10],[hh(3),hh(4)],r--) plot([8,8],[hh(3),hh(4)],k--) plot([2,2],[hh(3),hh(4)],k--) xlabel(它是x轴) ylabel(它是y轴) text(4,…

其他代码题

1.阶乘累加 2.回文数 3.字典查询 4.“结构体”的应用 5.链表

ROM修改进阶教程------小米HyperOS系统 简单修改设置logo界面大小 等详细操作步骤解析

小米 HyperOS系统是目前小米推出的一款全新的操作系统.官方宣称采用了微内核设计和动态内存技术,具有高效能和稳定性。Hyperos的设计风格简约、现代化,注重用户体验的流畅性和直观性。Hyperos以其简约的设计风格和出色的性能表现赢得了用户的青睐。但他目前的设置版本里面其l…

YOLOv8常见水果识别检测系统(yolov8模型,从图像、视频和摄像头三种路径识别检测)

1.效果视频&#xff08;常见水果识别&#xff08;yolov8模型&#xff0c;从图像、视频和摄像头三种路径识别检测&#xff09;_哔哩哔哩_bilibili&#xff09; 资源包含可视化的水果识别检测系统&#xff0c;可识别图片和视频当中出现的六类常见的水果&#xff0c;包括&#xf…

用Python写一个去文档水印的算法

处理效果对比&#xff1a; #图片处理 def imgDeal(img_path,save_path):img Image.open(img_path)img levelsDeal(img,108,164)img_res Image.fromarray(img.astype(uint8))print(u图片[ img_path u]处理完毕)img_res.save(save_path)#图像矩阵处理 def levelsDeal(img,…

平台流量思维与私域电商思维的区别及特点

随着互联网的发展&#xff0c;电商平台已经成为了人们购物的主要渠道之一。然而&#xff0c;随着竞争的加剧&#xff0c;电商平台的流量获取成本也在不断提高。在这种情况下&#xff0c;私域电商思维应运而生&#xff0c;成为了一种新的商业模式。那么&#xff0c;对比另一种主…

深入了解O2OA的开发平台如何支撑涉密应用系统技术要求

涉密应用系统O2OA的开发平台是一个功能强大且高度安全的开发环境&#xff0c;旨在为涉密信息的处理、存储和传输提供坚实的技术支撑。该平台具备以下显著特点&#xff1a; 首先&#xff0c;安全性是涉密应用系统O2OA开发平台的核心优势。平台严格遵守国家关于涉密信息系统的安…

《从“为什么”开始》乔布斯让Apple红遍世界的黄金圈法则 - 三余书屋 3ysw.net

从“为什么”开始&#xff1a;乔布斯让Apple红遍世界的黄金圈法则 大家好&#xff0c;今天我们要解读的书名叫《从“为什么”开始&#xff1a;乔布斯让Apple红遍世界的黄金圈法则》。这本书向我们揭示了为什么有些领导者如此成功&#xff0c;以及是什么让他们拥有别人没有的影…

『 论文解读 』大语言模型(LLM)代理能够自主地利用1 day漏洞,利用成功率竟高达87%,单次利用成本仅8.8美元

1. 概览 该论文主要展示了大语言模型LLM代理能够自主利用现实世界的 1 day 漏洞。研究我发现&#xff0c; GPT-4 在提供了CVE描述的情况下&#xff0c;能够成功利用 87% 的漏洞。 这与其他测试模型&#xff08;如 GPT-3.5 和其他开源 LLM &#xff09;以及开源漏洞扫描器&…