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

本文展示了如何使用Java实现一个简单的递归下降解析器,处理表达式结构,基于上下文无关文法规则,如expression=term+expression|term。通过实例解析输入字符串5+10*2,展示了解析过程和关键方法的运用。
摘要由CSDN通过智能技术生成
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博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值