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

复制代码
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博客

相关推荐
y1su4 分钟前
Leetcode 动态规划 模板
java·数据结构·算法·leetcode·动态规划
Wang's Blog19 分钟前
Java 项目实战: 交友项目 - JWT 概述:为什么要用 Token 换掉 Session
java·ui·交友
SL_staff1 小时前
低代码选型避坑指南:为什么‘能拖拽’不等于‘能交付’?——基于JVS八大引擎的四维交付能力评估框架
java·低代码·spring cloud
李福春1 小时前
技术思考问题6:技术演讲该晒成功架构,还是交代失败与取舍?
java·开发语言·架构·computer use·深圳同盟·腾讯云架构师技术同盟·反演思维
用户7771298509122 小时前
equals和==的区别
java
旋律4142 小时前
对封装、继承、多态三个概念理解
java
code2cat2 小时前
【随笔】LLM裁判如何打分:先写评分标准,再用人工案例校准
java·人工智能·llm·agent·评估·langsmith
SL_staff2 小时前
计息规则不再等IT:JVS-Rules函数计算器在金融计息场景的技术实践
java·git·全栈