blob: 956221dd287ef46d70259de923b283629100874e [file] [log] [blame]
/*
* Conditions Of Use
*
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), an agency of the Federal Government.
* Pursuant to title 15 Untied States Code Section 105, works of NIST
* employees are not subject to copyright protection in the United States
* and are considered to be in the public domain. As a result, a formal
* license is not needed to use the software.
*
* This software is provided by NIST as a service and is expressly
* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY. NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* the software.
*
* Permission to use this software is contingent upon your acceptance
* of the terms of this agreement
*
* .
*
*/
package gov.nist.core;
import java.text.ParseException;
/** Generic parser class.
* All parsers inherit this class.
*
*@version 1.2
*
*@author M. Ranganathan <br/>
*
*
*
*/
public abstract class ParserCore {
public static final boolean debug = Debug.parserDebug;
static int nesting_level;
protected LexerCore lexer;
protected NameValue nameValue(char separator) throws ParseException {
if (debug) dbg_enter("nameValue");
try {
lexer.match(LexerCore.ID);
Token name = lexer.getNextToken();
// eat white space.
lexer.SPorHT();
try {
boolean quoted = false;
char la = lexer.lookAhead(0);
if (la == separator ) {
lexer.consume(1);
lexer.SPorHT();
String str = null;
boolean isFlag = false;
if (lexer.lookAhead(0) == '\"') {
str = lexer.quotedString();
quoted = true;
} else {
lexer.match(LexerCore.ID);
Token value = lexer.getNextToken();
str = value.tokenValue;
// JvB: flag parameters must be empty string!
if (str==null) {
str = "";
isFlag = true;
}
}
NameValue nv = new NameValue(name.tokenValue,str,isFlag);
if (quoted) nv.setQuotedValue();
return nv;
} else {
// JvB: flag parameters must be empty string!
return new NameValue(name.tokenValue,"",true);
}
} catch (ParseException ex) {
return new NameValue(name.tokenValue,null,false);
}
} finally {
if (debug) dbg_leave("nameValue");
}
}
protected void dbg_enter(String rule) {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < nesting_level ; i++)
stringBuffer.append(">");
if (debug) {
System.out.println(
stringBuffer + rule +
"\nlexer buffer = \n" +
lexer.getRest());
}
nesting_level++;
}
protected void dbg_leave(String rule) {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < nesting_level ; i++)
stringBuffer.append("<");
if (debug) {
System.out.println(
stringBuffer +
rule +
"\nlexer buffer = \n" +
lexer.getRest());
}
nesting_level --;
}
protected NameValue nameValue() throws ParseException {
return nameValue('=');
}
protected void peekLine(String rule) {
if (debug) {
Debug.println(rule +" " + lexer.peekLine());
}
}
}