编译原理语法分析编译原理语法分析编译原理语法分析编译原理语法分析编译原理语法分析
源代码在线查看: test_2.java
package test_2;
import java.io.IOException;
class test_2
{
//String s;
char []prog=new char[80];
StringBuffer token=new StringBuffer();//token缓冲区暂存读入的字符
char ch;
static int syn,p=0,sum=0,kk=0;
String []rwtab={"begin","if","then","while","do","end"};
void input()
{
System.out.println("输入源程序字符串,送到缓冲区:");
try
{
int n=0;
do
{
prog[n]=(char)System.in.read();
ch=prog[n];
n++;
}while(ch!='#');
}catch(IOException e){e.printStackTrace();}
}
public static void main(String[] args)
{
test_2 job=new test_2();
job.input();
job.anaylse();
job.lrparser();
}
void lrparser()
{
if(syn==1)
{
this.anaylse();
this.yucu();
if(syn==6)
{
this.anaylse();
if(syn==0&&kk==0)
{
System.out.println("Success!");
}
}
else
{
if(kk!=1)
System.out.println("The error of losting end");
kk=1;
}
}
else
{
System.out.println("The error of losting begin");
kk=1;
}
}
void yucu()
{
this.statement();
while(syn==26)
{
this.anaylse();
this.statement();
}
}
void statement()
{
if(syn==10)
{
this.anaylse();
if(syn==18)
{
this.anaylse();
this.expression();
}
else
{
System.out.println("赋值号错误");
kk=1;
}
}
else
{
System.out.println("语句错误");
kk=1;
}
}
void expression()
{
this.term();
while(syn==13||syn==14)
{
this.anaylse();
this.term();
}
}
void term()
{
this.factor();
while(syn==15||syn==16)
{
this.anaylse();
this.factor();
}
}
void factor()
{
if(syn==10||syn==11)
this.anaylse();
else if(syn==27)
{
this.anaylse();
this.expression();
if(syn==28)
this.anaylse();
else
{
System.out.println("')'错误");
kk=1;
}
}
else
{
System.out.println("表达式错误!");
kk=1;
}
}
void anaylse()
{
token.delete(0,token.length()); //清空token缓冲区
ch=prog[p]; //读入一个字符
while(ch==' '||ch=='\r'||ch=='\t'||ch=='\n')
ch=prog[++p];
if(Character.isLetter(ch))
{
while(Character.isLetterOrDigit(ch))
{
token.append(ch);
ch=prog[++p];
}
p--;
syn=10;
for(int n=0;n {
if((token.toString()).equals(rwtab[n])==true)//缓冲区内容与关键字数组比较
switch(n)
{
case 0:syn=1;break;
case 1:syn=2;break;
case 2:syn=3;break;
case 3:syn=4;break;
case 4:syn=5;break;
case 5:syn=6;break;
}
}
}
else
if(Character.isDigit(ch))
{
while(Character.isDigit(ch))
{
sum=sum*10+ch-'0';
ch=prog[++p];
}
p--; //缓冲区指针回退一个字符
syn=11;
}
else
switch(ch)
{
case ' token.append(ch);
ch=prog[++p];
if(ch=='>')
{
syn=21;
token.append(ch);
}
else if(ch=='=')
{
syn=22;
token.append(ch);
}
else
{syn=20;
}
break;
case '>':
token.append(ch);
ch=prog[++p];
if(ch=='=')
{
syn=24;
token.append(ch);
}
else
{
p--;
syn=23;
}
break;
case ':':
token.append(ch);
ch=prog[++p];
if(ch=='=')
{
syn=18;
token.append(ch);
}
else
{
syn=17;
}
break;
case '+':syn=13;token.append(ch);break;
case '-':syn=14;token.append(ch);break;
case '*':syn=15;token.append(ch);break;
case '/':syn=16;token.append(ch);break;
case '=':syn=25;token.append(ch);break;
case ';':syn=26;token.append(ch);break;
case '(':syn=27;token.append(ch);break;
case ')':syn=28;token.append(ch);break;
case '#':syn=0;token.append(ch);break;
default :syn=-1;
}
++p;//指针指向缓冲区下一个字符
}
}
|
相关资源 |
|
-
是编译原理实验实验一 手工生成PL/0语言词法分析器 1
实验二 用算符优先分析法进行表达式分析 5
-
实验目的
通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法.
实验要求
采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成
-
功率谱估计matlab防真程序 从介绍功率谱的估计原理入手,分析了经典谱估计和现代谱估计两类估计方法的原理、各自特点及在Matlab中的实现方法率谱估计 周期图法 AR参数法
-
oracad的应用
1 原理图设计
要求原理图中有两个以上芯片或五个以上三极管
2 PCB设计
3 Pspice分析:
完成交流小信号分析和瞬态分析
-
这是马潮老师最新力做<<AVR单片机潜入式系统原理与应用实践>>中有关秒校时C程序,用CVAVR编译,对想熟悉和学习AVR单片机的朋友一定有用.注释详细,一看就懂.
-
这是马潮老师最新力做<<AVR单片机潜入式系统原理与应用实践>>中有关USART通信的C程序,用CVAVR编译,对想熟悉和学习AVR单片机的朋友一定有用.注释详细,一看就懂.
-
从介绍功率谱的估计原理入手分析了经典谱估计和现代谱估计两类估计方法的原理、各自特点及在Matlab中的实现方法。
-
MATLAB小波分析与应用实例(第二版).应用于信号处理和图像处理的原理和基本方法
|