/Yous_Expression

四则运算表达式错误定位以及报错,中缀表达式转后缀表达式

Primary LanguageJava

# Yous_Expression
四则运算表达式错误定位以及把中缀表达式转成后缀,编译原理项目课程实验项目一

1、算术表达式的分析
实验采用了LL1文法对表达式的合法性进行分析,文法如下:

< E > ::= < T > <E'>

<E'> ::= + < T > <E'> | - < T > <E'> | ""

< T > ::= < F > <T'>

<T'> ::= * < F > <T'> | / < F > <T'> | ""

< F > ::= ( < E > ) | num

使用YousYacc.java中的YousYacc读取.\gramma\expression_grammar.bnf文件中的文法进行通过求First集,Follow集等步骤后构造文法的预测分析表,然后使用YousLLoneParser.java中的YousLLoneParser类对输入的算术表达式进行分析。
	如果没有发生错误,则接着对表达式进行中缀转后缀的操作,中缀转后缀使用的是InfixToSuffix.java中的InfixToSuffix类进行,然后输出后缀表达式。
如果在对表达式进行文法分析的过程中,分析到算数表达式中有错误,则对于错误的算术表达式进行错误位置,以及错误类型提示,采用了当发生错误时对分析栈的栈顶符号进行判断,如果是终结符号,则相应位置缺少次终结符,如果为非终结符则可以通过之前求出的First集合中求出该非终结符的First集,然后提示相应位置缺少该非终结符的First集中的非终结符。

2、随机算术表达式的产生
 (1)正确算术表达式的产生
在Expression_recursion.java的Expression_recursion类中,采用了以下的文法的形式结合随机在0~1之间的概率进行随机表达式的产生,
E->E+T | E-T | T;
T->T*F | T/F | F;
F->(E) | num;
其中num表示一个操作数(包括正负整数,正负小数),采用随机函数进行随机生成正负整数或者正负小数,递归产生的算数表达式最终以字符串的形式返回,最后写入到文件expression.txt中。
(2)错误算术表达式的产生
在Expression.java的Expression类中,采用随机产生操错运算符以及随机产生操作数的方法进行错误的算数表达式的产生,最后写入到文件expression_error.txt中。

3、程序整体
在整个程序中,最后在Demo.java文件的Demo类中进行调用。

实验结果
整个程序最后能通过提示,输入想要产生的正确的表达式和错误的表达式的数量,并对正确的表达式进行中缀转后缀,对错误的表达式的第一处出现错误的地方进行提示,指出错误位置以及错误原因。

展望
后续希望能进一步改进程序,使程序能更加准确的指出错误的算术表达式中的错误,并且实现出错恢复。

详细内容请看:design.pdf