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("错误输入"); } }
测试结果
如果看不懂,可以先学习一下上下文无关文法、产生式、终结符、非终结符的概念。