package 语法分析;
public class displymain {
public static void main(String args[])
{
new frame();
}
}
package 语法分析;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class frame implements ActionListener{
JFrame frame1;
JLabel L1,L2;
JButton bt,bt2;
JTextField input,result;
top_down_grammar a =new top_down_grammar();
public frame()
{
frame1=new JFrame(\"\");
input=new JTextField(20);
result=new JTextField(20);
L1=new JLabel(\"请输入表达式以#结束\");
L2=new JLabel(\"结果是:\");
bt=new JButton(\"语法分析\");
bt2=new JButton(\"关闭\");
frame1.setTitle(\"递归下降子程序分析语法\");
frame1.setLayout(new GridLayout(3,1));
frame1.add(L1);
frame1.add(input);
frame1.add(L2);
frame1.add(result);
frame1.add(bt);
frame1.add(bt2);
bt.addActionListener(this);
bt2.addActionListener(this);
frame1.setSize(500, 500);
frame1.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
a.i=0;
a.x.str=input.getText();
if(e.getActionCommand()==\"语法分析\")
{
if(a.E_Production()) result.setText(\"符合语法要求\");
else result.setText(\"不符合语法要求\");
}
if(e.getActionCommand()==\"关闭\")
{
frame1.dispose();
}
}
}
package 语法分析;
public class Lex
{
String str=\"\";
int i;
//int j=0;
public char lex(int j)
{ i=j;
if(is_identifiers_key())
{
return '2';
}
if(is_digital())
return '1';
if(is_oper())
return str.charAt(i);
return '0';
}
public boolean is_identifiers_key()
{
boolean f=false;
//c2=str.charAt(i);
while((i=65&&str.charAt(i)<=90)||(str.charAt(i)>=97&&str.charAt(i)<=122)||(str.charAt(i)=='_')))){
i++;
f=true;
}
if(f)
i--;
return f;
}
public boolean is_digital()
{ boolean f=false;
if(i=48&&str.charAt(i)<=57){
while(((str.charAt(i)>=48&&str.charAt(i)<=57)||str.charAt(i)=='.'))
{
i++;
f=true;
}
//c=(str.charAt(i));
if(f)
i--;
return f;
}
return false;
}
public boolean is_oper()
{ // c2=str.charAt(i);
if(iif(str.charAt(i)=='('||str.charAt(i)==')'||str.charAt(i)=='+'||str.charAt(i)=='-'||str.charAt(i)=='*'||str.charAt(i)=='/'||str.charAt(i)=='#'){
return true;
}
return false;
}
}
package 语法分析;
public class top_down_grammar {
char ch;
int i=0;
Lex x=new Lex();
public boolean E_Production()
{
ch=x.lex(i);
if(ch=='+' ||ch=='-')
{ i=x.i;
i++;
ch=x.lex(i);
}
if(!T_Production()) return false;
if(!G_Production()) return false;
return true;
}
public boolean T_Production()
{
if( !F_Production()) return false;
if(!S_Production()) return false;
return true;
}
public boolean F_Production()
{
if(ch=='(')
{ i=x.i;
i++;
ch=x.lex(i);
if(E_Production())
return false;
if(ch==')')
{
i=x.i;
i++;
ch=x.lex(i);
return true;
}
else return false;
}
if(ch=='1'||ch=='2')
{
i=x.i;
i++;
ch=x.lex(i);
return true;
}
else return false;
}
public boolean G_Production()
{
if(ch=='+')
{
i=x.i;
i++;
ch=x.lex(i);
if(!T_Production()) return false;
if(!G_Production()) return false;
return true;
}
else if(ch=='-')
{
i=x.i;
i++;
ch=x.lex(i);
if(!T_Production()) return false;
if(G_Production()) return false;
return true;
}
else if(ch==')'||ch=='#')
{
return true;
}
return false;
}
public boolean S_Production()
{
if(ch=='*')
{
i=x.i;
i++;
ch=x.lex(i);
if(!F_Production()) return false;
if(!S_Production()) return false;
return true;
}
else if(ch=='/')
{
i=x.i;
i++;
ch=x.lex(i);
if(!F_Production()) return false;
if(!S_Production()) return false;
return true;
}
else if(ch=='+'||ch=='-'||ch=='#'||ch==')')
{ if(i{if(x.str.charAt(i+1)!='#')
return true;
else return false;
}
return true;
}
return false;
}
}