Hao语言--描述文法的XML和加载的类


<grammar><symbols><startsymbols><name>expression</name></startsymbols><notterminalsymbols><name>expression</name></notterminalsymbols><notterminalsymbols><name>item</name></notterminalsymbols><terminalsymbols><terminalsymbol> <name>+</name></terminalsymbol></terminalsymbols></symbols><productions><production><left>expression</left><right>expression+item</right></production></productions></grammar>

symbols是文法的符号,startsymbols是文法开始符号,notterminalsymbols是文法非终结符,terminalsymbols是文法的终结符,productions是产生式,只能是上下文无关文法,产生式连续的符号可用|隔开!。
 

以下是描述文法的类
package com.hao.grammaticalanalysis.recursivedescent;

import java.util.ArrayList;
import java.util.List;

public class Production {
	private String left;//文法的左部	
        private List<String> right=new ArrayList<String>();//文法的右部
	public String getLeft() {
		return left;
	}
	public void setLeft(String left) {
		this.left = left;
	}
	public List<String> getRight() {
		return right;
	}
	public void addSymbol(String symbol){
		right.add(symbol);
	}
	public void setRight(List<String> right) {
		this.right = right;
	}

}
以下是文法类,自动从由xml文件中读取文法信息
package com.hao.grammaticalanalysis.recursivedescent;


import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


import com.hao.haocompiler.morphology.Context;


public class Grammar {
	private List<Production> productionList=new ArrayList<Production>();//文法的产生式集合
	private String startSymbol="";//文法的开始符号
	private XMLUtill xmlUtill=new XMLUtill("grammar.xml");//描述文法的XML文件
	private Set<String> terminalSymbolsSet=new HashSet<String>();//文法的终结符集合
	private Set<String> notTerminalSymbolsSet=new HashSet<String>();//文法的非终结符集合

	public Grammar() {
		// TODO Auto-generated constructor stub
		initProductions();
		initStartSymbol();
		initNotTerminalSymbolsSet();
		initTerminalSymbolsSet();	
		System.out.println(notTerminalSymbolsSet.size());
		System.out.println(startSymbol);
	}
    public boolean isTerminalSymbol(String symbol){//判断是不是终结符
    	if(terminalSymbolsSet.contains(symbol)){
    		return true;
    	}
    	return false;
    }
    public boolean isNotTerminalSymbol(String symbol){//判断是不是非终结符

    	return notTerminalSymbolsSet.contains(symbol);
    }
    public List<Production> getProductionByLeft(String left){//找出文法左部一样的产生式
    	List<Production> list=new ArrayList<Production>();
    	for(Production production:productionList){
    		if(left.equals(production.getLeft())){
    			list.add(production);
    		}
    	}
    	return list;
    	
    }
	public Production getProductionByIndex(int index){//找出文法的序号为index的产生式
		try {
			return productionList.get(index);
		} catch (Exception e) {
			return null;
		}
	}

         //以下是加载,解析文法信息的方法
	private void initTerminalSymbolsSet() {
		NodeList nodeList=xmlUtill.selectNodes("/grammar/symbols/terminalsymbols");
		for(int nodeIndex=0;nodeIndex<nodeList.getLength();nodeIndex++){
			terminalSymbolsSet.add(nodeList.item(nodeIndex).getTextContent());			
		}
	}




	private void initNotTerminalSymbolsSet() {
		NodeList nodeList=xmlUtill.selectNodes("/grammar/symbols/notterminalsymbols");
		for(int nodeIndex=0;nodeIndex<nodeList.getLength();nodeIndex++){
			notTerminalSymbolsSet.add(nodeList.item(nodeIndex).getTextContent());			
		}
		notTerminalSymbolsSet.add(startSymbol);
	}
	private void initStartSymbol() {
		startSymbol=xmlUtill.selectSingleNode("/grammar/symbols/startsymbols").getTextContent();
	}


	private void initProductions() {
		NodeList nodeList=xmlUtill.selectNodes("/grammar/productions/production");
		for(int nodeIndex=0;nodeIndex<nodeList.getLength();nodeIndex++){
			productionList.add(initOneProduction(nodeList.item(nodeIndex)));
		}
	}


	private Production initOneProduction(Node node) {
		Production production=new Production();
		NodeList nodeList=node.getChildNodes();


		for(int nodeIndex=0;nodeIndex<nodeList.getLength();nodeIndex++){


			createOneProductionByNode(production, nodeList.item(nodeIndex));
		}
		return production;
	}


	private void createOneProductionByNode(Production production, Node node) {
		
		if("left".equals(node.getNodeName())){
			production.setLeft(node.getTextContent());					
		}else if("right".equals(node.getNodeName())){	
		
			Context context=new Context(node.getTextContent());
			while(context.nextWord()){
		        String word=context.getOneWord();
				if(!"|".equals(word)){
//					production.addSymbol(context.getOneWord());
				}
			
			}
						
		}
	}




	public String getStartSymbol() {
		return startSymbol;
	}




	public void setStartSymbol(String startSymbol) {
		this.startSymbol = startSymbol;
	}




	public Set<String> getTerminalSymbolsSet() {
		return terminalSymbolsSet;
	}




	public void setTerminalSymbolsSet(Set<String> terminalSymbolsSet) {
		this.terminalSymbolsSet = terminalSymbolsSet;
	}




	public Set<String> getNotTerminalSymbolsSet() {
		return notTerminalSymbolsSet;
	}




	public void setNotTerminalSymbolsSet(Set<String> notTerminalSymbolsSet) {
		this.notTerminalSymbolsSet = notTerminalSymbolsSet;
	}
	
	


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值