java有界面语法分析器_自顶向下语法分析器 (java实现)

本文介绍了一个使用Java编写的自顶向下(递归下降)语法分析器的关键代码,该分析器遵循特定的语法规则,包括BEGIN、sentences、stmt等结构,并处理ID、NUM和表达式的解析。代码中包含了错误处理机制,当遇到不匹配的Token时会输出错误信息。
摘要由CSDN通过智能技术生成

这里只给出语法分析器的关键代码

/**

* 自顶向下(递归下降方法)的语法分析器

* AUTHOR:方剑冰

* DATE:2009.12.7

*

* 语法规则:

* stmt → BEGIN sentences end #

* sentences → sent ; sentences

* | ε

* sent → evaluate

* evalute → ID := expr

* expr → item + item

* | item - item

* | item

* item → gene * gene

* | gene / gene

* | gene

* gene → ID

* | NUM

* | ( expr )

*/

package parser;

import lexer.Token;

import lexer.Tag;

import lexer.main;

public class Parser {

private static Token lookahead;//记录向前看的第一个Token

private static int index;//标识现在所取的Token编号

private static int num;//code中总共的Token数目

public Parser(){

index = 0;

num = main.tokens.size();

if(index < num)

lookahead = (Token)main.tokens.get(index++);

else

return;

}

public boolean stmt(){

return(

match(Tag.BEGIN)

&& sentences()

&& match(Tag.END)

&& match(Tag.FINAL)

);

}

public boolean sentences(){

if(lookahead.tag == Tag.END){

return true;

}else{

return(

sent()

&& match(Tag.SEMICOLON)

&& sentences()

);

}

}

public boolean sent(){

return(

match(Tag.ID)

&& match(Tag.EVALUEATE)

&& expr()

);

}

public boolean expr(){

if(item()){

if(lookahead.tag == Tag.PLUS){

return(

match(Tag.PLUS)

&& item()

);

}else if(lookahead.tag == Tag.SUB){

return(

match(Tag.SUB)

&& item()

);

}else{

return true;

}

}else{

System.out.println("ERROR:/""+lookahead.content+"/"(in line:"+lookahead.pos+")");

return false;

}

}

public boolean item(){

if(gene()){

if(lookahead.tag == Tag.MULT){

return(

match(Tag.MULT)

&& gene()

);

}else if(lookahead.tag == Tag.DIVI){

return(

match(Tag.DIVI)

&& gene()

);

}else{

return true;

}

}else{

System.out.println("ERROR:/""+lookahead.content+"/"(in line:"+lookahead.pos+")");

return false;

}

}

public boolean gene(){

if(lookahead.tag == Tag.ID){

return match(Tag.ID);

}else if(lookahead.tag == Tag.NUM){

return match(Tag.NUM);

}else if(lookahead.tag == Tag.LEFTP){

return (

match(Tag.LEFTP)

&& expr()

&& match(Tag.RIGHTP)

);

}else{

System.out.println("ERROR:/""+lookahead.content+"/"(in line:"+lookahead.pos+")");

return false;

}

}

public boolean match(int tag){

if(lookahead.tag == tag){

if(index < num)

lookahead = (Token)main.tokens.get(index++);

return true;

}else{

System.out.println("ERROR:/""+lookahead.content+"/"(in line:"+lookahead.pos+")");

return false;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值