刀刀网
您的当前位置:首页编译原理语法分析 算术表达式

编译原理语法分析 算术表达式

来源:刀刀网


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;

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容