nput.txt是输入的测试文件。
produce.txt是输入的LR1产生式,能力不大,能if,while,赋值,加,乘,不能处理任何嵌套,没有数组,(这个你可以自己加文法进去进行处理)
Grammar.txt是某个博客上的文法,看着很靠谱,但是我没有再做测试的心思了。。。
这个程序没啥bug,但是文法如果有左递归,那肯定是会出现stack overflow的(书上算法就是这么设计的)
另外LR文法不能有二义性,你得在文法里面把算术优先级给解决了。
另外如果加入嵌套,那必然复杂度指数上升,得跑很久。。。。十分钟似乎都不算多。。
运行指南:
gui.JtableParse3.java 显示LR1分析表,同时对input里面的文件进行分析。输出词法分析结果到output.txt
输出规约过程,很小一段语句可能就会很长的规约过程。
letex.LexResult.java 显示词法分析结果。输出全部识别出来的单词。
LR1识别实现完全在Parse3包里,自己看名字去读代码。
几乎每一个主要的类我都写了main()方法,可以自己输入一些产生式去试下,
比如书上给的:
S' -> S
S -> C C
C -> c C|d
得到的集合和LR1的结果和书上完全一致
和一些网址上的
S' -> S
S -> L = R
S -> R
L -> * R
L -> id
R -> L
你可以通过跑ItemTable.java 得到全部的集合和goto集合,
通过跑gotoTable.java 得到goto表
通过跑ActionTable.java 得到action表(cmd形式)
通过跑parse.java 得到两张表的合集和规约过程。
gui.JtableParse3.java 把上面的两张表合在一起图形化了。
我鼓励你发现我的bug *0*虽然我仔细检察过并没有bug
但你可以发布修复bug的最新版本。注意标明原转载网址奥。
更加详细的思路和其他的说明,见下面的网址:
https://blog.csdn.net/qinglingLS
和:
https://blog.csdn.net/qinglingLS/article/details/89814398
【HIT哈工大编译原理实验】词法分析程序java
【编译原理】求first集合的代码实现java
【编译原理】求GOTO图的代码实现java
【编译原理】LL(1)分析法代码
其他的更新版本可以自己去博客里找一下噢。
写于2019/5/8
1