// ===========================================================================
// This file has been generated by
// Rats! Parser Generator, version 2.1.0,
// (C) 2004-2011 Robert Grimm,
// on Monday, July 25, 2011 at 2:20:16 PM.
// Edit at your own risk.
// ===========================================================================
package xtc.lang;
import java.io.Reader;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import xtc.util.Action;
import xtc.util.Pair;
import xtc.tree.Node;
import xtc.tree.GNode;
import xtc.tree.Printer;
import xtc.parser.ParserBase;
import xtc.parser.Column;
import xtc.parser.Result;
import xtc.parser.SemanticValue;
import xtc.parser.ParseError;
/**
* Packrat parser for grammar <code>xtc.lang.TypedLambda</code>.
*
* <p />This class has been generated by the <i>Rats!</i> parser
* generator, version 2.1.0, (C) 2004-2011 Robert Grimm.
*/
public final class TypedLambdaParser extends ParserBase {
// =========================================================================
/** Memoization table column. */
static final class TypedLambdaParserColumn extends Column {
Result fApplication;
Result fBasicExpression;
Result fIdentifier;
Result fFunctionType;
Result fBasicType;
Result fOPEN;
Result fCLOSE;
}
// =========================================================================
/**
* Create a new packrat parser.
*
* @param reader The reader.
* @param file The file name.
*/
public TypedLambdaParser(final Reader reader, final String file) {
super(reader, file);
}
/**
* Create a new packrat parser.
*
* @param reader The file reader.
* @param file The file name.
* @param size The file size.
*/
public TypedLambdaParser(final Reader reader, final String file, final int size) {
super(reader, file, size);
}
// =========================================================================
protected Column newColumn() {
return new TypedLambdaParserColumn();
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.Expression.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
public Result pExpression(final int yyStart) throws IOException {
Result yyResult;
Node yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyResult = pApplication(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = yyResult.semanticValue();
yyResult = pEndOfFile(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
return yyResult.createValue(yyValue, yyError);
}
}
// Done.
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.Application.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pApplication(final int yyStart) throws IOException {
TypedLambdaParserColumn yyColumn = (TypedLambdaParserColumn)column(yyStart);
if (null == yyColumn.fApplication)
yyColumn.fApplication = pApplication$1(yyStart);
return yyColumn.fApplication;
}
/** Actually parse xtc.lang.TypedLambda.Application. */
private Result pApplication$1(final int yyStart) throws IOException {
Result yyResult;
int yyRepetition1;
Pair<Action<Node>> yyRepValue1;
Node yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative <Base>.
yyResult = pBasicExpression(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
final Node v$g$3 = yyResult.semanticValue();
yyRepetition1 = yyResult.index;
yyRepValue1 = Pair.empty();
while (true) {
yyResult = pApplication$$Tail1(yyRepetition1);
yyError = yyResult.select(yyError, yyRepetition1);
if (yyResult.hasValue()) {
final Action<Node> v$4 = yyResult.semanticValue();
yyRepetition1 = yyResult.index;
yyRepValue1 = new Pair<Action<Node>>(v$4, yyRepValue1);
continue;
}
break;
}
{ // Start scope for v$5.
final Pair<Action<Node>> v$5 = yyRepValue1.reverse();
yyValue = apply(v$5, v$g$3, yyStart);
return new SemanticValue(yyValue, yyRepetition1, yyError);
} // End scope for v$5.
}
// Done.
return yyError;
}
// =========================================================================
/**
* Parse synthetic nonterminal xtc.lang.TypedLambda.Application$$Tail1.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pApplication$$Tail1(final int yyStart) throws IOException {
Result yyResult;
Action<Node> yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative <Recursion>.
yyResult = pBasicExpression(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
final Node v$g$2 = yyResult.semanticValue();
yyValue = new Action<Node>() {
public Node run(Node v$1) {
return GNode.create("Application", v$1, v$g$2);
}};
return yyResult.createValue(yyValue, yyError);
}
// Done.
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.BasicExpression.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pBasicExpression(final int yyStart) throws IOException {
TypedLambdaParserColumn yyColumn = (TypedLambdaParserColumn)column(yyStart);
if (null == yyColumn.fBasicExpression)
yyColumn.fBasicExpression = pBasicExpression$1(yyStart);
return yyColumn.fBasicExpression;
}
/** Actually parse xtc.lang.TypedLambda.BasicExpression. */
private Result pBasicExpression$1(final int yyStart) throws IOException {
Result yyResult;
Node yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative <Abstraction>.
yyResult = pAbstraction(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = yyResult.semanticValue();
return yyResult.createValue(yyValue, yyError);
}
// Alternative <Identifier>.
yyResult = pIdentifier(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = yyResult.semanticValue();
return yyResult.createValue(yyValue, yyError);
}
// Alternative <Integer>.
yyResult = pIntegerConstant(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = yyResult.semanticValue();
return yyResult.createValue(yyValue, yyError);
}
// Alternative <String>.
yyResult = pStringConstant(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = yyResult.semanticValue();
return yyResult.createValue(yyValue, yyError);
}
// Alternative <Parenthesized>.
yyResult = pOPEN(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyResult = pApplication(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = yyResult.semanticValue();
yyResult = pCLOSE(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
return yyResult.createValue(yyValue, yyError);
}
}
}
// Done.
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.Abstraction.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pAbstraction(final int yyStart) throws IOException {
Result yyResult;
Node yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyResult = pLAMBDA(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyResult = pIdentifier(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
final Node v$g$1 = yyResult.semanticValue();
yyResult = pCOLON(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyResult = pFunctionType(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
final Node v$g$2 = yyResult.semanticValue();
yyResult = pDOT(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyResult = pApplication(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
final Node v$g$3 = yyResult.semanticValue();
yyValue = GNode.create("Abstraction", v$g$1, v$g$2, v$g$3);
yyValue.setLocation(location(yyStart));
return yyResult.createValue(yyValue, yyError);
}
}
}
}
}
}
// Done.
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.Identifier.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pIdentifier(final int yyStart) throws IOException {
TypedLambdaParserColumn yyColumn = (TypedLambdaParserColumn)column(yyStart);
if (null == yyColumn.fIdentifier)
yyColumn.fIdentifier = pIdentifier$1(yyStart);
return yyColumn.fIdentifier;
}
/** Actually parse xtc.lang.TypedLambda.Identifier. */
private Result pIdentifier$1(final int yyStart) throws IOException {
Result yyResult;
Node yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyResult = pIdentifierCharacters(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
final String v$g$1 = yyResult.semanticValue();
yyResult = pSpacing(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = GNode.create("Identifier", v$g$1);
yyValue.setLocation(location(yyStart));
return yyResult.createValue(yyValue, yyError);
}
}
// Done.
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.IdentifierCharacters.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pIdentifierCharacters(final int yyStart) throws IOException {
int yyC;
int yyIndex;
int yyRepetition1;
boolean yyRepeated1;
String yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyRepetition1 = yyStart;
yyRepeated1 = false;
while (true) {
yyC = character(yyRepetition1);
if (-1 != yyC) {
yyIndex = yyRepetition1 + 1;
if ((('A' <= yyC) && (yyC <= 'Z')) ||
(('a' <= yyC) && (yyC <= 'z'))) {
yyRepetition1 = yyIndex;
yyRepeated1 = true;
continue;
}
}
break;
}
if (yyRepeated1) {
yyValue = difference(yyStart, yyRepetition1);
return new SemanticValue(yyValue, yyRepetition1, yyError);
}
// Done.
yyError = yyError.select("identifier characters expected", yyStart);
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.IntegerConstant.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pIntegerConstant(final int yyStart) throws IOException {
Result yyResult;
Node yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyResult = pIntegerCharacters(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
final String v$g$1 = yyResult.semanticValue();
yyResult = pSpacing(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = GNode.create("IntegerConstant", v$g$1);
yyValue.setLocation(location(yyStart));
return yyResult.createValue(yyValue, yyError);
}
}
// Done.
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.IntegerCharacters.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pIntegerCharacters(final int yyStart) throws IOException {
int yyC;
int yyIndex;
int yyRepetition1;
String yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyC = character(yyStart);
if (-1 != yyC) {
yyIndex = yyStart + 1;
switch (yyC) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{
yyRepetition1 = yyIndex;
while (true) {
yyC = character(yyRepetition1);
if (-1 != yyC) {
yyIndex = yyRepetition1 + 1;
switch (yyC) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{
yyRepetition1 = yyIndex;
continue;
}
default:
/* No match. */
}
}
break;
}
yyValue = difference(yyStart, yyRepetition1);
return new SemanticValue(yyValue, yyRepetition1, yyError);
}
default:
/* No match. */
}
}
// Done.
yyError = yyError.select("integer characters expected", yyStart);
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.StringConstant.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pStringConstant(final int yyStart) throws IOException {
Result yyResult;
Node yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyResult = pStringCharacters(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
final String v$g$1 = yyResult.semanticValue();
yyResult = pSpacing(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = GNode.create("StringConstant", v$g$1);
yyValue.setLocation(location(yyStart));
return yyResult.createValue(yyValue, yyError);
}
}
// Done.
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.StringCharacters.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pStringCharacters(final int yyStart) throws IOException {
int yyC;
int yyIndex;
int yyRepetition1;
String yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyC = character(yyStart);
if ('\"' == yyC) {
yyIndex = yyStart + 1;
yyRepetition1 = yyIndex;
while (true) {
yyC = character(yyRepetition1);
if (-1 != yyC) {
yyIndex = yyRepetition1 + 1;
if ('\"' != yyC) {
yyRepetition1 = yyIndex;
continue;
}
}
break;
}
yyC = character(yyRepetition1);
if ('\"' == yyC) {
yyIndex = yyRepetition1 + 1;
yyValue = difference(yyStart, yyIndex);
return new SemanticValue(yyValue, yyIndex, yyError);
}
}
// Done.
yyError = yyError.select("string characters expected", yyStart);
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.FunctionType.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pFunctionType(final int yyStart) throws IOException {
TypedLambdaParserColumn yyColumn = (TypedLambdaParserColumn)column(yyStart);
if (null == yyColumn.fFunctionType)
yyColumn.fFunctionType = pFunctionType$1(yyStart);
return yyColumn.fFunctionType;
}
/** Actually parse xtc.lang.TypedLambda.FunctionType. */
private Result pFunctionType$1(final int yyStart) throws IOException {
Result yyResult;
Node yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative <Recursion>.
yyResult = pBasicType(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
final Node v$g$1 = yyResult.semanticValue();
yyResult = pARROW(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyResult = pFunctionType(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
final Node v$g$2 = yyResult.semanticValue();
yyValue = GNode.create("FunctionType", v$g$1, v$g$2);
yyValue.setLocation(location(yyStart));
return yyResult.createValue(yyValue, yyError);
}
}
}
// Alternative <Base>.
yyResult = pBasicType(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = yyResult.semanticValue();
return yyResult.createValue(yyValue, yyError);
}
// Done.
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.BasicType.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pBasicType(final int yyStart) throws IOException {
TypedLambdaParserColumn yyColumn = (TypedLambdaParserColumn)column(yyStart);
if (null == yyColumn.fBasicType)
yyColumn.fBasicType = pBasicType$1(yyStart);
return yyColumn.fBasicType;
}
/** Actually parse xtc.lang.TypedLambda.BasicType. */
private Result pBasicType$1(final int yyStart) throws IOException {
int yyC;
int yyIndex;
Result yyResult;
Node yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyC = character(yyStart);
if ('i' == yyC) {
yyIndex = yyStart + 1;
yyC = character(yyIndex);
if ('n' == yyC) {
yyIndex = yyIndex + 1;
yyC = character(yyIndex);
if ('t' == yyC) {
yyIndex = yyIndex + 1;
yyResult = pSpacing(yyIndex);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = GNode.create("IntegerType", false);
yyValue.setLocation(location(yyStart));
return yyResult.createValue(yyValue, yyError);
}
}
}
}
// Alternative 2.
yyC = character(yyStart);
if ('s' == yyC) {
yyIndex = yyStart + 1;
yyC = character(yyIndex);
if ('t' == yyC) {
yyIndex = yyIndex + 1;
yyC = character(yyIndex);
if ('r' == yyC) {
yyIndex = yyIndex + 1;
yyC = character(yyIndex);
if ('i' == yyC) {
yyIndex = yyIndex + 1;
yyC = character(yyIndex);
if ('n' == yyC) {
yyIndex = yyIndex + 1;
yyC = character(yyIndex);
if ('g' == yyC) {
yyIndex = yyIndex + 1;
yyResult = pSpacing(yyIndex);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = GNode.create("StringType", false);
yyValue.setLocation(location(yyStart));
return yyResult.createValue(yyValue, yyError);
}
}
}
}
}
}
}
// Alternative <Parenthesized>.
yyResult = pOPEN(yyStart);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyResult = pFunctionType(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = yyResult.semanticValue();
yyResult = pCLOSE(yyResult.index);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
return yyResult.createValue(yyValue, yyError);
}
}
}
// Done.
yyError = yyError.select("basic type expected", yyStart);
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.LAMBDA.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pLAMBDA(final int yyStart) throws IOException {
int yyC;
int yyIndex;
Result yyResult;
Void yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyC = character(yyStart);
if ('\\' == yyC) {
yyIndex = yyStart + 1;
yyResult = pSpacing(yyIndex);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = null;
return yyResult.createValue(yyValue, yyError);
}
}
// Done.
yyError = yyError.select("LAMBDA expected", yyStart);
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.COLON.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pCOLON(final int yyStart) throws IOException {
int yyC;
int yyIndex;
Result yyResult;
Void yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyC = character(yyStart);
if (':' == yyC) {
yyIndex = yyStart + 1;
yyResult = pSpacing(yyIndex);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = null;
return yyResult.createValue(yyValue, yyError);
}
}
// Done.
yyError = yyError.select("COLON expected", yyStart);
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.DOT.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pDOT(final int yyStart) throws IOException {
int yyC;
int yyIndex;
Result yyResult;
Void yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyC = character(yyStart);
if ('.' == yyC) {
yyIndex = yyStart + 1;
yyResult = pSpacing(yyIndex);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = null;
return yyResult.createValue(yyValue, yyError);
}
}
// Done.
yyError = yyError.select("DOT expected", yyStart);
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.ARROW.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pARROW(final int yyStart) throws IOException {
int yyC;
int yyIndex;
Result yyResult;
Void yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyC = character(yyStart);
if ('-' == yyC) {
yyIndex = yyStart + 1;
yyC = character(yyIndex);
if ('>' == yyC) {
yyIndex = yyIndex + 1;
yyResult = pSpacing(yyIndex);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = null;
return yyResult.createValue(yyValue, yyError);
}
}
}
// Done.
yyError = yyError.select("ARROW expected", yyStart);
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.OPEN.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pOPEN(final int yyStart) throws IOException {
TypedLambdaParserColumn yyColumn = (TypedLambdaParserColumn)column(yyStart);
if (null == yyColumn.fOPEN) yyColumn.fOPEN = pOPEN$1(yyStart);
return yyColumn.fOPEN;
}
/** Actually parse xtc.lang.TypedLambda.OPEN. */
private Result pOPEN$1(final int yyStart) throws IOException {
int yyC;
int yyIndex;
Result yyResult;
Void yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyC = character(yyStart);
if ('(' == yyC) {
yyIndex = yyStart + 1;
yyResult = pSpacing(yyIndex);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = null;
return yyResult.createValue(yyValue, yyError);
}
}
// Done.
yyError = yyError.select("OPEN expected", yyStart);
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.lang.TypedLambda.CLOSE.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pCLOSE(final int yyStart) throws IOException {
TypedLambdaParserColumn yyColumn = (TypedLambdaParserColumn)column(yyStart);
if (null == yyColumn.fCLOSE) yyColumn.fCLOSE = pCLOSE$1(yyStart);
return yyColumn.fCLOSE;
}
/** Actually parse xtc.lang.TypedLambda.CLOSE. */
private Result pCLOSE$1(final int yyStart) throws IOException {
int yyC;
int yyIndex;
Result yyResult;
Void yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyC = character(yyStart);
if (')' == yyC) {
yyIndex = yyStart + 1;
yyResult = pSpacing(yyIndex);
yyError = yyResult.select(yyError);
if (yyResult.hasValue()) {
yyValue = null;
return yyResult.createValue(yyValue, yyError);
}
}
// Done.
yyError = yyError.select("CLOSE expected", yyStart);
return yyError;
}
// =========================================================================
/**
* Parse nonterminal xtc.util.Spacing.Spacing.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pSpacing(final int yyStart) throws IOException {
int yyC;
int yyIndex;
Result yyPredResult;
boolean yyPredMatched;
int yyBase;
int yyRepetition1;
int yyRepetition2;
Void yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyRepetition1 = yyStart;
while (true) {
final int yyChoice1 = yyRepetition1;
// Nested alternative 1.
yyC = character(yyChoice1);
if (-1 != yyC) {
yyIndex = yyChoice1 + 1;
switch (yyC) {
case ' ':
{
yyRepetition1 = yyIndex;
continue;
}
case '\t':
{
yyRepetition1 = yyIndex;
continue;
}
case '\f':
{
yyRepetition1 = yyIndex;
continue;
}
case '\r':
{
final int yyChoice2 = yyIndex;
// Nested alternative 1.
yyC = character(yyChoice2);
if ('\n' == yyC) {
yyIndex = yyChoice2 + 1;
yyRepetition1 = yyIndex;
continue;
}
// Nested alternative 2.
yyRepetition1 = yyChoice2;
continue;
}
case '\n':
{
yyRepetition1 = yyIndex;
continue;
}
case '/':
{
yyC = character(yyIndex);
if (-1 != yyC) {
yyIndex = yyIndex + 1;
switch (yyC) {
case '*':
{
yyRepetition2 = yyIndex;
while (true) {
final int yyChoice2 = yyRepetition2;
// Nested alternative 1.
yyC = character(yyChoice2);
if (-1 != yyC) {
yyIndex = yyChoice2 + 1;
switch (yyC) {
case '*':
{
yyPredMatched = false;
yyC = character(yyIndex);
if ('/' == yyC) {
yyPredMatched = true;
}
if (! yyPredMatched) {
yyRepetition2 = yyIndex;
continue;
} else {
yyError = yyError.select("spacing expected", yyStart);
}
}
break;
default:
{
yyRepetition2 = yyIndex;
continue;
}
}
}
break;
}
yyBase = yyRepetition2;
yyC = character(yyBase);
if ('*' == yyC) {
yyIndex = yyRepetition2 + 1;
yyC = character(yyIndex);
if ('/' == yyC) {
yyIndex = yyIndex + 1;
yyRepetition1 = yyIndex;
continue;
} else {
yyError = yyError.select("'*/' expected", yyBase);
}
} else {
yyError = yyError.select("'*/' expected", yyBase);
}
}
break;
case '/':
{
yyRepetition2 = yyIndex;
while (true) {
yyC = character(yyRepetition2);
if (-1 != yyC) {
yyIndex = yyRepetition2 + 1;
switch (yyC) {
case '\n':
case '\r':
/* No match. */
break;
default:
{
yyRepetition2 = yyIndex;
continue;
}
}
}
break;
}
final int yyChoice2 = yyRepetition2;
// Nested alternative 1.
yyC = character(yyChoice2);
if (-1 != yyC) {
yyIndex = yyChoice2 + 1;
switch (yyC) {
case '\r':
{
final int yyChoice3 = yyIndex;
// Nested alternative 1.
yyC = character(yyChoice3);
if ('\n' == yyC) {
yyIndex = yyChoice3 + 1;
yyRepetition1 = yyIndex;
continue;
}
// Nested alternative 2.
yyRepetition1 = yyChoice3;
continue;
}
case '\n':
{
yyRepetition1 = yyIndex;
continue;
}
default:
/* No match. */
}
}
// Nested alternative 2.
yyPredResult = pEndOfFile(yyChoice2);
yyError = yyPredResult.select(yyError);
if (yyPredResult.hasValue()) {
yyRepetition1 = yyChoice2;
continue;
}
}
break;
default:
/* No match. */
}
}
}
break;
default:
/* No match. */
}
}
break;
}
yyValue = null;
return new SemanticValue(yyValue, yyRepetition1, yyError);
}
// =========================================================================
/**
* Parse nonterminal xtc.util.Spacing.EndOfFile.
*
* @param yyStart The index.
* @return The result.
* @throws IOException Signals an I/O error.
*/
private Result pEndOfFile(final int yyStart) throws IOException {
int yyC;
boolean yyPredMatched;
Void yyValue;
ParseError yyError = ParseError.DUMMY;
// Alternative 1.
yyPredMatched = false;
yyC = character(yyStart);
if (-1 != yyC) {
yyPredMatched = true;
}
if (! yyPredMatched) {
yyValue = null;
return new SemanticValue(yyValue, yyStart, yyError);
} else {
yyError = yyError.select("end of file expected", yyStart);
}
// Done.
return yyError;
}
// =========================================================================
/**
* Get the specified text.
*
* @param s The text.
* @return The text.
*/
protected static final String toText(String s) {
return s;
}
// =========================================================================
/**
* Parse the specified files.
*
* @param args The file names.
*/
public static void main(String[] args) {
if ((null == args) || (0 == args.length)) {
System.err.println("Usage: <file-name>+");
} else {
for (int i=0; i<args.length; i++) {
System.err.println("Processing " + args[i] + " ...");
Reader in = null;
try {
in = new BufferedReader(new FileReader(args[i]));
TypedLambdaParser p =
new TypedLambdaParser(in, args[i], (int)new File(args[i]).length());
Result r = p.pExpression(0);
if (r.hasValue()) {
SemanticValue v = (SemanticValue)r;
if (v.value instanceof Node) {
Printer ptr = new
Printer(new BufferedWriter(new OutputStreamWriter(System.out)));
ptr.format((Node)v.value).pln().flush();
} else {
System.out.println(v.value.toString());
}
} else {
ParseError err = (ParseError)r;
if (-1 == err.index) {
System.err.println(" Parse error");
} else {
System.err.println(" " + p.location(err.index) + ": " + err.msg);
}
}
} catch (Throwable x) {
while (null != x.getCause()) {
x = x.getCause();
}
x.printStackTrace();
} finally {
try {
in.close();
} catch (Throwable x) {
/* Ignore. */
}
}
}
}
}
}