1、读入一个单词后对照一开始的五类分析出是哪一类,符合后交给语法分析器处理。实现过程:import java.io.*;import java.util.ArrayList;/* * Created by 温 睿诚 on 2016/5/11/0011. */public class CiFa String keyword = /记录结果的符号表/用什么数据结构呢?/当前单词StringBuilder str = new StringBuilder();/下一个要读的字符char now;/一个栈Characterstack = new ArrayList0) return (Character)
2、stack.remove(stack.size() - 1).charValue(); else return 0; /错误信息String errorMsg;Reader reader = null; public static void main(String args) CiFa cifa = new CiFa();cifa.fenXi(args0);private void fenXi(String filename) /读取文件File file = new File(filename); try reader = new InputStreamReader(new FileInpu
3、tStream(file); catch (FileNotFoundException e) System.out.println(读取文件字符失败!e.printStackTrace();/不断读取字符直到结束getChar(); int result;/使用预测分析法YuFa yuFa = new YuCeFenXi(); boolean flag = true; while (!(now = 65535) /根据返回数值查找或插入,错误则打印并提示。正确则记录到mapresult = read(); if (result != 6) + result + , + str + if (!y
4、uFa.fenxi(result, str.toString() flag = false;System.err.println(语法分析出错!出错单词: + str.toString(); else System.err.println(+ errorMsg + str.delete(0, str.length();/结束boolean tempResult = false; if (yuFa != null) tempResult = yuFa.fenxi(6, # if (tempResult & flag)语法分析通过!/判断是否为数字private boolean isDigit()
5、 if (0 = now &now = 9)return true; else return false;/判断是否为字母private boolean isLetter() if (az) | (AZ)/赋值下一字符给now,返回true表示读到空格、换行等空白字符private boolean getChar() boolean flag = false;now = (char) reader.read(); while (now = 0 | now = t | now = rn | now = 32) flag = true; catch (IOException e) e.printS
6、tackTrace();return flag;/连接字符到单词private void concat() str.append(now);private boolean isSpilt() String temp = String.valueOf(now); for (String str : spilt) if (str.startsWith(temp) return false;private boolean inAL(String str, ArrayList strings) if (strings.contains(str)private boolean inShuzu(Strin
7、g str, String strings) for (String str1 :if (str.equals(str1) private boolean isYun() yunsuan) /词法分析器private int read() if (isLetter() /字母开始的,要么关键字,要么标识符,其用空格、tab、回车之类的分隔,/ 而标识符还可以用分割符号、运算符号分割。暂不判断标识符是否定义concat(); boolean flag;flag = getChar(); while (isDigit() | isLetter() & flag = false) concat();
8、if (inShuzu(str.toString(), keyword) return 1;if (!inAL(toString(), biaoshi) biaoshi.add(str.toString();return 2; else if (isDigit() /数字开头的,是常数,以空格、tab等以及分隔符、运算符分割 while (isDigit() return 3; else if (isSpilt() /分隔符,当出现、(时入栈,接收到、)时判断是否符合。单个字符,不需要分隔if (now = () put(); else if (now = char temp = pop();
9、 if (temp !errorMsg = 没有与匹配 return 6; else if (now = ) return 5; else if (isYun() /运算符,一般为单个符号,例外如下 if (now = getChar();=return 4;/ERROR无法识别+ now + 结果:对于文件:输出:等第二部分 语法分析(任选其中一个做实验)实验二 预测分析法设计与实现实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现。首先写出文法,然后作出预测分析表,再根据算法查表判断是否符合改文法。这是自己写的文法。模仿C+文法,但有不少局限性。
10、import java.util.Stack; * Created by 温 睿诚 on 2016/6/1/0001. * 预测分析法*/public class YuCeFenXi implements YuFa Stackstack;String t = String o = String k = String c = private static String map = new String1514;/横排 S A B C N D E F G H I J K L /对应 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /竖排 t b z ( o ) , ; = k #
11、 /对应 1 2 3 4 5 6 7 8 9 10 11 12 13YuCeFenXi() /null即出错,空字符串即空字map11 = tb(A)NSmap113 = map21 = Bmap26 = map31 = tbCmap46 = map47 = ,tbCmap51 = tbD;Nmap52 = bI;map510 = k(E)NNmap512 = map67 = ,bDmap68 = map72 = bJmap73 = Fmap83 = zGmap95 = oHcHmap96 = map102 = bmap103 = zmap114 = (A)map119 = =Kmap124
12、= map125 = map126 = map132 = HLmap133 = map145 = oHLmap148 = stack = new Stack & temp L) | (temp = S) | temp = N/把非终结符转换为表中对应数字private int n2I(String str) char temp = str.charAt(0); switch (temp) case : case BCreturn 5; default:return temp - + 3;/把终结符转换为表中对应数字private int t2I(String str) tboreturn 6;
13、,return 7;return 8;return 9;kreturn 10;return 11;return 12;#return 13;return -1;private boolean inArray(String str, String array) for (String temp : array) if (str.equals(temp)public static boolean isNumeric(String str) for (int i = 0; i = 0; i-) stack.push(String.valueOf(chanshengshi.charAt(i);/这里写
14、语义分析return fenxi(type, str);对于输入文件:实验四 递归下降分析法设计与实现详细说明递归下降分析法程序的工作过程,并且详细说明你的程序的设计思路和实现。根据文法写几个函数即可。这是这次实验的文法(之前自己写的文法画出的LL(1)分析表实在太大了,画不下去就换了个实验做):/*文法ET+TTF*FFiF(E)实现:import java.util.Scanner; * Created by 温 睿诚 on 2016/6/12/0012.public class DiGuiDown ET+T Fi F(E)static Scanner scanner; static St
15、ring sym; static boolean flag = true;scanner = new Scanner(System.in);advance();E(); if (flag) 合法字符串非法字符串private static void advance() if (scanner.hasNext() sym = scanner.next();private static void E() T(); while (sym.equals() private static void T() F();private static void F() if (sym.equals(i if (sym.equals(/errorflag = false;此处应该输入 ) ,但输入了+ sym);此处应该输入 ( ,但输入了
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2