
org.globus.rsl.RSLParser Maven / Gradle / Ivy
The newest version!
/* Generated By:JavaCC: Do not edit this line. RSLParser.java */
/*
* Copyright 1999-2006 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.globus.rsl;
import java.io.StringReader;
import java.util.LinkedList;
import java.util.ListIterator;
/**
* Parser for the
* Globus Resource Specification Language RSL v1.0.
*
* Things that are not supported:
* (1) User-specified delimiter for quoted literals.
* (2) RSLs that only contain relations outside of 'spec-list'.
* Other notes:
* (1) Implicit concatenation is not part of the 'simple value' relation
* and is implemented by inspecting the white space between individual
* values.
*/
public class RSLParser implements RSLParserConstants {
private Class nodeClass = RslNode.class;
public static void main(String argv[]) throws ParseException {
if ((argv.length != 0) && (argv.length != 1)) {
System.err.println("Usage: RSL [rsl string]");
System.exit(1);
}
RSLParser parser = null;
if (argv.length == 0) {
parser = new RSLParser(System.in);
} else {
parser = new RSLParser(new StringReader(argv[0]));
}
parser.parse();
}
public static RslNode parse(String rsl) throws ParseException {
return (RslNode)parse(RslNode.class, rsl);
}
public static AbstractRslNode parse(Class rslNodeClass, String rsl)
throws ParseException {
RSLParser parser = new RSLParser(new StringReader(rsl));
parser.setRslNodeClass(rslNodeClass);
return parser.parse();
}
public RSLParser(String rsl)
throws ParseException {
this(new StringReader(rsl));
}
public void setRslNodeClass(Class rslNodeClass) {
nodeClass = rslNodeClass;
}
private String unQuotify(String str, char quoteChar) {
char curChar;
char nextChar;
int size = str.length();
StringBuffer buf = new StringBuffer(size-2);
for (int i=1;i 0) {
valueList.add( concat(tokenList) );
tokenList.clear();
}
}
private String unQuotify(Token tok) {
switch(tok.kind) {
case DOUBLE_QUOTED_LITERAL:
return unQuotify(tok.image,'"');
case SINGLE_QUOTED_LITERAL:
return unQuotify(tok.image,'\'');
default:
return tok.image;
}
}
final public AbstractRslNode parse() throws ParseException {
AbstractRslNode tree;
tree = subSpecification();
jj_consume_token(0);
{if (true) return tree;}
throw new Error("Missing return statement in function");
}
final public void specification(AbstractRslNode parentNode) throws ParseException {
AbstractRslNode node;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case VARIABLES:
case VARIABLES_DQUOTE:
case VARIABLES_SQUOTE:
case UNQUOTED_LITERAL:
case DOUBLE_QUOTED_LITERAL:
case SINGLE_QUOTED_LITERAL:
relation(parentNode);
break;
case AND:
case OR:
case MULTI:
node = subSpecification();
parentNode.add(node);
break;
default:
jj_la1[0] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
final public AbstractRslNode subSpecification() throws ParseException {
AbstractRslNode node = null;
try {
node = (AbstractRslNode)nodeClass.newInstance();
} catch(Exception e) {
throw new ParseException("Failed to instantiate rsl node class: " + e.getMessage());
}
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case AND:
jj_consume_token(AND);
specList(node);
node.setOperator(RslNode.AND);
{if (true) return node;}
break;
case MULTI:
jj_consume_token(MULTI);
specList(node);
node.setOperator(RslNode.MULTI);
{if (true) return node;}
break;
case OR:
jj_consume_token(OR);
specList(node);
node.setOperator(RslNode.OR);
{if (true) return node;}
break;
default:
jj_la1[1] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
throw new Error("Missing return statement in function");
}
final public void relation(AbstractRslNode node) throws ParseException {
String attribute;
int op;
LinkedList values;
Token tok;
Bindings bd;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case VARIABLES:
tok = jj_consume_token(VARIABLES);
jj_consume_token(EQUAL);
values = bindingSequence();
bd = new Bindings(tok.image);
bd.setValues(values);
node.add(bd);
break;
case VARIABLES_DQUOTE:
tok = jj_consume_token(VARIABLES_DQUOTE);
jj_consume_token(EQUAL);
values = bindingSequence();
bd = new Bindings(unQuotify(tok.image,'"'));
bd.setValues(values);
node.add(bd);
break;
case VARIABLES_SQUOTE:
tok = jj_consume_token(VARIABLES_SQUOTE);
jj_consume_token(EQUAL);
values = bindingSequence();
bd = new Bindings(unQuotify(tok.image,'\''));
bd.setValues(values);
node.add(bd);
break;
case UNQUOTED_LITERAL:
case DOUBLE_QUOTED_LITERAL:
case SINGLE_QUOTED_LITERAL:
attribute = attribute();
op = op();
values = valueSequence();
NameOpValue nm = new NameOpValue(attribute, op);
nm.setValues(values);
node.add(nm);
break;
default:
jj_la1[2] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
final public void specList(AbstractRslNode node) throws ParseException {
label_1:
while (true) {
jj_consume_token(RPAREN);
specification(node);
jj_consume_token(LPAREN);
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case RPAREN:
;
break;
default:
jj_la1[3] = jj_gen;
break label_1;
}
}
}
final public int op() throws ParseException {
Token tok;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case EQUAL:
tok = jj_consume_token(EQUAL);
{if (true) return NameOpValue.EQ;}
break;
case NOT_EQUAL:
tok = jj_consume_token(NOT_EQUAL);
{if (true) return NameOpValue.NEQ;}
break;
case GREATER_THAN:
tok = jj_consume_token(GREATER_THAN);
{if (true) return NameOpValue.GT;}
break;
case GREATER_THAN_EQUAL:
tok = jj_consume_token(GREATER_THAN_EQUAL);
{if (true) return NameOpValue.GTEQ;}
break;
case LESS_THAN:
tok = jj_consume_token(LESS_THAN);
{if (true) return NameOpValue.LT;}
break;
case LESS_THAN_EQUAL:
tok = jj_consume_token(LESS_THAN_EQUAL);
{if (true) return NameOpValue.LTEQ;}
break;
default:
jj_la1[4] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
throw new Error("Missing return statement in function");
}
final public String attribute() throws ParseException {
String name;
name = stringLiteral();
{if (true) return name;}
throw new Error("Missing return statement in function");
}
final public LinkedList valueSequence() throws ParseException {
LinkedList list = new LinkedList();
LinkedList tokenList = new LinkedList();
label_2:
while (true) {
value(list, tokenList);
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case RPAREN:
case VARSTART:
case UNQUOTED_LITERAL:
case DOUBLE_QUOTED_LITERAL:
case SINGLE_QUOTED_LITERAL:
;
break;
default:
jj_la1[5] = jj_gen;
break label_2;
}
}
if (tokenList.size() > 0) {
list.add( concat(tokenList) );
}
{if (true) return list;}
throw new Error("Missing return statement in function");
}
final public LinkedList bindingSequence() throws ParseException {
LinkedList list = new LinkedList();
label_3:
while (true) {
binding(list);
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case RPAREN:
;
break;
default:
jj_la1[6] = jj_gen;
break label_3;
}
}
{if (true) return list;}
throw new Error("Missing return statement in function");
}
final public void binding(LinkedList list) throws ParseException {
Value value;
String name;
jj_consume_token(RPAREN);
name = stringLiteral();
value = concatSimpleValue();
jj_consume_token(LPAREN);
Binding db = new Binding(name, value);
list.add(db);
}
final public void value(LinkedList list, LinkedList tokenList) throws ParseException {
Object value = null;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case RPAREN:
jj_consume_token(RPAREN);
value = valueSequence();
jj_consume_token(LPAREN);
list.add(value);
break;
case VARSTART:
case UNQUOTED_LITERAL:
case DOUBLE_QUOTED_LITERAL:
case SINGLE_QUOTED_LITERAL:
value = SimpleValue(list, tokenList);
tokenList.add(value);
break;
default:
jj_la1[7] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
final public Value SimpleValue(LinkedList valueList, LinkedList tokenList) throws ParseException {
Token t1 = null;
Value v1 = null;
Value v2 = null;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case UNQUOTED_LITERAL:
case DOUBLE_QUOTED_LITERAL:
case SINGLE_QUOTED_LITERAL:
t1 = stringToken();
v2 = explicitConcat(valueList, tokenList);
updateValueList(t1, valueList, tokenList);
Value v = new Value( unQuotify(t1) );
if (v2 != null) {
v.concat(v2);
}
{if (true) return v;}
break;
case VARSTART:
v1 = variableReference(valueList, tokenList);
v2 = explicitConcat(valueList, tokenList);
if (v2 != null) {
v1.concat(v2);
}
{if (true) return v1;}
break;
default:
jj_la1[8] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
throw new Error("Missing return statement in function");
}
final public Value variableReference(LinkedList valueList, LinkedList tokenList) throws ParseException {
String name = null;
Value value = null;
Token t1;
t1 = jj_consume_token(VARSTART);
name = stringLiteral();
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case VARSTART:
case UNQUOTED_LITERAL:
case DOUBLE_QUOTED_LITERAL:
case SINGLE_QUOTED_LITERAL:
value = concatSimpleValue();
break;
default:
jj_la1[9] = jj_gen;
;
}
jj_consume_token(LPAREN);
updateValueList(t1, valueList, tokenList);
VarRef vr = new VarRef(name);
if (value != null) vr.setDefaultValue(value);
{if (true) return vr;}
throw new Error("Missing return statement in function");
}
final public Value explicitConcat(LinkedList valueList, LinkedList tokenList) throws ParseException {
Object v1 = null;
Value v2 = null;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case 27:
jj_consume_token(27);
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case UNQUOTED_LITERAL:
case DOUBLE_QUOTED_LITERAL:
case SINGLE_QUOTED_LITERAL:
v1 = stringLiteral();
break;
case VARSTART:
v1 = variableReference(valueList, tokenList);
break;
default:
jj_la1[10] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
v2 = explicitConcat(valueList, tokenList);
break;
default:
jj_la1[11] = jj_gen;
;
}
Value v = null;
if (v1 instanceof String) {
v = new Value( (String)v1);
} else if (v1 instanceof Value) {
v = (Value)v1;
}
if (v2 != null) {
v.concat(v2);
}
{if (true) return v;}
throw new Error("Missing return statement in function");
}
final public Token stringToken() throws ParseException {
Token tok;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case UNQUOTED_LITERAL:
tok = jj_consume_token(UNQUOTED_LITERAL);
{if (true) return tok;}
break;
case DOUBLE_QUOTED_LITERAL:
tok = jj_consume_token(DOUBLE_QUOTED_LITERAL);
{if (true) return tok;}
break;
case SINGLE_QUOTED_LITERAL:
tok = jj_consume_token(SINGLE_QUOTED_LITERAL);
{if (true) return tok;}
break;
default:
jj_la1[12] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
throw new Error("Missing return statement in function");
}
final public String stringLiteral() throws ParseException {
Token tok;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case UNQUOTED_LITERAL:
tok = jj_consume_token(UNQUOTED_LITERAL);
{if (true) return tok.image;}
break;
case DOUBLE_QUOTED_LITERAL:
tok = jj_consume_token(DOUBLE_QUOTED_LITERAL);
{if (true) return unQuotify(tok.image,'"');}
break;
case SINGLE_QUOTED_LITERAL:
tok = jj_consume_token(SINGLE_QUOTED_LITERAL);
{if (true) return unQuotify(tok.image,'\'');}
break;
default:
jj_la1[13] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
throw new Error("Missing return statement in function");
}
// -----------------------------------------------------
final public Value concatSimpleValue() throws ParseException {
LinkedList list = new LinkedList();
LinkedList tokenList = new LinkedList();
label_4:
while (true) {
concatSimpleValueSub(list, tokenList);
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case VARSTART:
case UNQUOTED_LITERAL:
case DOUBLE_QUOTED_LITERAL:
case SINGLE_QUOTED_LITERAL:
;
break;
default:
jj_la1[14] = jj_gen;
break label_4;
}
}
if (tokenList.size() > 0) {
list.add( concat(tokenList) );
}
if (list.size() == 1) {
{if (true) return (Value)list.getFirst();}
} else {
{if (true) throw new ParseException("Encountered sequence instead of a single value.");}
}
throw new Error("Missing return statement in function");
}
final public void concatSimpleValueSub(LinkedList list, LinkedList tokenList) throws ParseException {
Object value = null;
value = SimpleValue(list, tokenList);
tokenList.add(value);
}
public RSLParserTokenManager token_source;
ASCII_CharStream jj_input_stream;
public Token token, jj_nt;
private int jj_ntk;
private int jj_gen;
final private int[] jj_la1 = new int[15];
final private int[] jj_la1_0 = {0x71c7000,0x7000,0x71c0000,0x8000,0xfc0,0x7028000,0x8000,0x7028000,0x7020000,0x7020000,0x7020000,0x8000000,0x7000000,0x7000000,0x7020000,};
public RSLParser(java.io.InputStream stream) {
jj_input_stream = new ASCII_CharStream(stream, 1, 1);
token_source = new RSLParserTokenManager(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 15; i++) jj_la1[i] = -1;
}
public void ReInit(java.io.InputStream stream) {
jj_input_stream.ReInit(stream, 1, 1);
token_source.ReInit(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 15; i++) jj_la1[i] = -1;
}
public RSLParser(java.io.Reader stream) {
jj_input_stream = new ASCII_CharStream(stream, 1, 1);
token_source = new RSLParserTokenManager(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 15; i++) jj_la1[i] = -1;
}
public void ReInit(java.io.Reader stream) {
jj_input_stream.ReInit(stream, 1, 1);
token_source.ReInit(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 15; i++) jj_la1[i] = -1;
}
public RSLParser(RSLParserTokenManager tm) {
token_source = tm;
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 15; i++) jj_la1[i] = -1;
}
public void ReInit(RSLParserTokenManager tm) {
token_source = tm;
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 15; i++) jj_la1[i] = -1;
}
final private Token jj_consume_token(int kind) throws ParseException {
Token oldToken;
if ((oldToken = token).next != null) token = token.next;
else token = token.next = token_source.getNextToken();
jj_ntk = -1;
if (token.kind == kind) {
jj_gen++;
return token;
}
token = oldToken;
jj_kind = kind;
throw generateParseException();
}
final public Token getNextToken() {
if (token.next != null) token = token.next;
else token = token.next = token_source.getNextToken();
jj_ntk = -1;
jj_gen++;
return token;
}
final public Token getToken(int index) {
Token t = token;
for (int i = 0; i < index; i++) {
if (t.next != null) t = t.next;
else t = t.next = token_source.getNextToken();
}
return t;
}
final private int jj_ntk() {
if ((jj_nt=token.next) == null)
return (jj_ntk = (token.next=token_source.getNextToken()).kind);
else
return (jj_ntk = jj_nt.kind);
}
private java.util.Vector jj_expentries = new java.util.Vector();
private int[] jj_expentry;
private int jj_kind = -1;
final public ParseException generateParseException() {
jj_expentries.removeAllElements();
boolean[] la1tokens = new boolean[28];
for (int i = 0; i < 28; i++) {
la1tokens[i] = false;
}
if (jj_kind >= 0) {
la1tokens[jj_kind] = true;
jj_kind = -1;
}
for (int i = 0; i < 15; i++) {
if (jj_la1[i] == jj_gen) {
for (int j = 0; j < 32; j++) {
if ((jj_la1_0[i] & (1<
© 2015 - 2025 Weber Informatics LLC | Privacy Policy