// $ANTLR : "program.g" -> "programParser.java"$

import edu.neu.ccs.demeter.*;

import antlr.TokenBuffer;
import antlr.TokenStreamException;
import antlr.TokenStreamIOException;
import antlr.ANTLRException;
import antlr.LLkParser;
import antlr.Token;
import antlr.TokenStream;
import antlr.RecognitionException;
import antlr.NoViableAltException;
import antlr.MismatchedTokenException;
import antlr.SemanticException;
import antlr.ParserSharedInputState;
import antlr.collections.impl.BitSet;

public class programParser extends antlr.LLkParser       implements programParserTokenTypes
 {

  static char unescapifyChar(String s) {
    char c = s.charAt(0);
    if (c == '\\') {
      switch (s.charAt(1)) {
      case 'n': c = '\n'; break;
      case 't': c = '\t'; break;
      case 'b': c = '\b'; break;
      case 'r': c = '\r'; break;
      case 'f': c = '\f'; break;
      case '\\': c = '\\'; break;
      case '\'': c = '\''; break;
      case '\"': c = '\"'; break;
      default:
       c = (char) Integer.parseInt(s.substring(1, s.length()), 8);
       break;
      }
    }
    return c;
  }
  static String unescapify(String s) {
    char str[] = new char[s.length()];
    int i = 0, o = 0;
    while (i < s.length()) {
      char c = s.charAt(i++);
      if (c == '\\') {
       int j = i + 1;
       while (j < s.length() &&
              Character.digit(s.charAt(j), 8) != -1) {
         j++;
       }
       c = unescapifyChar(s.substring(i-1, j));
       i = j;
      }
      str[o++] = c;
    }
    return String.valueOf(str, 0, o);
  }

protected programParser(TokenBuffer tokenBuf, int k) {
  super(tokenBuf,k);
  tokenNames = _tokenNames;
}

public programParser(TokenBuffer tokenBuf) {
  this(tokenBuf,2);
}

protected programParser(TokenStream lexer, int k) {
  super(lexer,k);
  tokenNames = _tokenNames;
}

public programParser(TokenStream lexer) {
  this(lexer,2);
}

public programParser(ParserSharedInputState state) {
  super(state,2);
  tokenNames = _tokenNames;
}

	public final Binder  parseBinder() throws RecognitionException, TokenStreamException {
		Binder it;
		
		
		it = new Binder();
		Clause_List the_clauses = null;
		
		
		the_clauses=parseClause_List();
		it.clauses = the_clauses;
		match(Token.EOF_TYPE);
		return it;
	}
	
	public final Clause_List  parseClause_List() throws RecognitionException, TokenStreamException {
		Clause_List it;
		
		
		it = new Clause_List();
		Clause the_repeatedPart = null;
		
		
		{
		_loop19:
		do {
			if ((_tokenSet_0.member(LA(1)))) {
				the_repeatedPart=parseClause();
				it.add(the_repeatedPart);
			}
			else {
				break _loop19;
			}
			
		} while (true);
		}
		return it;
	}
	
	public final Clause  parseClause() throws RecognitionException, TokenStreamException {
		Clause it;
		
		
		it = new Clause();
		Atom the_head = null;
		Atom_CList the_body = null;
		
		
		the_head=parseAtom();
		it.head = the_head;
		{
		switch ( LA(1)) {
		case 4:
		{
			match(4);
			the_body=parseAtom_CList();
			it.body = the_body;
			break;
		}
		case 5:
		{
			break;
		}
		default:
		{
			throw new NoViableAltException(LT(1), getFilename());
		}
		}
		}
		match(5);
		return it;
	}
	
	public final Atom  parseAtom() throws RecognitionException, TokenStreamException {
		Atom it;
		
		
		it = new Atom();
		Term the_context = null;
		Constant the_pred = null;
		Term_PCList the_args = null;
		
		
		{
		if ((_tokenSet_0.member(LA(1))) && (LA(2)==LITERAL_says||LA(2)==IDENT)) {
			the_context=parseTerm();
			it.context = the_context;
			match(LITERAL_says);
			match(7);
		}
		else if ((LA(1)==8||LA(1)==STRING_LITERAL) && (_tokenSet_1.member(LA(2)))) {
		}
		else {
			throw new NoViableAltException(LT(1), getFilename());
		}
		
		}
		the_pred=parseConstant();
		it.pred = the_pred;
		{
		switch ( LA(1)) {
		case 11:
		{
			the_args=parseTerm_PCList();
			it.args = the_args;
			break;
		}
		case 4:
		case 5:
		case 10:
		{
			break;
		}
		default:
		{
			throw new NoViableAltException(LT(1), getFilename());
		}
		}
		}
		return it;
	}
	
	public final Atom_CList  parseAtom_CList() throws RecognitionException, TokenStreamException {
		Atom_CList it;
		
		
		it = new Atom_CList();
		Atom the_repeatedPart = null;
		
		
		the_repeatedPart=parseAtom();
		it.add(the_repeatedPart);
		{
		_loop22:
		do {
			if ((LA(1)==10)) {
				match(10);
				the_repeatedPart=parseAtom();
				it.add(the_repeatedPart);
			}
			else {
				break _loop22;
			}
			
		} while (true);
		}
		return it;
	}
	
	public final Term  parseTerm() throws RecognitionException, TokenStreamException {
		Term it;
		
		
		switch ( LA(1)) {
		case 8:
		case STRING_LITERAL:
		{
			it=parseConstant();
			break;
		}
		case LITERAL__:
		case IDENT:
		{
			it=parseVariable();
			break;
		}
		default:
		{
			throw new NoViableAltException(LT(1), getFilename());
		}
		}
		return it;
	}
	
	public final Constant  parseConstant() throws RecognitionException, TokenStreamException {
		Constant it;
		
		
		switch ( LA(1)) {
		case 8:
		{
			it=parseIdentConstant();
			break;
		}
		case STRING_LITERAL:
		{
			it=parseStringConstant();
			break;
		}
		default:
		{
			throw new NoViableAltException(LT(1), getFilename());
		}
		}
		return it;
	}
	
	public final Term_PCList  parseTerm_PCList() throws RecognitionException, TokenStreamException {
		Term_PCList it;
		
		
		it = new Term_PCList();
		Term the_repeatedPart = null;
		
		
		match(11);
		the_repeatedPart=parseTerm();
		it.add(the_repeatedPart);
		{
		_loop25:
		do {
			if ((LA(1)==10)) {
				match(10);
				the_repeatedPart=parseTerm();
				it.add(the_repeatedPart);
			}
			else {
				break _loop25;
			}
			
		} while (true);
		}
		match(12);
		return it;
	}
	
	public final Variable  parseVariable() throws RecognitionException, TokenStreamException {
		Variable it;
		
		
		switch ( LA(1)) {
		case IDENT:
		{
			it=parseVariableName();
			break;
		}
		case LITERAL__:
		{
			it=parseUIdent();
			break;
		}
		default:
		{
			throw new NoViableAltException(LT(1), getFilename());
		}
		}
		return it;
	}
	
	public final void commonTerm(
		Term it
	) throws RecognitionException, TokenStreamException {
		
		
		
		
	}
	
	public final IdentConstant  parseIdentConstant() throws RecognitionException, TokenStreamException {
		IdentConstant it;
		
		
		it = new IdentConstant();
		Ident the_ident = null;
		
		
		match(8);
		the_ident=parseIdent();
		it.ident = the_ident;
		commonConstant(it);
		return it;
	}
	
	public final StringConstant  parseStringConstant() throws RecognitionException, TokenStreamException {
		StringConstant it;
		
		
		it = new StringConstant();
		String the_string = null;
		
		
		the_string=parseString();
		it.string = the_string;
		commonConstant(it);
		return it;
	}
	
	public final void commonConstant(
		Constant it
	) throws RecognitionException, TokenStreamException {
		
		
		
		
		commonTerm(it);
	}
	
	public final Ident  parseIdent() throws RecognitionException, TokenStreamException {
		Ident it;
		
		Token  t = null;
		
		t = LT(1);
		match(IDENT);
		it = new Ident(t.getText());
		return it;
	}
	
	public final String  parseString() throws RecognitionException, TokenStreamException {
		String it;
		
		Token  t = null;
		
		t = LT(1);
		match(STRING_LITERAL);
		String s = t.getText();
		it = unescapify(s.substring(1, s.length()-1));
		return it;
	}
	
	public final VariableName  parseVariableName() throws RecognitionException, TokenStreamException {
		VariableName it;
		
		
		it = new VariableName();
		Ident the_ident = null;
		
		
		the_ident=parseIdent();
		it.ident = the_ident;
		commonVariable(it);
		return it;
	}
	
	public final UIdent  parseUIdent() throws RecognitionException, TokenStreamException {
		UIdent it;
		
		
		it = new UIdent();
		Ident the_ident = null;
		
		
		match(LITERAL__);
		the_ident=parseIdent();
		it.ident = the_ident;
		commonVariable(it);
		return it;
	}
	
	public final void commonVariable(
		Variable it
	) throws RecognitionException, TokenStreamException {
		
		
		
		
		commonTerm(it);
	}
	
	public final boolean  parseboolean() throws RecognitionException, TokenStreamException {
		boolean it;
		
		
		switch ( LA(1)) {
		case LITERAL_true:
		{
			match(LITERAL_true);
			it = true;
			break;
		}
		case LITERAL_false:
		{
			match(LITERAL_false);
			it = false;
			break;
		}
		default:
		{
			throw new NoViableAltException(LT(1), getFilename());
		}
		}
		return it;
	}
	
	public final char  parsechar() throws RecognitionException, TokenStreamException {
		char it;
		
		Token  t = null;
		
		t = LT(1);
		match(CHAR_LITERAL);
		String s = t.getText();
		it = unescapifyChar(s.substring(1, s.length()-1));
		return it;
	}
	
	public final byte  parsebyte() throws RecognitionException, TokenStreamException {
		byte it;
		
		int i;
		
		i=parseint();
		it = (byte) i;
		return it;
	}
	
	public final int  parseint() throws RecognitionException, TokenStreamException {
		int it;
		
		Token  t = null;
		
		t = LT(1);
		match(NUM_INT);
		it = Integer.parseInt(t.getText());
		return it;
	}
	
	public final short  parseshort() throws RecognitionException, TokenStreamException {
		short it;
		
		int i;
		
		i=parseint();
		it = (short) i;
		return it;
	}
	
	public final long  parselong() throws RecognitionException, TokenStreamException {
		long it;
		
		Token  t = null;
		
		t = LT(1);
		match(NUM_LONG);
		String s = t.getText();
		it = Long.parseLong(s.substring(0,s.length()-1));
		return it;
	}
	
	public final float  parsefloat() throws RecognitionException, TokenStreamException {
		float it;
		
		Token  t = null;
		
		t = LT(1);
		match(NUM_FLOAT);
		String s = t.getText();
		it = Float.parseFloat(s.substring(0,s.length()-1));
		return it;
	}
	
	public final double  parsedouble() throws RecognitionException, TokenStreamException {
		double it;
		
		Token  t = null;
		
		t = LT(1);
		match(NUM_DOUBLE);
		String s = t.getText();
		if (s.endsWith("D") || s.endsWith("d"))
		it = Double.parseDouble(s.substring(0,s.length()-1));
		else
		it = Double.parseDouble(s);
		return it;
	}
	
	public final Boolean  parseBoolean() throws RecognitionException, TokenStreamException {
		Boolean it;
		
		
		switch ( LA(1)) {
		case LITERAL_true:
		{
			match(LITERAL_true);
			it = Boolean.TRUE;
			break;
		}
		case LITERAL_false:
		{
			match(LITERAL_false);
			it = Boolean.FALSE;
			break;
		}
		default:
		{
			throw new NoViableAltException(LT(1), getFilename());
		}
		}
		return it;
	}
	
	public final Character  parseCharacter() throws RecognitionException, TokenStreamException {
		Character it;
		
		char c;
		
		c=parsechar();
		it = new Character(c);
		return it;
	}
	
	public final Byte  parseByte() throws RecognitionException, TokenStreamException {
		Byte it;
		
		byte b;
		
		b=parsebyte();
		it = new Byte(b);
		return it;
	}
	
	public final Integer  parseInteger() throws RecognitionException, TokenStreamException {
		Integer it;
		
		int i;
		
		i=parseint();
		it = new Integer(i);
		return it;
	}
	
	public final Long  parseLong() throws RecognitionException, TokenStreamException {
		Long it;
		
		long l;
		
		l=parselong();
		it = new Long(l);
		return it;
	}
	
	public final Float  parseFloat() throws RecognitionException, TokenStreamException {
		Float it;
		
		float f;
		
		f=parsefloat();
		it = new Float(f);
		return it;
	}
	
	public final Double  parseDouble() throws RecognitionException, TokenStreamException {
		Double it;
		
		double d;
		
		d=parsedouble();
		it = new Double(d);
		return it;
	}
	
	public final Number  parseNumber() throws RecognitionException, TokenStreamException {
		Number it;
		
		
		switch ( LA(1)) {
		case NUM_INT:
		{
			it=parseInteger();
			break;
		}
		case NUM_LONG:
		{
			it=parseLong();
			break;
		}
		case NUM_FLOAT:
		{
			it=parseFloat();
			break;
		}
		case NUM_DOUBLE:
		{
			it=parseDouble();
			break;
		}
		default:
		{
			throw new NoViableAltException(LT(1), getFilename());
		}
		}
		return it;
	}
	
	
	public static final String[] _tokenNames = {
		"<0>",
		"EOF",
		"<2>",
		"NULL_TREE_LOOKAHEAD",
		"\":-\"",
		"\".\"",
		"\"says\"",
		"\":\"",
		"\"#\"",
		"\"_\"",
		"\",\"",
		"\"(\"",
		"\")\"",
		"\"true\"",
		"\"false\"",
		"CHAR_LITERAL",
		"NUM_INT",
		"NUM_LONG",
		"NUM_FLOAT",
		"NUM_DOUBLE",
		"STRING_LITERAL",
		"IDENT",
		"DOT",
		"WS",
		"SL_COMMENT",
		"ML_COMMENT",
		"ESC",
		"HEX_DIGIT",
		"VOCAB",
		"EXPONENT",
		"FLOAT_SUFFIX"
	};
	
	private static final long[] mk_tokenSet_0() {
		long[] data = { 3146496L, 0L};
		return data;
	}
	public static final BitSet _tokenSet_0 = new BitSet(mk_tokenSet_0());
	private static final long[] mk_tokenSet_1() {
		long[] data = { 2100272L, 0L};
		return data;
	}
	public static final BitSet _tokenSet_1 = new BitSet(mk_tokenSet_1());
	
	}