syntaxchecker.java

来自「java 词法分析器,用于一般的C,C++,VB,PS/SQL 语句的翻译」· Java 代码 · 共 140 行

JAVA
140
字号
package fri.patterns.interpreter.parsergenerator.util;import java.io.File;import java.util.*;import fri.patterns.interpreter.parsergenerator.Token;import fri.patterns.interpreter.parsergenerator.syntax.*;import fri.patterns.interpreter.parsergenerator.syntax.builder.*;/**	SyntaxChecker checks a EBNF syntax (file) for following things:	<ul>		<li>unresolved nonterminals (nonterminals without rule)</li>		<li>singular rules (nonterminal can be substituted by its singular right symbol)</li>		<li>isolated rules (redundant, can be removed)</li>		<li>None or more than one toplevel rule</li>	</ul>	<pre>	SYNTAX: java fri.patterns.interpreter.parsergenerator.util.SyntaxChecker file.syntax [file.syntax ...]	</pre>	@author (c) 2000, Fritz Ritzberger*/public class SyntaxChecker{	private boolean diagnosis = true;		public SyntaxChecker(Object syntaxFile)		throws Exception	{		this(new SyntaxBuilder(syntaxFile).getSyntax());	}	public SyntaxChecker(Syntax syntax)	{		if (syntax.size() <= 0)	{			System.out.println("ERROR: Found no rules in syntax!");			diagnosis = false;			return;		}				System.out.println("Number of rules (after resolving parenthesis, alternations and wildcards): "+syntax.size());				// Find start rule(s)		List topLevelRules = syntax.findStartRules();		if (topLevelRules.size() > 1)	{			System.out.println("WARNING: More than one toplevel rules:");			for (int i = 0; i < topLevelRules.size(); i++)				System.out.println("	"+topLevelRules.get(i));		}		else		if (topLevelRules.size() < 1)	{			System.out.println("WARNING: Found no toplevel rule, first rule (default START rule) is: "+syntax.getRule(0));		}		else	{			System.out.println("Start rule is \""+topLevelRules.get(0)+"\"");		}				// check for unresolved nonterminals		Set unresolved = syntax.getUnresolvedNonterminals();		if (unresolved.size() > 0)	{			System.out.println("Found "+unresolved.size()+" unresolved nonterminals:");			diagnosis = false;			for (Iterator it = unresolved.iterator(); it.hasNext(); )				System.out.println("	"+it.next());		}		else	{			System.out.println("Found no unresolved nonterminals.");		}				// check for isolated rules		for (int i = syntax.size() - 1; i >= 0; i--)	{			Rule rule = syntax.getRule(i);						boolean found = topLevelRules.contains(rule) ||					rule.getNonterminal().equals(Token.TOKEN) ||					rule.getNonterminal().equals(Token.IGNORED);			for (int j = 0; found == false && j < syntax.size(); j++)	{				if (j != i)	{					Rule rule2 = syntax.getRule(j);					for (int k = 0; found == false && k < rule2.rightSize(); k++)						if (rule2.getRightSymbol(k).equals(rule.getNonterminal()))							found = true;				}			}						if (found == false)				System.out.println("WARNING: Found isolated (unused, redundant) rule: "+rule);		}		// check for singular rules		int singulars = 0;		for (int i = syntax.size() - 1; i >= 0; i--)	{			Rule rule = syntax.getRule(i);			boolean singular = (rule.rightSize() == 1 && topLevelRules.contains(rule) == false);	// has only one symbol on right side			// check if defined only once on any left side			for (int j = 0; singular && j < syntax.size(); j++)				if (j != i && syntax.getRule(j).getNonterminal().equals(rule.getNonterminal()))					singular = false;	// nonterm has been found once more on left side						if (singular)	{				System.out.println("INFO: Found singular rule (nonterminal could be substituted by its right symbol): "+rule);				singulars++;			}		}		System.out.println("Found "+singulars+" singular rules.");	}	/** Returns false when the checked syntax is not able to be used as lexer or parser configuration. */	public boolean getDiagnosis()	{		return diagnosis;	}	public static void main(String [] args)	{		if (args.length <= 0)	{			System.err.println("SYNTAX: java "+SyntaxChecker.class.getName()+" file.syntax [file.syntax ...]");			System.err.println("	Prints out a diagnosis of passed syntax file(s).");			System.exit(2);		}				boolean ok = true;		for (int i = 0; i < args.length; i++)	{			try	{				SyntaxChecker checker = new SyntaxChecker(new File(args[i]));				ok = ok && checker.getDiagnosis();			}			catch (Exception e)	{				ok = false;				e.printStackTrace();			}		}				System.exit(ok ? 0 : 1);	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?