• 一个简单的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 keyList = new ArrayList<>(Arrays.asList("int","String"));
            // 关键词数
            List keyNum = new ArrayList<>(Arrays.asList(1,2));
            // 运算符和界符
            List symbolList = new ArrayList<>(Arrays.asList("+","-"));
            // 运算符和界符的数
            List 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博客

  • 相关阅读:
    【Tomcat】解决Tomcat服务器乱码问题
    speedoffice(PPT)如何添加项目编号
    人工智能 | ShowMeAI资讯日报 #2022.06.23
    通过L-evy飞行进行布谷鸟搜索
    基于Transformer的时空融合网络地铁客流预测模型
    (Excel / WPS表格)常用公式、技巧
    LVS 负载均衡集群
    利用TreeMap来达成离散化的目的
    Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现根据每次触发信号移动感兴趣区域ROI(C#)
    spark内置数据类型
  • 原文地址:https://blog.csdn.net/boslm/article/details/138002053