<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; } }
Hao语言--描述文法的XML和加载的类
最新推荐文章于 2024-08-11 20:00:32 发布