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博客