All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fulib.scenarios.parser.ScenarioParser Maven / Gradle / Ivy

// Generated from ScenarioParser.g4 by ANTLR 4.9.3
package org.fulib.scenarios.parser;
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.misc.*;
import org.antlr.v4.runtime.tree.*;
import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;

@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class ScenarioParser extends Parser {
	static { RuntimeMetaData.checkVersion("4.9.3", RuntimeMetaData.VERSION); }

	protected static final DFA[] _decisionToDFA;
	protected static final PredictionContextCache _sharedContextCache =
		new PredictionContextCache();
	public static final int
		A=1, ADD=2, ADDS=3, ALL=4, AN=5, AND=6, ANSWER=7, ANSWERS=8, ARE=9, AS=10, 
		ATTRIBUTE=11, CALL=12, CALLS=13, CARD=14, CARDS=15, CF=16, CONTAIN=17, 
		CONTAINS=18, CREATE=19, CREATES=20, DO=21, DOES=22, EG=23, EMPTY=24, EQUAL=25, 
		EVERY=26, EXPECT=27, FALSE=28, FROM=29, GREATER=30, HAS=31, HAVE=32, IN=33, 
		INTO=34, IS=35, IT=36, LESS=37, LIKE=38, LINK=39, MANY=40, MATCH=41, MATCHES=42, 
		NOT=43, OF=44, OR=45, ON=46, ONE=47, READ=48, READS=49, REGISTER=50, REMOVE=51, 
		REMOVES=52, SAME=53, SOME=54, TAKE=55, TAKES=56, THAN=57, THAT=58, THE=59, 
		THEN=60, THERE=61, THROUGH=62, TRUE=63, TYPE=64, TO=65, WE=66, WITH=67, 
		WHERE=68, WHICH=69, WHOSE=70, WRITE=71, WRITES=72, H1=73, H2=74, LINE_COMMENT=75, 
		BLOCKQUOTE=76, CODE_BLOCK=77, BULLET=78, NUMBERED=79, COMMA=80, FULL_STOP=81, 
		PLUS=82, COLON=83, INTEGER=84, DECIMAL=85, STRING_LITERAL=86, WORD=87, 
		WHITESPACE=88, LINEBREAK=89, COMMENT=90, IMG_START=91, IMG_SEP=92, IMG_END=93, 
		FILE_NAME=94, HEADLINE_END=95, HEADLINE_TEXT=96, CODE_BLOCK_HEADER_END=97, 
		CODE_BLOCK_LANGUAGE=98, CODE_BLOCK_END=99, CODE_BLOCK_LINE=100;
	public static final int
		RULE_file = 0, RULE_scenario = 1, RULE_header = 2, RULE_actor = 3, RULE_sentence = 4, 
		RULE_sentenceEnd = 5, RULE_simpleSentence = 6, RULE_simpleSentences = 7, 
		RULE_compoundSentence = 8, RULE_sectionSentence = 9, RULE_commentSentence = 10, 
		RULE_codeBlock = 11, RULE_thereSentence = 12, RULE_simpleDescriptor = 13, 
		RULE_multiDescriptor = 14, RULE_typeName = 15, RULE_typesName = 16, RULE_isSentence = 17, 
		RULE_areSentence = 18, RULE_withClauses = 19, RULE_withClause = 20, RULE_namedExpr = 21, 
		RULE_bidiNamedExpr = 22, RULE_placeholderNamedExpr = 23, RULE_aPlaceholder = 24, 
		RULE_manyPlaceholder = 25, RULE_likePlaceholder = 26, RULE_ofTypePlaceholder = 27, 
		RULE_everyPlaceholder = 28, RULE_hasSentence = 29, RULE_hasClauses = 30, 
		RULE_hasClause = 31, RULE_createSentence = 32, RULE_callSentence = 33, 
		RULE_answerSentence = 34, RULE_writeSentence = 35, RULE_addSentence = 36, 
		RULE_removeSentence = 37, RULE_conditionalSentence = 38, RULE_takeSentence = 39, 
		RULE_compoundSentenceBody = 40, RULE_expectSentence = 41, RULE_thatClauses = 42, 
		RULE_thatClause = 43, RULE_diagramSentence = 44, RULE_matchSentence = 45, 
		RULE_patternObjects = 46, RULE_patternObject = 47, RULE_constraints = 48, 
		RULE_constraint = 49, RULE_linkConstraint = 50, RULE_attributeEqualityConstraint = 51, 
		RULE_attributeConditionalConstraint = 52, RULE_attributePredicateConstraint = 53, 
		RULE_matchConstraint = 54, RULE_expr = 55, RULE_primary = 56, RULE_primaryExpr = 57, 
		RULE_number = 58, RULE_booleanLiteral = 59, RULE_stringLiteral = 60, RULE_it = 61, 
		RULE_answer = 62, RULE_simpleName = 63, RULE_name = 64, RULE_identifier = 65, 
		RULE_nameAccess = 66, RULE_access = 67, RULE_namedAccess = 68, RULE_named = 69, 
		RULE_attributeAccess = 70, RULE_exampleAccess = 71, RULE_filterExpr = 72, 
		RULE_sep = 73, RULE_collection = 74, RULE_list = 75, RULE_listElem = 76, 
		RULE_range = 77, RULE_condExpr = 78, RULE_andCondExpr = 79, RULE_orCondExpr = 80, 
		RULE_primaryCondExpr = 81, RULE_attrCheck = 82, RULE_condOpExpr = 83, 
		RULE_condOp = 84, RULE_eqOp = 85, RULE_cmpOp = 86, RULE_collOp = 87, RULE_strOp = 88, 
		RULE_predOpExpr = 89, RULE_predOp = 90;
	private static String[] makeRuleNames() {
		return new String[] {
			"file", "scenario", "header", "actor", "sentence", "sentenceEnd", "simpleSentence", 
			"simpleSentences", "compoundSentence", "sectionSentence", "commentSentence", 
			"codeBlock", "thereSentence", "simpleDescriptor", "multiDescriptor", 
			"typeName", "typesName", "isSentence", "areSentence", "withClauses", 
			"withClause", "namedExpr", "bidiNamedExpr", "placeholderNamedExpr", "aPlaceholder", 
			"manyPlaceholder", "likePlaceholder", "ofTypePlaceholder", "everyPlaceholder", 
			"hasSentence", "hasClauses", "hasClause", "createSentence", "callSentence", 
			"answerSentence", "writeSentence", "addSentence", "removeSentence", "conditionalSentence", 
			"takeSentence", "compoundSentenceBody", "expectSentence", "thatClauses", 
			"thatClause", "diagramSentence", "matchSentence", "patternObjects", "patternObject", 
			"constraints", "constraint", "linkConstraint", "attributeEqualityConstraint", 
			"attributeConditionalConstraint", "attributePredicateConstraint", "matchConstraint", 
			"expr", "primary", "primaryExpr", "number", "booleanLiteral", "stringLiteral", 
			"it", "answer", "simpleName", "name", "identifier", "nameAccess", "access", 
			"namedAccess", "named", "attributeAccess", "exampleAccess", "filterExpr", 
			"sep", "collection", "list", "listElem", "range", "condExpr", "andCondExpr", 
			"orCondExpr", "primaryCondExpr", "attrCheck", "condOpExpr", "condOp", 
			"eqOp", "cmpOp", "collOp", "strOp", "predOpExpr", "predOp"
		};
	}
	public static final String[] ruleNames = makeRuleNames();

	private static String[] makeLiteralNames() {
		return new String[] {
			null, "'a'", "'add'", "'adds'", "'all'", "'an'", "'and'", "'answer'", 
			"'answers'", "'are'", null, "'attribute'", "'call'", "'calls'", "'card'", 
			"'cards'", "'cf.'", "'contain'", "'contains'", "'create'", "'creates'", 
			"'do'", "'does'", "'e.g.'", "'empty'", "'equal'", "'Every'", "'expect'", 
			"'false'", "'from'", "'greater'", "'has'", "'have'", "'in'", "'into'", 
			"'is'", "'it'", "'less'", "'like'", "'link'", "'many'", "'match'", "'matches'", 
			"'not'", "'of'", "'or'", "'on'", "'one'", "'read'", "'reads'", "'register'", 
			"'remove'", "'removes'", "'same'", "'some'", "'take'", "'takes'", "'than'", 
			"'that'", null, "'then'", null, "'through'", "'true'", "'type'", "'to'", 
			null, "'with'", "'where'", "'which'", "'whose'", "'write'", "'writes'", 
			"'#'", "'##'", "'//'", null, null, null, null, null, null, null, null, 
			null, null, null, null, null, null, null, "'!['", "']('", "')'"
		};
	}
	private static final String[] _LITERAL_NAMES = makeLiteralNames();
	private static String[] makeSymbolicNames() {
		return new String[] {
			null, "A", "ADD", "ADDS", "ALL", "AN", "AND", "ANSWER", "ANSWERS", "ARE", 
			"AS", "ATTRIBUTE", "CALL", "CALLS", "CARD", "CARDS", "CF", "CONTAIN", 
			"CONTAINS", "CREATE", "CREATES", "DO", "DOES", "EG", "EMPTY", "EQUAL", 
			"EVERY", "EXPECT", "FALSE", "FROM", "GREATER", "HAS", "HAVE", "IN", "INTO", 
			"IS", "IT", "LESS", "LIKE", "LINK", "MANY", "MATCH", "MATCHES", "NOT", 
			"OF", "OR", "ON", "ONE", "READ", "READS", "REGISTER", "REMOVE", "REMOVES", 
			"SAME", "SOME", "TAKE", "TAKES", "THAN", "THAT", "THE", "THEN", "THERE", 
			"THROUGH", "TRUE", "TYPE", "TO", "WE", "WITH", "WHERE", "WHICH", "WHOSE", 
			"WRITE", "WRITES", "H1", "H2", "LINE_COMMENT", "BLOCKQUOTE", "CODE_BLOCK", 
			"BULLET", "NUMBERED", "COMMA", "FULL_STOP", "PLUS", "COLON", "INTEGER", 
			"DECIMAL", "STRING_LITERAL", "WORD", "WHITESPACE", "LINEBREAK", "COMMENT", 
			"IMG_START", "IMG_SEP", "IMG_END", "FILE_NAME", "HEADLINE_END", "HEADLINE_TEXT", 
			"CODE_BLOCK_HEADER_END", "CODE_BLOCK_LANGUAGE", "CODE_BLOCK_END", "CODE_BLOCK_LINE"
		};
	}
	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
	public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);

	/**
	 * @deprecated Use {@link #VOCABULARY} instead.
	 */
	@Deprecated
	public static final String[] tokenNames;
	static {
		tokenNames = new String[_SYMBOLIC_NAMES.length];
		for (int i = 0; i < tokenNames.length; i++) {
			tokenNames[i] = VOCABULARY.getLiteralName(i);
			if (tokenNames[i] == null) {
				tokenNames[i] = VOCABULARY.getSymbolicName(i);
			}

			if (tokenNames[i] == null) {
				tokenNames[i] = "";
			}
		}
	}

	@Override
	@Deprecated
	public String[] getTokenNames() {
		return tokenNames;
	}

	@Override

	public Vocabulary getVocabulary() {
		return VOCABULARY;
	}

	@Override
	public String getGrammarFileName() { return "ScenarioParser.g4"; }

	@Override
	public String[] getRuleNames() { return ruleNames; }

	@Override
	public String getSerializedATN() { return _serializedATN; }

	@Override
	public ATN getATN() { return _ATN; }

	public ScenarioParser(TokenStream input) {
		super(input);
		_interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
	}

	public static class FileContext extends ParserRuleContext {
		public TerminalNode EOF() { return getToken(ScenarioParser.EOF, 0); }
		public List scenario() {
			return getRuleContexts(ScenarioContext.class);
		}
		public ScenarioContext scenario(int i) {
			return getRuleContext(ScenarioContext.class,i);
		}
		public FileContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_file; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterFile(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitFile(this);
		}
	}

	public final FileContext file() throws RecognitionException {
		FileContext _localctx = new FileContext(_ctx, getState());
		enterRule(_localctx, 0, RULE_file);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(185);
			_errHandler.sync(this);
			_la = _input.LA(1);
			while (_la==H1) {
				{
				{
				setState(182);
				scenario();
				}
				}
				setState(187);
				_errHandler.sync(this);
				_la = _input.LA(1);
			}
			setState(188);
			match(EOF);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ScenarioContext extends ParserRuleContext {
		public HeaderContext header() {
			return getRuleContext(HeaderContext.class,0);
		}
		public List sentence() {
			return getRuleContexts(SentenceContext.class);
		}
		public SentenceContext sentence(int i) {
			return getRuleContext(SentenceContext.class,i);
		}
		public ScenarioContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_scenario; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterScenario(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitScenario(this);
		}
	}

	public final ScenarioContext scenario() throws RecognitionException {
		ScenarioContext _localctx = new ScenarioContext(_ctx, getState());
		enterRule(_localctx, 2, RULE_scenario);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(190);
			header();
			setState(194);
			_errHandler.sync(this);
			_la = _input.LA(1);
			while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << AS) | (1L << ATTRIBUTE) | (1L << EVERY) | (1L << FALSE) | (1L << LINK) | (1L << MATCH) | (1L << MATCHES) | (1L << SOME) | (1L << THE) | (1L << THERE) | (1L << TRUE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TYPE - 64)) | (1L << (WE - 64)) | (1L << (WHERE - 64)) | (1L << (WHOSE - 64)) | (1L << (H2 - 64)) | (1L << (LINE_COMMENT - 64)) | (1L << (BLOCKQUOTE - 64)) | (1L << (WORD - 64)) | (1L << (IMG_START - 64)))) != 0)) {
				{
				{
				setState(191);
				sentence();
				}
				}
				setState(196);
				_errHandler.sync(this);
				_la = _input.LA(1);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class HeaderContext extends ParserRuleContext {
		public TerminalNode H1() { return getToken(ScenarioParser.H1, 0); }
		public TerminalNode HEADLINE_TEXT() { return getToken(ScenarioParser.HEADLINE_TEXT, 0); }
		public TerminalNode HEADLINE_END() { return getToken(ScenarioParser.HEADLINE_END, 0); }
		public HeaderContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_header; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterHeader(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitHeader(this);
		}
	}

	public final HeaderContext header() throws RecognitionException {
		HeaderContext _localctx = new HeaderContext(_ctx, getState());
		enterRule(_localctx, 4, RULE_header);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(197);
			match(H1);
			setState(198);
			match(HEADLINE_TEXT);
			setState(199);
			match(HEADLINE_END);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ActorContext extends ParserRuleContext {
		public TerminalNode WE() { return getToken(ScenarioParser.WE, 0); }
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public ActorContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_actor; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterActor(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitActor(this);
		}
	}

	public final ActorContext actor() throws RecognitionException {
		ActorContext _localctx = new ActorContext(_ctx, getState());
		enterRule(_localctx, 6, RULE_actor);
		int _la;
		try {
			setState(206);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case WE:
				enterOuterAlt(_localctx, 1);
				{
				setState(201);
				match(WE);
				}
				break;
			case ATTRIBUTE:
			case EVERY:
			case FALSE:
			case LINK:
			case MATCH:
			case MATCHES:
			case SOME:
			case THE:
			case TRUE:
			case TYPE:
			case WHERE:
			case WHOSE:
			case WORD:
				enterOuterAlt(_localctx, 2);
				{
				setState(203);
				_errHandler.sync(this);
				_la = _input.LA(1);
				if (_la==THE) {
					{
					setState(202);
					match(THE);
					}
				}

				setState(205);
				name();
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class SentenceContext extends ParserRuleContext {
		public SimpleSentencesContext simpleSentences() {
			return getRuleContext(SimpleSentencesContext.class,0);
		}
		public SentenceEndContext sentenceEnd() {
			return getRuleContext(SentenceEndContext.class,0);
		}
		public CompoundSentenceContext compoundSentence() {
			return getRuleContext(CompoundSentenceContext.class,0);
		}
		public DiagramSentenceContext diagramSentence() {
			return getRuleContext(DiagramSentenceContext.class,0);
		}
		public SectionSentenceContext sectionSentence() {
			return getRuleContext(SectionSentenceContext.class,0);
		}
		public CommentSentenceContext commentSentence() {
			return getRuleContext(CommentSentenceContext.class,0);
		}
		public SentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_sentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitSentence(this);
		}
	}

	public final SentenceContext sentence() throws RecognitionException {
		SentenceContext _localctx = new SentenceContext(_ctx, getState());
		enterRule(_localctx, 8, RULE_sentence);
		try {
			setState(217);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(208);
				simpleSentences();
				setState(209);
				sentenceEnd();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(211);
				compoundSentence();
				setState(212);
				sentenceEnd();
				}
				break;
			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(214);
				diagramSentence();
				}
				break;
			case 4:
				enterOuterAlt(_localctx, 4);
				{
				setState(215);
				sectionSentence();
				}
				break;
			case 5:
				enterOuterAlt(_localctx, 5);
				{
				setState(216);
				commentSentence();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class SentenceEndContext extends ParserRuleContext {
		public TerminalNode FULL_STOP() { return getToken(ScenarioParser.FULL_STOP, 0); }
		public SentenceEndContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_sentenceEnd; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterSentenceEnd(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitSentenceEnd(this);
		}
	}

	public final SentenceEndContext sentenceEnd() throws RecognitionException {
		SentenceEndContext _localctx = new SentenceEndContext(_ctx, getState());
		enterRule(_localctx, 10, RULE_sentenceEnd);
		try {
			setState(221);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(219);
				match(FULL_STOP);
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(220);
				if (!(_input.LA(-1) == CODE_BLOCK_END)) throw new FailedPredicateException(this, "_input.LA(-1) == CODE_BLOCK_END");
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class SimpleSentenceContext extends ParserRuleContext {
		public ThereSentenceContext thereSentence() {
			return getRuleContext(ThereSentenceContext.class,0);
		}
		public IsSentenceContext isSentence() {
			return getRuleContext(IsSentenceContext.class,0);
		}
		public AreSentenceContext areSentence() {
			return getRuleContext(AreSentenceContext.class,0);
		}
		public HasSentenceContext hasSentence() {
			return getRuleContext(HasSentenceContext.class,0);
		}
		public ExpectSentenceContext expectSentence() {
			return getRuleContext(ExpectSentenceContext.class,0);
		}
		public MatchSentenceContext matchSentence() {
			return getRuleContext(MatchSentenceContext.class,0);
		}
		public CreateSentenceContext createSentence() {
			return getRuleContext(CreateSentenceContext.class,0);
		}
		public CallSentenceContext callSentence() {
			return getRuleContext(CallSentenceContext.class,0);
		}
		public AnswerSentenceContext answerSentence() {
			return getRuleContext(AnswerSentenceContext.class,0);
		}
		public WriteSentenceContext writeSentence() {
			return getRuleContext(WriteSentenceContext.class,0);
		}
		public AddSentenceContext addSentence() {
			return getRuleContext(AddSentenceContext.class,0);
		}
		public RemoveSentenceContext removeSentence() {
			return getRuleContext(RemoveSentenceContext.class,0);
		}
		public SimpleSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_simpleSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterSimpleSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitSimpleSentence(this);
		}
	}

	public final SimpleSentenceContext simpleSentence() throws RecognitionException {
		SimpleSentenceContext _localctx = new SimpleSentenceContext(_ctx, getState());
		enterRule(_localctx, 12, RULE_simpleSentence);
		try {
			setState(235);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(223);
				thereSentence();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(224);
				isSentence();
				}
				break;
			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(225);
				areSentence();
				}
				break;
			case 4:
				enterOuterAlt(_localctx, 4);
				{
				setState(226);
				hasSentence();
				}
				break;
			case 5:
				enterOuterAlt(_localctx, 5);
				{
				setState(227);
				expectSentence();
				}
				break;
			case 6:
				enterOuterAlt(_localctx, 6);
				{
				setState(228);
				matchSentence();
				}
				break;
			case 7:
				enterOuterAlt(_localctx, 7);
				{
				setState(229);
				createSentence();
				}
				break;
			case 8:
				enterOuterAlt(_localctx, 8);
				{
				setState(230);
				callSentence();
				}
				break;
			case 9:
				enterOuterAlt(_localctx, 9);
				{
				setState(231);
				answerSentence();
				}
				break;
			case 10:
				enterOuterAlt(_localctx, 10);
				{
				setState(232);
				writeSentence();
				}
				break;
			case 11:
				enterOuterAlt(_localctx, 11);
				{
				setState(233);
				addSentence();
				}
				break;
			case 12:
				enterOuterAlt(_localctx, 12);
				{
				setState(234);
				removeSentence();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class SimpleSentencesContext extends ParserRuleContext {
		public List simpleSentence() {
			return getRuleContexts(SimpleSentenceContext.class);
		}
		public SimpleSentenceContext simpleSentence(int i) {
			return getRuleContext(SimpleSentenceContext.class,i);
		}
		public List sep() {
			return getRuleContexts(SepContext.class);
		}
		public SepContext sep(int i) {
			return getRuleContext(SepContext.class,i);
		}
		public CompoundSentenceContext compoundSentence() {
			return getRuleContext(CompoundSentenceContext.class,0);
		}
		public SimpleSentencesContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_simpleSentences; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterSimpleSentences(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitSimpleSentences(this);
		}
	}

	public final SimpleSentencesContext simpleSentences() throws RecognitionException {
		SimpleSentencesContext _localctx = new SimpleSentencesContext(_ctx, getState());
		enterRule(_localctx, 14, RULE_simpleSentences);
		try {
			int _alt;
			enterOuterAlt(_localctx, 1);
			{
			setState(237);
			simpleSentence();
			setState(243);
			_errHandler.sync(this);
			_alt = getInterpreter().adaptivePredict(_input,7,_ctx);
			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
				if ( _alt==1 ) {
					{
					{
					setState(238);
					sep();
					setState(239);
					simpleSentence();
					}
					} 
				}
				setState(245);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,7,_ctx);
			}
			setState(249);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) {
			case 1:
				{
				setState(246);
				sep();
				setState(247);
				compoundSentence();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CompoundSentenceContext extends ParserRuleContext {
		public ConditionalSentenceContext conditionalSentence() {
			return getRuleContext(ConditionalSentenceContext.class,0);
		}
		public TakeSentenceContext takeSentence() {
			return getRuleContext(TakeSentenceContext.class,0);
		}
		public CompoundSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_compoundSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCompoundSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCompoundSentence(this);
		}
	}

	public final CompoundSentenceContext compoundSentence() throws RecognitionException {
		CompoundSentenceContext _localctx = new CompoundSentenceContext(_ctx, getState());
		enterRule(_localctx, 16, RULE_compoundSentence);
		try {
			setState(253);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case AS:
				enterOuterAlt(_localctx, 1);
				{
				setState(251);
				conditionalSentence();
				}
				break;
			case ATTRIBUTE:
			case EVERY:
			case FALSE:
			case LINK:
			case MATCH:
			case MATCHES:
			case SOME:
			case THE:
			case TRUE:
			case TYPE:
			case WE:
			case WHERE:
			case WHOSE:
			case WORD:
				enterOuterAlt(_localctx, 2);
				{
				setState(252);
				takeSentence();
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class SectionSentenceContext extends ParserRuleContext {
		public TerminalNode H2() { return getToken(ScenarioParser.H2, 0); }
		public TerminalNode HEADLINE_TEXT() { return getToken(ScenarioParser.HEADLINE_TEXT, 0); }
		public TerminalNode HEADLINE_END() { return getToken(ScenarioParser.HEADLINE_END, 0); }
		public SectionSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_sectionSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterSectionSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitSectionSentence(this);
		}
	}

	public final SectionSentenceContext sectionSentence() throws RecognitionException {
		SectionSentenceContext _localctx = new SectionSentenceContext(_ctx, getState());
		enterRule(_localctx, 18, RULE_sectionSentence);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(255);
			match(H2);
			setState(256);
			match(HEADLINE_TEXT);
			setState(257);
			match(HEADLINE_END);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CommentSentenceContext extends ParserRuleContext {
		public TerminalNode HEADLINE_TEXT() { return getToken(ScenarioParser.HEADLINE_TEXT, 0); }
		public TerminalNode HEADLINE_END() { return getToken(ScenarioParser.HEADLINE_END, 0); }
		public TerminalNode LINE_COMMENT() { return getToken(ScenarioParser.LINE_COMMENT, 0); }
		public TerminalNode BLOCKQUOTE() { return getToken(ScenarioParser.BLOCKQUOTE, 0); }
		public CommentSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_commentSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCommentSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCommentSentence(this);
		}
	}

	public final CommentSentenceContext commentSentence() throws RecognitionException {
		CommentSentenceContext _localctx = new CommentSentenceContext(_ctx, getState());
		enterRule(_localctx, 20, RULE_commentSentence);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(259);
			_la = _input.LA(1);
			if ( !(_la==LINE_COMMENT || _la==BLOCKQUOTE) ) {
			_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(260);
			match(HEADLINE_TEXT);
			setState(261);
			match(HEADLINE_END);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CodeBlockContext extends ParserRuleContext {
		public TerminalNode CODE_BLOCK() { return getToken(ScenarioParser.CODE_BLOCK, 0); }
		public TerminalNode CODE_BLOCK_END() { return getToken(ScenarioParser.CODE_BLOCK_END, 0); }
		public TerminalNode CODE_BLOCK_LANGUAGE() { return getToken(ScenarioParser.CODE_BLOCK_LANGUAGE, 0); }
		public List CODE_BLOCK_LINE() { return getTokens(ScenarioParser.CODE_BLOCK_LINE); }
		public TerminalNode CODE_BLOCK_LINE(int i) {
			return getToken(ScenarioParser.CODE_BLOCK_LINE, i);
		}
		public CodeBlockContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_codeBlock; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCodeBlock(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCodeBlock(this);
		}
	}

	public final CodeBlockContext codeBlock() throws RecognitionException {
		CodeBlockContext _localctx = new CodeBlockContext(_ctx, getState());
		enterRule(_localctx, 22, RULE_codeBlock);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(263);
			match(CODE_BLOCK);
			setState(265);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if (_la==CODE_BLOCK_LANGUAGE) {
				{
				setState(264);
				match(CODE_BLOCK_LANGUAGE);
				}
			}

			setState(270);
			_errHandler.sync(this);
			_la = _input.LA(1);
			while (_la==CODE_BLOCK_LINE) {
				{
				{
				setState(267);
				match(CODE_BLOCK_LINE);
				}
				}
				setState(272);
				_errHandler.sync(this);
				_la = _input.LA(1);
			}
			setState(273);
			match(CODE_BLOCK_END);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ThereSentenceContext extends ParserRuleContext {
		public TerminalNode THERE() { return getToken(ScenarioParser.THERE, 0); }
		public TerminalNode IS() { return getToken(ScenarioParser.IS, 0); }
		public SimpleDescriptorContext simpleDescriptor() {
			return getRuleContext(SimpleDescriptorContext.class,0);
		}
		public TerminalNode ARE() { return getToken(ScenarioParser.ARE, 0); }
		public MultiDescriptorContext multiDescriptor() {
			return getRuleContext(MultiDescriptorContext.class,0);
		}
		public ThereSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_thereSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterThereSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitThereSentence(this);
		}
	}

	public final ThereSentenceContext thereSentence() throws RecognitionException {
		ThereSentenceContext _localctx = new ThereSentenceContext(_ctx, getState());
		enterRule(_localctx, 24, RULE_thereSentence);
		try {
			setState(281);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(275);
				match(THERE);
				setState(276);
				match(IS);
				setState(277);
				simpleDescriptor();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(278);
				match(THERE);
				setState(279);
				match(ARE);
				setState(280);
				multiDescriptor();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class SimpleDescriptorContext extends ParserRuleContext {
		public TypeNameContext typeName() {
			return getRuleContext(TypeNameContext.class,0);
		}
		public TerminalNode A() { return getToken(ScenarioParser.A, 0); }
		public TerminalNode AN() { return getToken(ScenarioParser.AN, 0); }
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public WithClausesContext withClauses() {
			return getRuleContext(WithClausesContext.class,0);
		}
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public SimpleDescriptorContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_simpleDescriptor; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterSimpleDescriptor(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitSimpleDescriptor(this);
		}
	}

	public final SimpleDescriptorContext simpleDescriptor() throws RecognitionException {
		SimpleDescriptorContext _localctx = new SimpleDescriptorContext(_ctx, getState());
		enterRule(_localctx, 26, RULE_simpleDescriptor);
		int _la;
		try {
			setState(297);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case A:
			case AN:
				enterOuterAlt(_localctx, 1);
				{
				setState(283);
				_la = _input.LA(1);
				if ( !(_la==A || _la==AN) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(284);
				typeName();
				setState(286);
				_errHandler.sync(this);
				switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
				case 1:
					{
					setState(285);
					name();
					}
					break;
				}
				setState(289);
				_errHandler.sync(this);
				switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) {
				case 1:
					{
					setState(288);
					withClauses();
					}
					break;
				}
				}
				break;
			case THE:
				enterOuterAlt(_localctx, 2);
				{
				setState(291);
				match(THE);
				setState(292);
				typeName();
				setState(293);
				name();
				setState(295);
				_errHandler.sync(this);
				switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) {
				case 1:
					{
					setState(294);
					withClauses();
					}
					break;
				}
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class MultiDescriptorContext extends ParserRuleContext {
		public TypesNameContext typesName() {
			return getRuleContext(TypesNameContext.class,0);
		}
		public List name() {
			return getRuleContexts(NameContext.class);
		}
		public NameContext name(int i) {
			return getRuleContext(NameContext.class,i);
		}
		public WithClausesContext withClauses() {
			return getRuleContext(WithClausesContext.class,0);
		}
		public List sep() {
			return getRuleContexts(SepContext.class);
		}
		public SepContext sep(int i) {
			return getRuleContext(SepContext.class,i);
		}
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public MultiDescriptorContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_multiDescriptor; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterMultiDescriptor(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitMultiDescriptor(this);
		}
	}

	public final MultiDescriptorContext multiDescriptor() throws RecognitionException {
		MultiDescriptorContext _localctx = new MultiDescriptorContext(_ctx, getState());
		enterRule(_localctx, 28, RULE_multiDescriptor);
		try {
			int _alt;
			setState(326);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case ATTRIBUTE:
			case EVERY:
			case FALSE:
			case LINK:
			case MATCH:
			case MATCHES:
			case SOME:
			case TRUE:
			case TYPE:
			case WHERE:
			case WHOSE:
			case WORD:
				enterOuterAlt(_localctx, 1);
				{
				setState(299);
				typesName();
				setState(308);
				_errHandler.sync(this);
				switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) {
				case 1:
					{
					setState(300);
					name();
					setState(304); 
					_errHandler.sync(this);
					_alt = 1;
					do {
						switch (_alt) {
						case 1:
							{
							{
							setState(301);
							sep();
							setState(302);
							name();
							}
							}
							break;
						default:
							throw new NoViableAltException(this);
						}
						setState(306); 
						_errHandler.sync(this);
						_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
					} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
					}
					break;
				}
				setState(311);
				_errHandler.sync(this);
				switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) {
				case 1:
					{
					setState(310);
					withClauses();
					}
					break;
				}
				}
				break;
			case THE:
				enterOuterAlt(_localctx, 2);
				{
				setState(313);
				match(THE);
				setState(314);
				typesName();
				setState(315);
				name();
				setState(319); 
				_errHandler.sync(this);
				_alt = 1;
				do {
					switch (_alt) {
					case 1:
						{
						{
						setState(316);
						sep();
						setState(317);
						name();
						}
						}
						break;
					default:
						throw new NoViableAltException(this);
					}
					setState(321); 
					_errHandler.sync(this);
					_alt = getInterpreter().adaptivePredict(_input,20,_ctx);
				} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
				setState(324);
				_errHandler.sync(this);
				switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) {
				case 1:
					{
					setState(323);
					withClauses();
					}
					break;
				}
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class TypeNameContext extends ParserRuleContext {
		public SimpleNameContext simpleName() {
			return getRuleContext(SimpleNameContext.class,0);
		}
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public TerminalNode CARD() { return getToken(ScenarioParser.CARD, 0); }
		public TypeNameContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_typeName; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterTypeName(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitTypeName(this);
		}
	}

	public final TypeNameContext typeName() throws RecognitionException {
		TypeNameContext _localctx = new TypeNameContext(_ctx, getState());
		enterRule(_localctx, 30, RULE_typeName);
		try {
			setState(332);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(328);
				simpleName();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(329);
				name();
				setState(330);
				match(CARD);
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class TypesNameContext extends ParserRuleContext {
		public SimpleNameContext simpleName() {
			return getRuleContext(SimpleNameContext.class,0);
		}
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public TerminalNode CARDS() { return getToken(ScenarioParser.CARDS, 0); }
		public TypesNameContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_typesName; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterTypesName(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitTypesName(this);
		}
	}

	public final TypesNameContext typesName() throws RecognitionException {
		TypesNameContext _localctx = new TypesNameContext(_ctx, getState());
		enterRule(_localctx, 32, RULE_typesName);
		try {
			setState(338);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(334);
				simpleName();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(335);
				name();
				setState(336);
				match(CARDS);
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class IsSentenceContext extends ParserRuleContext {
		public IsSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_isSentence; }
	 
		public IsSentenceContext() { }
		public void copyFrom(IsSentenceContext ctx) {
			super.copyFrom(ctx);
		}
	}
	public static class InheritanceIsSentenceContext extends IsSentenceContext {
		public TerminalNode EVERY() { return getToken(ScenarioParser.EVERY, 0); }
		public List typeName() {
			return getRuleContexts(TypeNameContext.class);
		}
		public TypeNameContext typeName(int i) {
			return getRuleContext(TypeNameContext.class,i);
		}
		public TerminalNode IS() { return getToken(ScenarioParser.IS, 0); }
		public TerminalNode A() { return getToken(ScenarioParser.A, 0); }
		public TerminalNode AN() { return getToken(ScenarioParser.AN, 0); }
		public InheritanceIsSentenceContext(IsSentenceContext ctx) { copyFrom(ctx); }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterInheritanceIsSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitInheritanceIsSentence(this);
		}
	}
	public static class SimpleIsSentenceContext extends IsSentenceContext {
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public TerminalNode IS() { return getToken(ScenarioParser.IS, 0); }
		public TypeNameContext typeName() {
			return getRuleContext(TypeNameContext.class,0);
		}
		public TerminalNode A() { return getToken(ScenarioParser.A, 0); }
		public TerminalNode AN() { return getToken(ScenarioParser.AN, 0); }
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public WithClausesContext withClauses() {
			return getRuleContext(WithClausesContext.class,0);
		}
		public SimpleIsSentenceContext(IsSentenceContext ctx) { copyFrom(ctx); }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterSimpleIsSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitSimpleIsSentence(this);
		}
	}

	public final IsSentenceContext isSentence() throws RecognitionException {
		IsSentenceContext _localctx = new IsSentenceContext(_ctx, getState());
		enterRule(_localctx, 34, RULE_isSentence);
		int _la;
		try {
			setState(356);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) {
			case 1:
				_localctx = new InheritanceIsSentenceContext(_localctx);
				enterOuterAlt(_localctx, 1);
				{
				setState(340);
				match(EVERY);
				setState(341);
				typeName();
				setState(342);
				match(IS);
				setState(343);
				_la = _input.LA(1);
				if ( !(_la==A || _la==AN) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(344);
				typeName();
				}
				break;
			case 2:
				_localctx = new SimpleIsSentenceContext(_localctx);
				enterOuterAlt(_localctx, 2);
				{
				setState(347);
				_errHandler.sync(this);
				_la = _input.LA(1);
				if (_la==THE) {
					{
					setState(346);
					match(THE);
					}
				}

				setState(349);
				name();
				setState(350);
				match(IS);
				setState(351);
				_la = _input.LA(1);
				if ( !(_la==A || _la==AN) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(352);
				typeName();
				setState(354);
				_errHandler.sync(this);
				switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) {
				case 1:
					{
					setState(353);
					withClauses();
					}
					break;
				}
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AreSentenceContext extends ParserRuleContext {
		public List name() {
			return getRuleContexts(NameContext.class);
		}
		public NameContext name(int i) {
			return getRuleContext(NameContext.class,i);
		}
		public TerminalNode ARE() { return getToken(ScenarioParser.ARE, 0); }
		public TypesNameContext typesName() {
			return getRuleContext(TypesNameContext.class,0);
		}
		public List sep() {
			return getRuleContexts(SepContext.class);
		}
		public SepContext sep(int i) {
			return getRuleContext(SepContext.class,i);
		}
		public WithClausesContext withClauses() {
			return getRuleContext(WithClausesContext.class,0);
		}
		public AreSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_areSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAreSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAreSentence(this);
		}
	}

	public final AreSentenceContext areSentence() throws RecognitionException {
		AreSentenceContext _localctx = new AreSentenceContext(_ctx, getState());
		enterRule(_localctx, 36, RULE_areSentence);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(358);
			name();
			setState(362); 
			_errHandler.sync(this);
			_la = _input.LA(1);
			do {
				{
				{
				setState(359);
				sep();
				setState(360);
				name();
				}
				}
				setState(364); 
				_errHandler.sync(this);
				_la = _input.LA(1);
			} while ( _la==AND || _la==COMMA );
			setState(366);
			match(ARE);
			setState(367);
			typesName();
			setState(369);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) {
			case 1:
				{
				setState(368);
				withClauses();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class WithClausesContext extends ParserRuleContext {
		public List withClause() {
			return getRuleContexts(WithClauseContext.class);
		}
		public WithClauseContext withClause(int i) {
			return getRuleContext(WithClauseContext.class,i);
		}
		public List sep() {
			return getRuleContexts(SepContext.class);
		}
		public SepContext sep(int i) {
			return getRuleContext(SepContext.class,i);
		}
		public WithClausesContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_withClauses; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterWithClauses(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitWithClauses(this);
		}
	}

	public final WithClausesContext withClauses() throws RecognitionException {
		WithClausesContext _localctx = new WithClausesContext(_ctx, getState());
		enterRule(_localctx, 38, RULE_withClauses);
		try {
			int _alt;
			enterOuterAlt(_localctx, 1);
			{
			setState(371);
			withClause();
			setState(377);
			_errHandler.sync(this);
			_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
				if ( _alt==1 ) {
					{
					{
					setState(372);
					sep();
					setState(373);
					withClause();
					}
					} 
				}
				setState(379);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class WithClauseContext extends ParserRuleContext {
		public TerminalNode WITH() { return getToken(ScenarioParser.WITH, 0); }
		public NamedExprContext namedExpr() {
			return getRuleContext(NamedExprContext.class,0);
		}
		public WithClauseContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_withClause; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterWithClause(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitWithClause(this);
		}
	}

	public final WithClauseContext withClause() throws RecognitionException {
		WithClauseContext _localctx = new WithClauseContext(_ctx, getState());
		enterRule(_localctx, 40, RULE_withClause);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(380);
			match(WITH);
			setState(381);
			namedExpr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class NamedExprContext extends ParserRuleContext {
		public NamedExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_namedExpr; }
	 
		public NamedExprContext() { }
		public void copyFrom(NamedExprContext ctx) {
			super.copyFrom(ctx);
		}
	}
	public static class NamedSimpleContext extends NamedExprContext {
		public SimpleNameContext simpleName() {
			return getRuleContext(SimpleNameContext.class,0);
		}
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public NamedSimpleContext(NamedExprContext ctx) { copyFrom(ctx); }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterNamedSimple(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitNamedSimple(this);
		}
	}
	public static class NamedNumberContext extends NamedExprContext {
		public NumberContext number() {
			return getRuleContext(NumberContext.class,0);
		}
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public NamedNumberContext(NamedExprContext ctx) { copyFrom(ctx); }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterNamedNumber(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitNamedNumber(this);
		}
	}

	public final NamedExprContext namedExpr() throws RecognitionException {
		NamedExprContext _localctx = new NamedExprContext(_ctx, getState());
		enterRule(_localctx, 42, RULE_namedExpr);
		int _la;
		try {
			setState(392);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case ATTRIBUTE:
			case EVERY:
			case FALSE:
			case LINK:
			case MATCH:
			case MATCHES:
			case SOME:
			case THE:
			case TRUE:
			case TYPE:
			case WHERE:
			case WHOSE:
			case WORD:
				_localctx = new NamedSimpleContext(_localctx);
				enterOuterAlt(_localctx, 1);
				{
				setState(384);
				_errHandler.sync(this);
				_la = _input.LA(1);
				if (_la==THE) {
					{
					setState(383);
					match(THE);
					}
				}

				setState(386);
				simpleName();
				setState(387);
				expr();
				}
				break;
			case INTEGER:
			case DECIMAL:
				_localctx = new NamedNumberContext(_localctx);
				enterOuterAlt(_localctx, 2);
				{
				setState(389);
				number();
				setState(390);
				name();
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class BidiNamedExprContext extends ParserRuleContext {
		public SimpleNameContext firstName;
		public SimpleNameContext otherName;
		public TerminalNode AND() { return getToken(ScenarioParser.AND, 0); }
		public List OF() { return getTokens(ScenarioParser.OF); }
		public TerminalNode OF(int i) {
			return getToken(ScenarioParser.OF, i);
		}
		public List simpleName() {
			return getRuleContexts(SimpleNameContext.class);
		}
		public SimpleNameContext simpleName(int i) {
			return getRuleContext(SimpleNameContext.class,i);
		}
		public TerminalNode IS() { return getToken(ScenarioParser.IS, 0); }
		public TerminalNode ARE() { return getToken(ScenarioParser.ARE, 0); }
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public APlaceholderContext aPlaceholder() {
			return getRuleContext(APlaceholderContext.class,0);
		}
		public ManyPlaceholderContext manyPlaceholder() {
			return getRuleContext(ManyPlaceholderContext.class,0);
		}
		public TerminalNode ONE() { return getToken(ScenarioParser.ONE, 0); }
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public BidiNamedExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_bidiNamedExpr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterBidiNamedExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitBidiNamedExpr(this);
		}
	}

	public final BidiNamedExprContext bidiNamedExpr() throws RecognitionException {
		BidiNamedExprContext _localctx = new BidiNamedExprContext(_ctx, getState());
		enterRule(_localctx, 44, RULE_bidiNamedExpr);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(394);
			((BidiNamedExprContext)_localctx).firstName = simpleName();
			setState(395);
			match(AND);
			setState(396);
			_la = _input.LA(1);
			if ( !(_la==ARE || _la==IS) ) {
			_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(399);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if (_la==ONE) {
				{
				setState(397);
				match(ONE);
				setState(398);
				match(OF);
				}
			}

			setState(402);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if (_la==THE) {
				{
				setState(401);
				match(THE);
				}
			}

			setState(404);
			((BidiNamedExprContext)_localctx).otherName = simpleName();
			setState(405);
			match(OF);
			setState(409);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case ALL:
			case ANSWER:
			case ATTRIBUTE:
			case EVERY:
			case FALSE:
			case IT:
			case LINK:
			case MATCH:
			case MATCHES:
			case SOME:
			case THE:
			case TRUE:
			case TYPE:
			case WHERE:
			case WHOSE:
			case CODE_BLOCK:
			case INTEGER:
			case DECIMAL:
			case STRING_LITERAL:
			case WORD:
				{
				setState(406);
				expr();
				}
				break;
			case A:
			case AN:
				{
				setState(407);
				aPlaceholder();
				}
				break;
			case MANY:
				{
				setState(408);
				manyPlaceholder();
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class PlaceholderNamedExprContext extends ParserRuleContext {
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public LikePlaceholderContext likePlaceholder() {
			return getRuleContext(LikePlaceholderContext.class,0);
		}
		public OfTypePlaceholderContext ofTypePlaceholder() {
			return getRuleContext(OfTypePlaceholderContext.class,0);
		}
		public TerminalNode A() { return getToken(ScenarioParser.A, 0); }
		public TerminalNode AN() { return getToken(ScenarioParser.AN, 0); }
		public PlaceholderNamedExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_placeholderNamedExpr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterPlaceholderNamedExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitPlaceholderNamedExpr(this);
		}
	}

	public final PlaceholderNamedExprContext placeholderNamedExpr() throws RecognitionException {
		PlaceholderNamedExprContext _localctx = new PlaceholderNamedExprContext(_ctx, getState());
		enterRule(_localctx, 46, RULE_placeholderNamedExpr);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(412);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if (_la==A || _la==AN) {
				{
				setState(411);
				_la = _input.LA(1);
				if ( !(_la==A || _la==AN) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				}
			}

			setState(414);
			name();
			setState(417);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case LIKE:
				{
				setState(415);
				likePlaceholder();
				}
				break;
			case OF:
				{
				setState(416);
				ofTypePlaceholder();
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class APlaceholderContext extends ParserRuleContext {
		public TypeNameContext typeName() {
			return getRuleContext(TypeNameContext.class,0);
		}
		public TerminalNode A() { return getToken(ScenarioParser.A, 0); }
		public TerminalNode AN() { return getToken(ScenarioParser.AN, 0); }
		public TerminalNode LIKE() { return getToken(ScenarioParser.LIKE, 0); }
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public APlaceholderContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_aPlaceholder; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAPlaceholder(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAPlaceholder(this);
		}
	}

	public final APlaceholderContext aPlaceholder() throws RecognitionException {
		APlaceholderContext _localctx = new APlaceholderContext(_ctx, getState());
		enterRule(_localctx, 48, RULE_aPlaceholder);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(419);
			_la = _input.LA(1);
			if ( !(_la==A || _la==AN) ) {
			_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(420);
			typeName();
			setState(423);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) {
			case 1:
				{
				setState(421);
				match(LIKE);
				setState(422);
				expr();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ManyPlaceholderContext extends ParserRuleContext {
		public TerminalNode MANY() { return getToken(ScenarioParser.MANY, 0); }
		public TypesNameContext typesName() {
			return getRuleContext(TypesNameContext.class,0);
		}
		public TerminalNode LIKE() { return getToken(ScenarioParser.LIKE, 0); }
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public ManyPlaceholderContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_manyPlaceholder; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterManyPlaceholder(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitManyPlaceholder(this);
		}
	}

	public final ManyPlaceholderContext manyPlaceholder() throws RecognitionException {
		ManyPlaceholderContext _localctx = new ManyPlaceholderContext(_ctx, getState());
		enterRule(_localctx, 50, RULE_manyPlaceholder);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(425);
			match(MANY);
			setState(426);
			typesName();
			setState(429);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) {
			case 1:
				{
				setState(427);
				match(LIKE);
				setState(428);
				expr();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class LikePlaceholderContext extends ParserRuleContext {
		public TerminalNode LIKE() { return getToken(ScenarioParser.LIKE, 0); }
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public LikePlaceholderContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_likePlaceholder; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterLikePlaceholder(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitLikePlaceholder(this);
		}
	}

	public final LikePlaceholderContext likePlaceholder() throws RecognitionException {
		LikePlaceholderContext _localctx = new LikePlaceholderContext(_ctx, getState());
		enterRule(_localctx, 52, RULE_likePlaceholder);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(431);
			match(LIKE);
			setState(432);
			expr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class OfTypePlaceholderContext extends ParserRuleContext {
		public TerminalNode OF() { return getToken(ScenarioParser.OF, 0); }
		public TerminalNode TYPE() { return getToken(ScenarioParser.TYPE, 0); }
		public TypeNameContext typeName() {
			return getRuleContext(TypeNameContext.class,0);
		}
		public TerminalNode LIKE() { return getToken(ScenarioParser.LIKE, 0); }
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public OfTypePlaceholderContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_ofTypePlaceholder; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterOfTypePlaceholder(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitOfTypePlaceholder(this);
		}
	}

	public final OfTypePlaceholderContext ofTypePlaceholder() throws RecognitionException {
		OfTypePlaceholderContext _localctx = new OfTypePlaceholderContext(_ctx, getState());
		enterRule(_localctx, 54, RULE_ofTypePlaceholder);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(434);
			match(OF);
			setState(435);
			match(TYPE);
			setState(436);
			typeName();
			setState(439);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) {
			case 1:
				{
				setState(437);
				match(LIKE);
				setState(438);
				expr();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class EveryPlaceholderContext extends ParserRuleContext {
		public TerminalNode EVERY() { return getToken(ScenarioParser.EVERY, 0); }
		public TypeNameContext typeName() {
			return getRuleContext(TypeNameContext.class,0);
		}
		public TerminalNode LIKE() { return getToken(ScenarioParser.LIKE, 0); }
		public NameAccessContext nameAccess() {
			return getRuleContext(NameAccessContext.class,0);
		}
		public EveryPlaceholderContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_everyPlaceholder; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterEveryPlaceholder(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitEveryPlaceholder(this);
		}
	}

	public final EveryPlaceholderContext everyPlaceholder() throws RecognitionException {
		EveryPlaceholderContext _localctx = new EveryPlaceholderContext(_ctx, getState());
		enterRule(_localctx, 56, RULE_everyPlaceholder);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(441);
			match(EVERY);
			setState(442);
			typeName();
			setState(445);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if (_la==LIKE) {
				{
				setState(443);
				match(LIKE);
				setState(444);
				nameAccess();
				}
			}

			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class HasSentenceContext extends ParserRuleContext {
		public HasClausesContext hasClauses() {
			return getRuleContext(HasClausesContext.class,0);
		}
		public EveryPlaceholderContext everyPlaceholder() {
			return getRuleContext(EveryPlaceholderContext.class,0);
		}
		public NameAccessContext nameAccess() {
			return getRuleContext(NameAccessContext.class,0);
		}
		public HasSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_hasSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterHasSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitHasSentence(this);
		}
	}

	public final HasSentenceContext hasSentence() throws RecognitionException {
		HasSentenceContext _localctx = new HasSentenceContext(_ctx, getState());
		enterRule(_localctx, 58, RULE_hasSentence);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(449);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) {
			case 1:
				{
				setState(447);
				everyPlaceholder();
				}
				break;
			case 2:
				{
				setState(448);
				nameAccess();
				}
				break;
			}
			setState(451);
			hasClauses();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class HasClausesContext extends ParserRuleContext {
		public List hasClause() {
			return getRuleContexts(HasClauseContext.class);
		}
		public HasClauseContext hasClause(int i) {
			return getRuleContext(HasClauseContext.class,i);
		}
		public List sep() {
			return getRuleContexts(SepContext.class);
		}
		public SepContext sep(int i) {
			return getRuleContext(SepContext.class,i);
		}
		public HasClausesContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_hasClauses; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterHasClauses(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitHasClauses(this);
		}
	}

	public final HasClausesContext hasClauses() throws RecognitionException {
		HasClausesContext _localctx = new HasClausesContext(_ctx, getState());
		enterRule(_localctx, 60, RULE_hasClauses);
		try {
			int _alt;
			enterOuterAlt(_localctx, 1);
			{
			setState(453);
			hasClause();
			setState(459);
			_errHandler.sync(this);
			_alt = getInterpreter().adaptivePredict(_input,43,_ctx);
			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
				if ( _alt==1 ) {
					{
					{
					setState(454);
					sep();
					setState(455);
					hasClause();
					}
					} 
				}
				setState(461);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,43,_ctx);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class HasClauseContext extends ParserRuleContext {
		public Token verb;
		public TerminalNode HAS() { return getToken(ScenarioParser.HAS, 0); }
		public TerminalNode HAVE() { return getToken(ScenarioParser.HAVE, 0); }
		public NamedExprContext namedExpr() {
			return getRuleContext(NamedExprContext.class,0);
		}
		public BidiNamedExprContext bidiNamedExpr() {
			return getRuleContext(BidiNamedExprContext.class,0);
		}
		public PlaceholderNamedExprContext placeholderNamedExpr() {
			return getRuleContext(PlaceholderNamedExprContext.class,0);
		}
		public HasClauseContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_hasClause; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterHasClause(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitHasClause(this);
		}
	}

	public final HasClauseContext hasClause() throws RecognitionException {
		HasClauseContext _localctx = new HasClauseContext(_ctx, getState());
		enterRule(_localctx, 62, RULE_hasClause);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(462);
			((HasClauseContext)_localctx).verb = _input.LT(1);
			_la = _input.LA(1);
			if ( !(_la==HAS || _la==HAVE) ) {
				((HasClauseContext)_localctx).verb = (Token)_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(466);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) {
			case 1:
				{
				setState(463);
				namedExpr();
				}
				break;
			case 2:
				{
				setState(464);
				bidiNamedExpr();
				}
				break;
			case 3:
				{
				setState(465);
				placeholderNamedExpr();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CreateSentenceContext extends ParserRuleContext {
		public Token verb;
		public ActorContext actor() {
			return getRuleContext(ActorContext.class,0);
		}
		public TerminalNode CREATE() { return getToken(ScenarioParser.CREATE, 0); }
		public TerminalNode CREATES() { return getToken(ScenarioParser.CREATES, 0); }
		public SimpleDescriptorContext simpleDescriptor() {
			return getRuleContext(SimpleDescriptorContext.class,0);
		}
		public MultiDescriptorContext multiDescriptor() {
			return getRuleContext(MultiDescriptorContext.class,0);
		}
		public CreateSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_createSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCreateSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCreateSentence(this);
		}
	}

	public final CreateSentenceContext createSentence() throws RecognitionException {
		CreateSentenceContext _localctx = new CreateSentenceContext(_ctx, getState());
		enterRule(_localctx, 64, RULE_createSentence);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(468);
			actor();
			setState(469);
			((CreateSentenceContext)_localctx).verb = _input.LT(1);
			_la = _input.LA(1);
			if ( !(_la==CREATE || _la==CREATES) ) {
				((CreateSentenceContext)_localctx).verb = (Token)_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(472);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) {
			case 1:
				{
				setState(470);
				simpleDescriptor();
				}
				break;
			case 2:
				{
				setState(471);
				multiDescriptor();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CallSentenceContext extends ParserRuleContext {
		public Token verb;
		public ActorContext actor() {
			return getRuleContext(ActorContext.class,0);
		}
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public TerminalNode CALL() { return getToken(ScenarioParser.CALL, 0); }
		public TerminalNode CALLS() { return getToken(ScenarioParser.CALLS, 0); }
		public TerminalNode ON() { return getToken(ScenarioParser.ON, 0); }
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public WithClausesContext withClauses() {
			return getRuleContext(WithClausesContext.class,0);
		}
		public CallSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_callSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCallSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCallSentence(this);
		}
	}

	public final CallSentenceContext callSentence() throws RecognitionException {
		CallSentenceContext _localctx = new CallSentenceContext(_ctx, getState());
		enterRule(_localctx, 66, RULE_callSentence);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(474);
			actor();
			setState(475);
			((CallSentenceContext)_localctx).verb = _input.LT(1);
			_la = _input.LA(1);
			if ( !(_la==CALL || _la==CALLS) ) {
				((CallSentenceContext)_localctx).verb = (Token)_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(476);
			name();
			setState(479);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) {
			case 1:
				{
				setState(477);
				match(ON);
				setState(478);
				expr();
				}
				break;
			}
			setState(482);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
			case 1:
				{
				setState(481);
				withClauses();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AnswerSentenceContext extends ParserRuleContext {
		public Token verb;
		public ActorContext actor() {
			return getRuleContext(ActorContext.class,0);
		}
		public TerminalNode WITH() { return getToken(ScenarioParser.WITH, 0); }
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public TerminalNode ANSWER() { return getToken(ScenarioParser.ANSWER, 0); }
		public TerminalNode ANSWERS() { return getToken(ScenarioParser.ANSWERS, 0); }
		public TerminalNode INTO() { return getToken(ScenarioParser.INTO, 0); }
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public AnswerSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_answerSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAnswerSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAnswerSentence(this);
		}
	}

	public final AnswerSentenceContext answerSentence() throws RecognitionException {
		AnswerSentenceContext _localctx = new AnswerSentenceContext(_ctx, getState());
		enterRule(_localctx, 68, RULE_answerSentence);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(484);
			actor();
			setState(485);
			((AnswerSentenceContext)_localctx).verb = _input.LT(1);
			_la = _input.LA(1);
			if ( !(_la==ANSWER || _la==ANSWERS) ) {
				((AnswerSentenceContext)_localctx).verb = (Token)_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(486);
			match(WITH);
			setState(487);
			expr();
			setState(493);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) {
			case 1:
				{
				setState(488);
				match(INTO);
				setState(490);
				_errHandler.sync(this);
				_la = _input.LA(1);
				if (_la==THE) {
					{
					setState(489);
					match(THE);
					}
				}

				setState(492);
				name();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class WriteSentenceContext extends ParserRuleContext {
		public Token verb;
		public ActorContext actor() {
			return getRuleContext(ActorContext.class,0);
		}
		public List expr() {
			return getRuleContexts(ExprContext.class);
		}
		public ExprContext expr(int i) {
			return getRuleContext(ExprContext.class,i);
		}
		public TerminalNode INTO() { return getToken(ScenarioParser.INTO, 0); }
		public TerminalNode WRITE() { return getToken(ScenarioParser.WRITE, 0); }
		public TerminalNode WRITES() { return getToken(ScenarioParser.WRITES, 0); }
		public WriteSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_writeSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterWriteSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitWriteSentence(this);
		}
	}

	public final WriteSentenceContext writeSentence() throws RecognitionException {
		WriteSentenceContext _localctx = new WriteSentenceContext(_ctx, getState());
		enterRule(_localctx, 70, RULE_writeSentence);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(495);
			actor();
			setState(496);
			((WriteSentenceContext)_localctx).verb = _input.LT(1);
			_la = _input.LA(1);
			if ( !(_la==WRITE || _la==WRITES) ) {
				((WriteSentenceContext)_localctx).verb = (Token)_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(497);
			expr();
			setState(498);
			match(INTO);
			setState(499);
			expr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AddSentenceContext extends ParserRuleContext {
		public Token verb;
		public ActorContext actor() {
			return getRuleContext(ActorContext.class,0);
		}
		public List expr() {
			return getRuleContexts(ExprContext.class);
		}
		public ExprContext expr(int i) {
			return getRuleContext(ExprContext.class,i);
		}
		public TerminalNode TO() { return getToken(ScenarioParser.TO, 0); }
		public TerminalNode ADD() { return getToken(ScenarioParser.ADD, 0); }
		public TerminalNode ADDS() { return getToken(ScenarioParser.ADDS, 0); }
		public AddSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_addSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAddSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAddSentence(this);
		}
	}

	public final AddSentenceContext addSentence() throws RecognitionException {
		AddSentenceContext _localctx = new AddSentenceContext(_ctx, getState());
		enterRule(_localctx, 72, RULE_addSentence);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(501);
			actor();
			setState(502);
			((AddSentenceContext)_localctx).verb = _input.LT(1);
			_la = _input.LA(1);
			if ( !(_la==ADD || _la==ADDS) ) {
				((AddSentenceContext)_localctx).verb = (Token)_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(503);
			expr();
			setState(504);
			match(TO);
			setState(505);
			expr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class RemoveSentenceContext extends ParserRuleContext {
		public Token verb;
		public ActorContext actor() {
			return getRuleContext(ActorContext.class,0);
		}
		public List expr() {
			return getRuleContexts(ExprContext.class);
		}
		public ExprContext expr(int i) {
			return getRuleContext(ExprContext.class,i);
		}
		public TerminalNode FROM() { return getToken(ScenarioParser.FROM, 0); }
		public TerminalNode REMOVE() { return getToken(ScenarioParser.REMOVE, 0); }
		public TerminalNode REMOVES() { return getToken(ScenarioParser.REMOVES, 0); }
		public RemoveSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_removeSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterRemoveSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitRemoveSentence(this);
		}
	}

	public final RemoveSentenceContext removeSentence() throws RecognitionException {
		RemoveSentenceContext _localctx = new RemoveSentenceContext(_ctx, getState());
		enterRule(_localctx, 74, RULE_removeSentence);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(507);
			actor();
			setState(508);
			((RemoveSentenceContext)_localctx).verb = _input.LT(1);
			_la = _input.LA(1);
			if ( !(_la==REMOVE || _la==REMOVES) ) {
				((RemoveSentenceContext)_localctx).verb = (Token)_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(509);
			expr();
			setState(510);
			match(FROM);
			setState(511);
			expr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ConditionalSentenceContext extends ParserRuleContext {
		public TerminalNode AS() { return getToken(ScenarioParser.AS, 0); }
		public CondExprContext condExpr() {
			return getRuleContext(CondExprContext.class,0);
		}
		public TerminalNode COMMA() { return getToken(ScenarioParser.COMMA, 0); }
		public CompoundSentenceBodyContext compoundSentenceBody() {
			return getRuleContext(CompoundSentenceBodyContext.class,0);
		}
		public ConditionalSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_conditionalSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterConditionalSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitConditionalSentence(this);
		}
	}

	public final ConditionalSentenceContext conditionalSentence() throws RecognitionException {
		ConditionalSentenceContext _localctx = new ConditionalSentenceContext(_ctx, getState());
		enterRule(_localctx, 76, RULE_conditionalSentence);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(513);
			match(AS);
			setState(514);
			condExpr();
			setState(515);
			match(COMMA);
			setState(516);
			compoundSentenceBody();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class TakeSentenceContext extends ParserRuleContext {
		public Token verb;
		public ExprContext example;
		public SimpleNameContext simpleVarName;
		public ExprContext source;
		public ActorContext actor() {
			return getRuleContext(ActorContext.class,0);
		}
		public TerminalNode FROM() { return getToken(ScenarioParser.FROM, 0); }
		public TerminalNode AND() { return getToken(ScenarioParser.AND, 0); }
		public CompoundSentenceBodyContext compoundSentenceBody() {
			return getRuleContext(CompoundSentenceBodyContext.class,0);
		}
		public List expr() {
			return getRuleContexts(ExprContext.class);
		}
		public ExprContext expr(int i) {
			return getRuleContext(ExprContext.class,i);
		}
		public TerminalNode TAKE() { return getToken(ScenarioParser.TAKE, 0); }
		public TerminalNode TAKES() { return getToken(ScenarioParser.TAKES, 0); }
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public TerminalNode A() { return getToken(ScenarioParser.A, 0); }
		public TerminalNode AN() { return getToken(ScenarioParser.AN, 0); }
		public TerminalNode COMMA() { return getToken(ScenarioParser.COMMA, 0); }
		public TerminalNode LIKE() { return getToken(ScenarioParser.LIKE, 0); }
		public SimpleNameContext simpleName() {
			return getRuleContext(SimpleNameContext.class,0);
		}
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public TakeSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_takeSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterTakeSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitTakeSentence(this);
		}
	}

	public final TakeSentenceContext takeSentence() throws RecognitionException {
		TakeSentenceContext _localctx = new TakeSentenceContext(_ctx, getState());
		enterRule(_localctx, 78, RULE_takeSentence);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(518);
			actor();
			setState(519);
			((TakeSentenceContext)_localctx).verb = _input.LT(1);
			_la = _input.LA(1);
			if ( !(_la==TAKE || _la==TAKES) ) {
				((TakeSentenceContext)_localctx).verb = (Token)_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(533);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case A:
			case AN:
				{
				setState(520);
				_la = _input.LA(1);
				if ( !(_la==A || _la==AN) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(521);
				name();
				setState(524);
				_errHandler.sync(this);
				_la = _input.LA(1);
				if (_la==LIKE) {
					{
					setState(522);
					match(LIKE);
					setState(523);
					((TakeSentenceContext)_localctx).example = expr();
					}
				}

				}
				break;
			case ALL:
			case ANSWER:
			case ATTRIBUTE:
			case EVERY:
			case FALSE:
			case IT:
			case LINK:
			case MATCH:
			case MATCHES:
			case SOME:
			case THE:
			case TRUE:
			case TYPE:
			case WHERE:
			case WHOSE:
			case CODE_BLOCK:
			case INTEGER:
			case DECIMAL:
			case STRING_LITERAL:
			case WORD:
				{
				setState(530);
				_errHandler.sync(this);
				switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
				case 1:
					{
					setState(527);
					_errHandler.sync(this);
					_la = _input.LA(1);
					if (_la==THE) {
						{
						setState(526);
						match(THE);
						}
					}

					setState(529);
					((TakeSentenceContext)_localctx).simpleVarName = simpleName();
					}
					break;
				}
				setState(532);
				((TakeSentenceContext)_localctx).example = expr();
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
			setState(535);
			match(FROM);
			setState(536);
			((TakeSentenceContext)_localctx).source = expr();
			setState(538);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if (_la==COMMA) {
				{
				setState(537);
				match(COMMA);
				}
			}

			setState(540);
			match(AND);
			setState(541);
			compoundSentenceBody();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CompoundSentenceBodyContext extends ParserRuleContext {
		public CompoundSentenceContext compoundSentence() {
			return getRuleContext(CompoundSentenceContext.class,0);
		}
		public SimpleSentencesContext simpleSentences() {
			return getRuleContext(SimpleSentencesContext.class,0);
		}
		public CompoundSentenceBodyContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_compoundSentenceBody; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCompoundSentenceBody(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCompoundSentenceBody(this);
		}
	}

	public final CompoundSentenceBodyContext compoundSentenceBody() throws RecognitionException {
		CompoundSentenceBodyContext _localctx = new CompoundSentenceBodyContext(_ctx, getState());
		enterRule(_localctx, 80, RULE_compoundSentenceBody);
		try {
			setState(545);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(543);
				compoundSentence();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(544);
				simpleSentences();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ExpectSentenceContext extends ParserRuleContext {
		public TerminalNode WE() { return getToken(ScenarioParser.WE, 0); }
		public TerminalNode EXPECT() { return getToken(ScenarioParser.EXPECT, 0); }
		public ThatClausesContext thatClauses() {
			return getRuleContext(ThatClausesContext.class,0);
		}
		public ExpectSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_expectSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterExpectSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitExpectSentence(this);
		}
	}

	public final ExpectSentenceContext expectSentence() throws RecognitionException {
		ExpectSentenceContext _localctx = new ExpectSentenceContext(_ctx, getState());
		enterRule(_localctx, 82, RULE_expectSentence);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(547);
			match(WE);
			setState(548);
			match(EXPECT);
			setState(549);
			thatClauses();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ThatClausesContext extends ParserRuleContext {
		public List thatClause() {
			return getRuleContexts(ThatClauseContext.class);
		}
		public ThatClauseContext thatClause(int i) {
			return getRuleContext(ThatClauseContext.class,i);
		}
		public List sep() {
			return getRuleContexts(SepContext.class);
		}
		public SepContext sep(int i) {
			return getRuleContext(SepContext.class,i);
		}
		public ThatClausesContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_thatClauses; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterThatClauses(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitThatClauses(this);
		}
	}

	public final ThatClausesContext thatClauses() throws RecognitionException {
		ThatClausesContext _localctx = new ThatClausesContext(_ctx, getState());
		enterRule(_localctx, 84, RULE_thatClauses);
		try {
			int _alt;
			enterOuterAlt(_localctx, 1);
			{
			setState(551);
			thatClause();
			setState(557);
			_errHandler.sync(this);
			_alt = getInterpreter().adaptivePredict(_input,56,_ctx);
			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
				if ( _alt==1 ) {
					{
					{
					setState(552);
					sep();
					setState(553);
					thatClause();
					}
					} 
				}
				setState(559);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,56,_ctx);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ThatClauseContext extends ParserRuleContext {
		public TerminalNode THAT() { return getToken(ScenarioParser.THAT, 0); }
		public CondExprContext condExpr() {
			return getRuleContext(CondExprContext.class,0);
		}
		public ThatClauseContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_thatClause; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterThatClause(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitThatClause(this);
		}
	}

	public final ThatClauseContext thatClause() throws RecognitionException {
		ThatClauseContext _localctx = new ThatClauseContext(_ctx, getState());
		enterRule(_localctx, 86, RULE_thatClause);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(560);
			match(THAT);
			setState(561);
			condExpr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class DiagramSentenceContext extends ParserRuleContext {
		public Token fileName;
		public TerminalNode IMG_START() { return getToken(ScenarioParser.IMG_START, 0); }
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public TerminalNode IMG_SEP() { return getToken(ScenarioParser.IMG_SEP, 0); }
		public TerminalNode IMG_END() { return getToken(ScenarioParser.IMG_END, 0); }
		public TerminalNode FILE_NAME() { return getToken(ScenarioParser.FILE_NAME, 0); }
		public DiagramSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_diagramSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterDiagramSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitDiagramSentence(this);
		}
	}

	public final DiagramSentenceContext diagramSentence() throws RecognitionException {
		DiagramSentenceContext _localctx = new DiagramSentenceContext(_ctx, getState());
		enterRule(_localctx, 88, RULE_diagramSentence);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(563);
			match(IMG_START);
			setState(564);
			expr();
			setState(565);
			match(IMG_SEP);
			setState(566);
			((DiagramSentenceContext)_localctx).fileName = match(FILE_NAME);
			setState(567);
			match(IMG_END);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class MatchSentenceContext extends ParserRuleContext {
		public Token verb;
		public ActorContext actor() {
			return getRuleContext(ActorContext.class,0);
		}
		public PatternObjectsContext patternObjects() {
			return getRuleContext(PatternObjectsContext.class,0);
		}
		public TerminalNode MATCH() { return getToken(ScenarioParser.MATCH, 0); }
		public TerminalNode MATCHES() { return getToken(ScenarioParser.MATCHES, 0); }
		public TerminalNode ON() { return getToken(ScenarioParser.ON, 0); }
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public MatchSentenceContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_matchSentence; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterMatchSentence(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitMatchSentence(this);
		}
	}

	public final MatchSentenceContext matchSentence() throws RecognitionException {
		MatchSentenceContext _localctx = new MatchSentenceContext(_ctx, getState());
		enterRule(_localctx, 90, RULE_matchSentence);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(569);
			actor();
			setState(570);
			((MatchSentenceContext)_localctx).verb = _input.LT(1);
			_la = _input.LA(1);
			if ( !(_la==MATCH || _la==MATCHES) ) {
				((MatchSentenceContext)_localctx).verb = (Token)_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(573);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if (_la==ON) {
				{
				setState(571);
				match(ON);
				setState(572);
				expr();
				}
			}

			setState(575);
			patternObjects();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class PatternObjectsContext extends ParserRuleContext {
		public List patternObject() {
			return getRuleContexts(PatternObjectContext.class);
		}
		public PatternObjectContext patternObject(int i) {
			return getRuleContext(PatternObjectContext.class,i);
		}
		public List sep() {
			return getRuleContexts(SepContext.class);
		}
		public SepContext sep(int i) {
			return getRuleContext(SepContext.class,i);
		}
		public TerminalNode COLON() { return getToken(ScenarioParser.COLON, 0); }
		public List BULLET() { return getTokens(ScenarioParser.BULLET); }
		public TerminalNode BULLET(int i) {
			return getToken(ScenarioParser.BULLET, i);
		}
		public List NUMBERED() { return getTokens(ScenarioParser.NUMBERED); }
		public TerminalNode NUMBERED(int i) {
			return getToken(ScenarioParser.NUMBERED, i);
		}
		public PatternObjectsContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_patternObjects; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterPatternObjects(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitPatternObjects(this);
		}
	}

	public final PatternObjectsContext patternObjects() throws RecognitionException {
		PatternObjectsContext _localctx = new PatternObjectsContext(_ctx, getState());
		enterRule(_localctx, 92, RULE_patternObjects);
		int _la;
		try {
			int _alt;
			setState(593);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case ALL:
			case SOME:
				enterOuterAlt(_localctx, 1);
				{
				setState(577);
				patternObject();
				setState(583);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,58,_ctx);
				while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
					if ( _alt==1 ) {
						{
						{
						setState(578);
						sep();
						setState(579);
						patternObject();
						}
						} 
					}
					setState(585);
					_errHandler.sync(this);
					_alt = getInterpreter().adaptivePredict(_input,58,_ctx);
				}
				}
				break;
			case COLON:
				enterOuterAlt(_localctx, 2);
				{
				setState(586);
				match(COLON);
				setState(589); 
				_errHandler.sync(this);
				_alt = 1;
				do {
					switch (_alt) {
					case 1:
						{
						{
						setState(587);
						_la = _input.LA(1);
						if ( !(_la==BULLET || _la==NUMBERED) ) {
						_errHandler.recoverInline(this);
						}
						else {
							if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
							_errHandler.reportMatch(this);
							consume();
						}
						setState(588);
						patternObject();
						}
						}
						break;
					default:
						throw new NoViableAltException(this);
					}
					setState(591); 
					_errHandler.sync(this);
					_alt = getInterpreter().adaptivePredict(_input,59,_ctx);
				} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class PatternObjectContext extends ParserRuleContext {
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public TerminalNode SOME() { return getToken(ScenarioParser.SOME, 0); }
		public TypeNameContext typeName() {
			return getRuleContext(TypeNameContext.class,0);
		}
		public TerminalNode ALL() { return getToken(ScenarioParser.ALL, 0); }
		public TypesNameContext typesName() {
			return getRuleContext(TypesNameContext.class,0);
		}
		public ConstraintsContext constraints() {
			return getRuleContext(ConstraintsContext.class,0);
		}
		public PatternObjectContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_patternObject; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterPatternObject(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitPatternObject(this);
		}
	}

	public final PatternObjectContext patternObject() throws RecognitionException {
		PatternObjectContext _localctx = new PatternObjectContext(_ctx, getState());
		enterRule(_localctx, 94, RULE_patternObject);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(599);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case SOME:
				{
				setState(595);
				match(SOME);
				setState(596);
				typeName();
				}
				break;
			case ALL:
				{
				setState(597);
				match(ALL);
				setState(598);
				typesName();
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
			setState(601);
			name();
			setState(603);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) {
			case 1:
				{
				setState(602);
				constraints();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ConstraintsContext extends ParserRuleContext {
		public List constraint() {
			return getRuleContexts(ConstraintContext.class);
		}
		public ConstraintContext constraint(int i) {
			return getRuleContext(ConstraintContext.class,i);
		}
		public List sep() {
			return getRuleContexts(SepContext.class);
		}
		public SepContext sep(int i) {
			return getRuleContext(SepContext.class,i);
		}
		public ConstraintsContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_constraints; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterConstraints(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitConstraints(this);
		}
	}

	public final ConstraintsContext constraints() throws RecognitionException {
		ConstraintsContext _localctx = new ConstraintsContext(_ctx, getState());
		enterRule(_localctx, 96, RULE_constraints);
		try {
			int _alt;
			enterOuterAlt(_localctx, 1);
			{
			setState(605);
			constraint();
			setState(611);
			_errHandler.sync(this);
			_alt = getInterpreter().adaptivePredict(_input,63,_ctx);
			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
				if ( _alt==1 ) {
					{
					{
					setState(606);
					sep();
					setState(607);
					constraint();
					}
					} 
				}
				setState(613);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,63,_ctx);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ConstraintContext extends ParserRuleContext {
		public LinkConstraintContext linkConstraint() {
			return getRuleContext(LinkConstraintContext.class,0);
		}
		public AttributeEqualityConstraintContext attributeEqualityConstraint() {
			return getRuleContext(AttributeEqualityConstraintContext.class,0);
		}
		public AttributeConditionalConstraintContext attributeConditionalConstraint() {
			return getRuleContext(AttributeConditionalConstraintContext.class,0);
		}
		public MatchConstraintContext matchConstraint() {
			return getRuleContext(MatchConstraintContext.class,0);
		}
		public ConstraintContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_constraint; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterConstraint(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitConstraint(this);
		}
	}

	public final ConstraintContext constraint() throws RecognitionException {
		ConstraintContext _localctx = new ConstraintContext(_ctx, getState());
		enterRule(_localctx, 98, RULE_constraint);
		try {
			setState(618);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(614);
				linkConstraint();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(615);
				attributeEqualityConstraint();
				}
				break;
			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(616);
				attributeConditionalConstraint();
				}
				break;
			case 4:
				enterOuterAlt(_localctx, 4);
				{
				setState(617);
				matchConstraint();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class LinkConstraintContext extends ParserRuleContext {
		public TerminalNode WITH() { return getToken(ScenarioParser.WITH, 0); }
		public TerminalNode SOME() { return getToken(ScenarioParser.SOME, 0); }
		public TerminalNode LINK() { return getToken(ScenarioParser.LINK, 0); }
		public TerminalNode TO() { return getToken(ScenarioParser.TO, 0); }
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public LinkConstraintContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_linkConstraint; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterLinkConstraint(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitLinkConstraint(this);
		}
	}

	public final LinkConstraintContext linkConstraint() throws RecognitionException {
		LinkConstraintContext _localctx = new LinkConstraintContext(_ctx, getState());
		enterRule(_localctx, 100, RULE_linkConstraint);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(620);
			match(WITH);
			setState(621);
			match(SOME);
			setState(622);
			match(LINK);
			setState(623);
			match(TO);
			setState(624);
			name();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AttributeEqualityConstraintContext extends ParserRuleContext {
		public TerminalNode WITH() { return getToken(ScenarioParser.WITH, 0); }
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public NumberContext number() {
			return getRuleContext(NumberContext.class,0);
		}
		public AttributeEqualityConstraintContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_attributeEqualityConstraint; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAttributeEqualityConstraint(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAttributeEqualityConstraint(this);
		}
	}

	public final AttributeEqualityConstraintContext attributeEqualityConstraint() throws RecognitionException {
		AttributeEqualityConstraintContext _localctx = new AttributeEqualityConstraintContext(_ctx, getState());
		enterRule(_localctx, 102, RULE_attributeEqualityConstraint);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(626);
			match(WITH);
			setState(633);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case ATTRIBUTE:
			case EVERY:
			case FALSE:
			case LINK:
			case MATCH:
			case MATCHES:
			case SOME:
			case TRUE:
			case TYPE:
			case WHERE:
			case WHOSE:
			case WORD:
				{
				setState(627);
				name();
				setState(628);
				expr();
				}
				break;
			case INTEGER:
			case DECIMAL:
				{
				setState(630);
				number();
				setState(631);
				name();
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AttributeConditionalConstraintContext extends ParserRuleContext {
		public ExprContext rhs;
		public CondOpContext condOp() {
			return getRuleContext(CondOpContext.class,0);
		}
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public TerminalNode WHERE() { return getToken(ScenarioParser.WHERE, 0); }
		public TerminalNode SOME() { return getToken(ScenarioParser.SOME, 0); }
		public TerminalNode ATTRIBUTE() { return getToken(ScenarioParser.ATTRIBUTE, 0); }
		public TerminalNode WHOSE() { return getToken(ScenarioParser.WHOSE, 0); }
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public AttributeConditionalConstraintContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_attributeConditionalConstraint; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAttributeConditionalConstraint(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAttributeConditionalConstraint(this);
		}
	}

	public final AttributeConditionalConstraintContext attributeConditionalConstraint() throws RecognitionException {
		AttributeConditionalConstraintContext _localctx = new AttributeConditionalConstraintContext(_ctx, getState());
		enterRule(_localctx, 104, RULE_attributeConditionalConstraint);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(640);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case WHERE:
				{
				setState(635);
				match(WHERE);
				setState(636);
				match(SOME);
				setState(637);
				match(ATTRIBUTE);
				}
				break;
			case WHOSE:
				{
				setState(638);
				match(WHOSE);
				setState(639);
				name();
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
			setState(642);
			condOp();
			setState(643);
			((AttributeConditionalConstraintContext)_localctx).rhs = expr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AttributePredicateConstraintContext extends ParserRuleContext {
		public PredOpContext predOp() {
			return getRuleContext(PredOpContext.class,0);
		}
		public TerminalNode WHERE() { return getToken(ScenarioParser.WHERE, 0); }
		public TerminalNode SOME() { return getToken(ScenarioParser.SOME, 0); }
		public TerminalNode ATTRIBUTE() { return getToken(ScenarioParser.ATTRIBUTE, 0); }
		public TerminalNode WHOSE() { return getToken(ScenarioParser.WHOSE, 0); }
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public AttributePredicateConstraintContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_attributePredicateConstraint; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAttributePredicateConstraint(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAttributePredicateConstraint(this);
		}
	}

	public final AttributePredicateConstraintContext attributePredicateConstraint() throws RecognitionException {
		AttributePredicateConstraintContext _localctx = new AttributePredicateConstraintContext(_ctx, getState());
		enterRule(_localctx, 106, RULE_attributePredicateConstraint);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(650);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case WHERE:
				{
				setState(645);
				match(WHERE);
				setState(646);
				match(SOME);
				setState(647);
				match(ATTRIBUTE);
				}
				break;
			case WHOSE:
				{
				setState(648);
				match(WHOSE);
				setState(649);
				name();
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
			setState(652);
			predOp();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class MatchConstraintContext extends ParserRuleContext {
		public TerminalNode WHERE() { return getToken(ScenarioParser.WHERE, 0); }
		public CondExprContext condExpr() {
			return getRuleContext(CondExprContext.class,0);
		}
		public MatchConstraintContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_matchConstraint; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterMatchConstraint(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitMatchConstraint(this);
		}
	}

	public final MatchConstraintContext matchConstraint() throws RecognitionException {
		MatchConstraintContext _localctx = new MatchConstraintContext(_ctx, getState());
		enterRule(_localctx, 108, RULE_matchConstraint);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(654);
			match(WHERE);
			setState(655);
			condExpr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ExprContext extends ParserRuleContext {
		public AccessContext access() {
			return getRuleContext(AccessContext.class,0);
		}
		public CollectionContext collection() {
			return getRuleContext(CollectionContext.class,0);
		}
		public ExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_expr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitExpr(this);
		}
	}

	public final ExprContext expr() throws RecognitionException {
		ExprContext _localctx = new ExprContext(_ctx, getState());
		enterRule(_localctx, 110, RULE_expr);
		try {
			setState(659);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(657);
				access();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(658);
				collection();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class PrimaryContext extends ParserRuleContext {
		public NumberContext number() {
			return getRuleContext(NumberContext.class,0);
		}
		public BooleanLiteralContext booleanLiteral() {
			return getRuleContext(BooleanLiteralContext.class,0);
		}
		public StringLiteralContext stringLiteral() {
			return getRuleContext(StringLiteralContext.class,0);
		}
		public CodeBlockContext codeBlock() {
			return getRuleContext(CodeBlockContext.class,0);
		}
		public ItContext it() {
			return getRuleContext(ItContext.class,0);
		}
		public AnswerContext answer() {
			return getRuleContext(AnswerContext.class,0);
		}
		public NameAccessContext nameAccess() {
			return getRuleContext(NameAccessContext.class,0);
		}
		public PrimaryContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_primary; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterPrimary(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitPrimary(this);
		}
	}

	public final PrimaryContext primary() throws RecognitionException {
		PrimaryContext _localctx = new PrimaryContext(_ctx, getState());
		enterRule(_localctx, 112, RULE_primary);
		try {
			setState(668);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(661);
				number();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(662);
				booleanLiteral();
				}
				break;
			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(663);
				stringLiteral();
				}
				break;
			case 4:
				enterOuterAlt(_localctx, 4);
				{
				setState(664);
				codeBlock();
				}
				break;
			case 5:
				enterOuterAlt(_localctx, 5);
				{
				setState(665);
				it();
				}
				break;
			case 6:
				enterOuterAlt(_localctx, 6);
				{
				setState(666);
				answer();
				}
				break;
			case 7:
				enterOuterAlt(_localctx, 7);
				{
				setState(667);
				nameAccess();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class PrimaryExprContext extends ParserRuleContext {
		public PrimaryContext primary() {
			return getRuleContext(PrimaryContext.class,0);
		}
		public PrimaryExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_primaryExpr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterPrimaryExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitPrimaryExpr(this);
		}
	}

	public final PrimaryExprContext primaryExpr() throws RecognitionException {
		PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, getState());
		enterRule(_localctx, 114, RULE_primaryExpr);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(670);
			primary();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class NumberContext extends ParserRuleContext {
		public TerminalNode DECIMAL() { return getToken(ScenarioParser.DECIMAL, 0); }
		public TerminalNode INTEGER() { return getToken(ScenarioParser.INTEGER, 0); }
		public NumberContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_number; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterNumber(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitNumber(this);
		}
	}

	public final NumberContext number() throws RecognitionException {
		NumberContext _localctx = new NumberContext(_ctx, getState());
		enterRule(_localctx, 116, RULE_number);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(672);
			_la = _input.LA(1);
			if ( !(_la==INTEGER || _la==DECIMAL) ) {
			_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class BooleanLiteralContext extends ParserRuleContext {
		public TerminalNode TRUE() { return getToken(ScenarioParser.TRUE, 0); }
		public TerminalNode FALSE() { return getToken(ScenarioParser.FALSE, 0); }
		public BooleanLiteralContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_booleanLiteral; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterBooleanLiteral(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitBooleanLiteral(this);
		}
	}

	public final BooleanLiteralContext booleanLiteral() throws RecognitionException {
		BooleanLiteralContext _localctx = new BooleanLiteralContext(_ctx, getState());
		enterRule(_localctx, 118, RULE_booleanLiteral);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(674);
			_la = _input.LA(1);
			if ( !(_la==FALSE || _la==TRUE) ) {
			_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class StringLiteralContext extends ParserRuleContext {
		public TerminalNode STRING_LITERAL() { return getToken(ScenarioParser.STRING_LITERAL, 0); }
		public StringLiteralContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_stringLiteral; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterStringLiteral(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitStringLiteral(this);
		}
	}

	public final StringLiteralContext stringLiteral() throws RecognitionException {
		StringLiteralContext _localctx = new StringLiteralContext(_ctx, getState());
		enterRule(_localctx, 120, RULE_stringLiteral);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(676);
			match(STRING_LITERAL);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ItContext extends ParserRuleContext {
		public TerminalNode IT() { return getToken(ScenarioParser.IT, 0); }
		public ItContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_it; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterIt(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitIt(this);
		}
	}

	public final ItContext it() throws RecognitionException {
		ItContext _localctx = new ItContext(_ctx, getState());
		enterRule(_localctx, 122, RULE_it);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(678);
			match(IT);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AnswerContext extends ParserRuleContext {
		public TerminalNode ANSWER() { return getToken(ScenarioParser.ANSWER, 0); }
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public AnswerContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_answer; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAnswer(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAnswer(this);
		}
	}

	public final AnswerContext answer() throws RecognitionException {
		AnswerContext _localctx = new AnswerContext(_ctx, getState());
		enterRule(_localctx, 124, RULE_answer);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(681);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if (_la==THE) {
				{
				setState(680);
				match(THE);
				}
			}

			setState(683);
			match(ANSWER);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class SimpleNameContext extends ParserRuleContext {
		public IdentifierContext identifier() {
			return getRuleContext(IdentifierContext.class,0);
		}
		public SimpleNameContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_simpleName; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterSimpleName(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitSimpleName(this);
		}
	}

	public final SimpleNameContext simpleName() throws RecognitionException {
		SimpleNameContext _localctx = new SimpleNameContext(_ctx, getState());
		enterRule(_localctx, 126, RULE_simpleName);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(685);
			identifier();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class NameContext extends ParserRuleContext {
		public List identifier() {
			return getRuleContexts(IdentifierContext.class);
		}
		public IdentifierContext identifier(int i) {
			return getRuleContext(IdentifierContext.class,i);
		}
		public List INTEGER() { return getTokens(ScenarioParser.INTEGER); }
		public TerminalNode INTEGER(int i) {
			return getToken(ScenarioParser.INTEGER, i);
		}
		public NameContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_name; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterName(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitName(this);
		}
	}

	public final NameContext name() throws RecognitionException {
		NameContext _localctx = new NameContext(_ctx, getState());
		enterRule(_localctx, 128, RULE_name);
		try {
			int _alt;
			enterOuterAlt(_localctx, 1);
			{
			setState(687);
			identifier();
			setState(692);
			_errHandler.sync(this);
			_alt = getInterpreter().adaptivePredict(_input,72,_ctx);
			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
				if ( _alt==1 ) {
					{
					setState(690);
					_errHandler.sync(this);
					switch (_input.LA(1)) {
					case ATTRIBUTE:
					case EVERY:
					case FALSE:
					case LINK:
					case MATCH:
					case MATCHES:
					case SOME:
					case TRUE:
					case TYPE:
					case WHERE:
					case WHOSE:
					case WORD:
						{
						setState(688);
						identifier();
						}
						break;
					case INTEGER:
						{
						setState(689);
						match(INTEGER);
						}
						break;
					default:
						throw new NoViableAltException(this);
					}
					} 
				}
				setState(694);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,72,_ctx);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class IdentifierContext extends ParserRuleContext {
		public TerminalNode WORD() { return getToken(ScenarioParser.WORD, 0); }
		public TerminalNode ATTRIBUTE() { return getToken(ScenarioParser.ATTRIBUTE, 0); }
		public TerminalNode LINK() { return getToken(ScenarioParser.LINK, 0); }
		public TerminalNode MATCH() { return getToken(ScenarioParser.MATCH, 0); }
		public TerminalNode MATCHES() { return getToken(ScenarioParser.MATCHES, 0); }
		public TerminalNode SOME() { return getToken(ScenarioParser.SOME, 0); }
		public TerminalNode WHERE() { return getToken(ScenarioParser.WHERE, 0); }
		public TerminalNode WHOSE() { return getToken(ScenarioParser.WHOSE, 0); }
		public TerminalNode EVERY() { return getToken(ScenarioParser.EVERY, 0); }
		public TerminalNode TYPE() { return getToken(ScenarioParser.TYPE, 0); }
		public TerminalNode TRUE() { return getToken(ScenarioParser.TRUE, 0); }
		public TerminalNode FALSE() { return getToken(ScenarioParser.FALSE, 0); }
		public IdentifierContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_identifier; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterIdentifier(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitIdentifier(this);
		}
	}

	public final IdentifierContext identifier() throws RecognitionException {
		IdentifierContext _localctx = new IdentifierContext(_ctx, getState());
		enterRule(_localctx, 130, RULE_identifier);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(695);
			_la = _input.LA(1);
			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ATTRIBUTE) | (1L << EVERY) | (1L << FALSE) | (1L << LINK) | (1L << MATCH) | (1L << MATCHES) | (1L << SOME) | (1L << TRUE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TYPE - 64)) | (1L << (WHERE - 64)) | (1L << (WHOSE - 64)) | (1L << (WORD - 64)))) != 0)) ) {
			_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class NameAccessContext extends ParserRuleContext {
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public NameAccessContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_nameAccess; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterNameAccess(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitNameAccess(this);
		}
	}

	public final NameAccessContext nameAccess() throws RecognitionException {
		NameAccessContext _localctx = new NameAccessContext(_ctx, getState());
		enterRule(_localctx, 132, RULE_nameAccess);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(698);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if (_la==THE) {
				{
				setState(697);
				match(THE);
				}
			}

			setState(700);
			name();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AccessContext extends ParserRuleContext {
		public PrimaryContext primary() {
			return getRuleContext(PrimaryContext.class,0);
		}
		public AttributeAccessContext attributeAccess() {
			return getRuleContext(AttributeAccessContext.class,0);
		}
		public ExampleAccessContext exampleAccess() {
			return getRuleContext(ExampleAccessContext.class,0);
		}
		public FilterExprContext filterExpr() {
			return getRuleContext(FilterExprContext.class,0);
		}
		public AccessContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_access; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAccess(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAccess(this);
		}
	}

	public final AccessContext access() throws RecognitionException {
		AccessContext _localctx = new AccessContext(_ctx, getState());
		enterRule(_localctx, 134, RULE_access);
		try {
			setState(706);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(702);
				primary();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(703);
				attributeAccess();
				}
				break;
			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(704);
				exampleAccess();
				}
				break;
			case 4:
				enterOuterAlt(_localctx, 4);
				{
				setState(705);
				filterExpr();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class NamedAccessContext extends ParserRuleContext {
		public NameAccessContext nameAccess() {
			return getRuleContext(NameAccessContext.class,0);
		}
		public AttributeAccessContext attributeAccess() {
			return getRuleContext(AttributeAccessContext.class,0);
		}
		public NamedAccessContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_namedAccess; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterNamedAccess(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitNamedAccess(this);
		}
	}

	public final NamedAccessContext namedAccess() throws RecognitionException {
		NamedAccessContext _localctx = new NamedAccessContext(_ctx, getState());
		enterRule(_localctx, 136, RULE_namedAccess);
		try {
			setState(710);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(708);
				nameAccess();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(709);
				attributeAccess();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class NamedContext extends ParserRuleContext {
		public NamedAccessContext namedAccess() {
			return getRuleContext(NamedAccessContext.class,0);
		}
		public ExampleAccessContext exampleAccess() {
			return getRuleContext(ExampleAccessContext.class,0);
		}
		public NamedContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_named; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterNamed(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitNamed(this);
		}
	}

	public final NamedContext named() throws RecognitionException {
		NamedContext _localctx = new NamedContext(_ctx, getState());
		enterRule(_localctx, 138, RULE_named);
		try {
			setState(714);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(712);
				namedAccess();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(713);
				exampleAccess();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AttributeAccessContext extends ParserRuleContext {
		public NameContext name() {
			return getRuleContext(NameContext.class,0);
		}
		public TerminalNode OF() { return getToken(ScenarioParser.OF, 0); }
		public AccessContext access() {
			return getRuleContext(AccessContext.class,0);
		}
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public AttributeAccessContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_attributeAccess; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAttributeAccess(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAttributeAccess(this);
		}
	}

	public final AttributeAccessContext attributeAccess() throws RecognitionException {
		AttributeAccessContext _localctx = new AttributeAccessContext(_ctx, getState());
		enterRule(_localctx, 140, RULE_attributeAccess);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(717);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if (_la==THE) {
				{
				setState(716);
				match(THE);
				}
			}

			setState(719);
			name();
			setState(720);
			match(OF);
			setState(721);
			access();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ExampleAccessContext extends ParserRuleContext {
		public PrimaryExprContext primaryExpr() {
			return getRuleContext(PrimaryExprContext.class,0);
		}
		public TerminalNode FROM() { return getToken(ScenarioParser.FROM, 0); }
		public NamedAccessContext namedAccess() {
			return getRuleContext(NamedAccessContext.class,0);
		}
		public ExampleAccessContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_exampleAccess; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterExampleAccess(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitExampleAccess(this);
		}
	}

	public final ExampleAccessContext exampleAccess() throws RecognitionException {
		ExampleAccessContext _localctx = new ExampleAccessContext(_ctx, getState());
		enterRule(_localctx, 142, RULE_exampleAccess);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(723);
			primaryExpr();
			setState(724);
			match(FROM);
			setState(725);
			namedAccess();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class FilterExprContext extends ParserRuleContext {
		public TerminalNode ALL() { return getToken(ScenarioParser.ALL, 0); }
		public ExprContext expr() {
			return getRuleContext(ExprContext.class,0);
		}
		public TerminalNode WHICH() { return getToken(ScenarioParser.WHICH, 0); }
		public CondExprContext condExpr() {
			return getRuleContext(CondExprContext.class,0);
		}
		public FilterExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_filterExpr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterFilterExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitFilterExpr(this);
		}
	}

	public final FilterExprContext filterExpr() throws RecognitionException {
		FilterExprContext _localctx = new FilterExprContext(_ctx, getState());
		enterRule(_localctx, 144, RULE_filterExpr);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(727);
			match(ALL);
			setState(728);
			expr();
			setState(729);
			match(WHICH);
			setState(730);
			condExpr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class SepContext extends ParserRuleContext {
		public TerminalNode COMMA() { return getToken(ScenarioParser.COMMA, 0); }
		public TerminalNode AND() { return getToken(ScenarioParser.AND, 0); }
		public SepContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_sep; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterSep(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitSep(this);
		}
	}

	public final SepContext sep() throws RecognitionException {
		SepContext _localctx = new SepContext(_ctx, getState());
		enterRule(_localctx, 146, RULE_sep);
		try {
			setState(736);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(732);
				match(COMMA);
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(733);
				match(AND);
				}
				break;
			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(734);
				match(COMMA);
				setState(735);
				match(AND);
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CollectionContext extends ParserRuleContext {
		public ListContext list() {
			return getRuleContext(ListContext.class,0);
		}
		public RangeContext range() {
			return getRuleContext(RangeContext.class,0);
		}
		public CollectionContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_collection; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCollection(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCollection(this);
		}
	}

	public final CollectionContext collection() throws RecognitionException {
		CollectionContext _localctx = new CollectionContext(_ctx, getState());
		enterRule(_localctx, 148, RULE_collection);
		try {
			setState(740);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(738);
				list();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(739);
				range();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ListContext extends ParserRuleContext {
		public List listElem() {
			return getRuleContexts(ListElemContext.class);
		}
		public ListElemContext listElem(int i) {
			return getRuleContext(ListElemContext.class,i);
		}
		public List sep() {
			return getRuleContexts(SepContext.class);
		}
		public SepContext sep(int i) {
			return getRuleContext(SepContext.class,i);
		}
		public ListContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_list; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterList(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitList(this);
		}
	}

	public final ListContext list() throws RecognitionException {
		ListContext _localctx = new ListContext(_ctx, getState());
		enterRule(_localctx, 150, RULE_list);
		try {
			int _alt;
			enterOuterAlt(_localctx, 1);
			{
			setState(742);
			listElem();
			setState(746); 
			_errHandler.sync(this);
			_alt = 1;
			do {
				switch (_alt) {
				case 1:
					{
					{
					setState(743);
					sep();
					setState(744);
					listElem();
					}
					}
					break;
				default:
					throw new NoViableAltException(this);
				}
				setState(748); 
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,80,_ctx);
			} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class ListElemContext extends ParserRuleContext {
		public AccessContext access() {
			return getRuleContext(AccessContext.class,0);
		}
		public RangeContext range() {
			return getRuleContext(RangeContext.class,0);
		}
		public ListElemContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_listElem; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterListElem(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitListElem(this);
		}
	}

	public final ListElemContext listElem() throws RecognitionException {
		ListElemContext _localctx = new ListElemContext(_ctx, getState());
		enterRule(_localctx, 152, RULE_listElem);
		try {
			setState(752);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(750);
				access();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(751);
				range();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class RangeContext extends ParserRuleContext {
		public List access() {
			return getRuleContexts(AccessContext.class);
		}
		public AccessContext access(int i) {
			return getRuleContext(AccessContext.class,i);
		}
		public TerminalNode TO() { return getToken(ScenarioParser.TO, 0); }
		public RangeContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_range; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterRange(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitRange(this);
		}
	}

	public final RangeContext range() throws RecognitionException {
		RangeContext _localctx = new RangeContext(_ctx, getState());
		enterRule(_localctx, 154, RULE_range);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(754);
			access();
			setState(755);
			match(TO);
			setState(756);
			access();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CondExprContext extends ParserRuleContext {
		public AndCondExprContext andCondExpr() {
			return getRuleContext(AndCondExprContext.class,0);
		}
		public CondExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_condExpr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCondExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCondExpr(this);
		}
	}

	public final CondExprContext condExpr() throws RecognitionException {
		CondExprContext _localctx = new CondExprContext(_ctx, getState());
		enterRule(_localctx, 156, RULE_condExpr);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(758);
			andCondExpr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AndCondExprContext extends ParserRuleContext {
		public List orCondExpr() {
			return getRuleContexts(OrCondExprContext.class);
		}
		public OrCondExprContext orCondExpr(int i) {
			return getRuleContext(OrCondExprContext.class,i);
		}
		public List AND() { return getTokens(ScenarioParser.AND); }
		public TerminalNode AND(int i) {
			return getToken(ScenarioParser.AND, i);
		}
		public AndCondExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_andCondExpr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAndCondExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAndCondExpr(this);
		}
	}

	public final AndCondExprContext andCondExpr() throws RecognitionException {
		AndCondExprContext _localctx = new AndCondExprContext(_ctx, getState());
		enterRule(_localctx, 158, RULE_andCondExpr);
		try {
			int _alt;
			enterOuterAlt(_localctx, 1);
			{
			setState(760);
			orCondExpr();
			setState(765);
			_errHandler.sync(this);
			_alt = getInterpreter().adaptivePredict(_input,82,_ctx);
			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
				if ( _alt==1 ) {
					{
					{
					setState(761);
					match(AND);
					setState(762);
					orCondExpr();
					}
					} 
				}
				setState(767);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,82,_ctx);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class OrCondExprContext extends ParserRuleContext {
		public List primaryCondExpr() {
			return getRuleContexts(PrimaryCondExprContext.class);
		}
		public PrimaryCondExprContext primaryCondExpr(int i) {
			return getRuleContext(PrimaryCondExprContext.class,i);
		}
		public List OR() { return getTokens(ScenarioParser.OR); }
		public TerminalNode OR(int i) {
			return getToken(ScenarioParser.OR, i);
		}
		public OrCondExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_orCondExpr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterOrCondExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitOrCondExpr(this);
		}
	}

	public final OrCondExprContext orCondExpr() throws RecognitionException {
		OrCondExprContext _localctx = new OrCondExprContext(_ctx, getState());
		enterRule(_localctx, 160, RULE_orCondExpr);
		try {
			int _alt;
			enterOuterAlt(_localctx, 1);
			{
			setState(768);
			primaryCondExpr();
			setState(773);
			_errHandler.sync(this);
			_alt = getInterpreter().adaptivePredict(_input,83,_ctx);
			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
				if ( _alt==1 ) {
					{
					{
					setState(769);
					match(OR);
					setState(770);
					primaryCondExpr();
					}
					} 
				}
				setState(775);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,83,_ctx);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class PrimaryCondExprContext extends ParserRuleContext {
		public AttrCheckContext attrCheck() {
			return getRuleContext(AttrCheckContext.class,0);
		}
		public CondOpExprContext condOpExpr() {
			return getRuleContext(CondOpExprContext.class,0);
		}
		public PredOpExprContext predOpExpr() {
			return getRuleContext(PredOpExprContext.class,0);
		}
		public PrimaryCondExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_primaryCondExpr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterPrimaryCondExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitPrimaryCondExpr(this);
		}
	}

	public final PrimaryCondExprContext primaryCondExpr() throws RecognitionException {
		PrimaryCondExprContext _localctx = new PrimaryCondExprContext(_ctx, getState());
		enterRule(_localctx, 162, RULE_primaryCondExpr);
		try {
			setState(779);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(776);
				attrCheck();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(777);
				condOpExpr();
				}
				break;
			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(778);
				predOpExpr();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class AttrCheckContext extends ParserRuleContext {
		public NamedExprContext namedExpr() {
			return getRuleContext(NamedExprContext.class,0);
		}
		public TerminalNode HAS() { return getToken(ScenarioParser.HAS, 0); }
		public TerminalNode HAVE() { return getToken(ScenarioParser.HAVE, 0); }
		public AccessContext access() {
			return getRuleContext(AccessContext.class,0);
		}
		public AttrCheckContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_attrCheck; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterAttrCheck(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitAttrCheck(this);
		}
	}

	public final AttrCheckContext attrCheck() throws RecognitionException {
		AttrCheckContext _localctx = new AttrCheckContext(_ctx, getState());
		enterRule(_localctx, 164, RULE_attrCheck);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(782);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALL) | (1L << ANSWER) | (1L << ATTRIBUTE) | (1L << EVERY) | (1L << FALSE) | (1L << IT) | (1L << LINK) | (1L << MATCH) | (1L << MATCHES) | (1L << SOME) | (1L << THE) | (1L << TRUE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TYPE - 64)) | (1L << (WHERE - 64)) | (1L << (WHOSE - 64)) | (1L << (CODE_BLOCK - 64)) | (1L << (INTEGER - 64)) | (1L << (DECIMAL - 64)) | (1L << (STRING_LITERAL - 64)) | (1L << (WORD - 64)))) != 0)) {
				{
				setState(781);
				access();
				}
			}

			setState(784);
			_la = _input.LA(1);
			if ( !(_la==HAS || _la==HAVE) ) {
			_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			setState(785);
			namedExpr();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CondOpExprContext extends ParserRuleContext {
		public AccessContext lhs;
		public AccessContext rhs;
		public CondOpContext condOp() {
			return getRuleContext(CondOpContext.class,0);
		}
		public List access() {
			return getRuleContexts(AccessContext.class);
		}
		public AccessContext access(int i) {
			return getRuleContext(AccessContext.class,i);
		}
		public CondOpExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_condOpExpr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCondOpExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCondOpExpr(this);
		}
	}

	public final CondOpExprContext condOpExpr() throws RecognitionException {
		CondOpExprContext _localctx = new CondOpExprContext(_ctx, getState());
		enterRule(_localctx, 166, RULE_condOpExpr);
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(788);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) {
			case 1:
				{
				setState(787);
				((CondOpExprContext)_localctx).lhs = access();
				}
				break;
			}
			setState(790);
			condOp();
			setState(791);
			((CondOpExprContext)_localctx).rhs = access();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CondOpContext extends ParserRuleContext {
		public EqOpContext eqOp() {
			return getRuleContext(EqOpContext.class,0);
		}
		public CmpOpContext cmpOp() {
			return getRuleContext(CmpOpContext.class,0);
		}
		public CollOpContext collOp() {
			return getRuleContext(CollOpContext.class,0);
		}
		public StrOpContext strOp() {
			return getRuleContext(StrOpContext.class,0);
		}
		public CondOpContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_condOp; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCondOp(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCondOp(this);
		}
	}

	public final CondOpContext condOp() throws RecognitionException {
		CondOpContext _localctx = new CondOpContext(_ctx, getState());
		enterRule(_localctx, 168, RULE_condOp);
		try {
			setState(797);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(793);
				eqOp();
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(794);
				cmpOp();
				}
				break;
			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(795);
				collOp();
				}
				break;
			case 4:
				enterOuterAlt(_localctx, 4);
				{
				setState(796);
				strOp();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class EqOpContext extends ParserRuleContext {
		public TerminalNode IS() { return getToken(ScenarioParser.IS, 0); }
		public TerminalNode ARE() { return getToken(ScenarioParser.ARE, 0); }
		public TerminalNode NOT() { return getToken(ScenarioParser.NOT, 0); }
		public TerminalNode THE() { return getToken(ScenarioParser.THE, 0); }
		public TerminalNode SAME() { return getToken(ScenarioParser.SAME, 0); }
		public TerminalNode AS() { return getToken(ScenarioParser.AS, 0); }
		public EqOpContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_eqOp; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterEqOp(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitEqOp(this);
		}
	}

	public final EqOpContext eqOp() throws RecognitionException {
		EqOpContext _localctx = new EqOpContext(_ctx, getState());
		enterRule(_localctx, 170, RULE_eqOp);
		int _la;
		try {
			setState(812);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(799);
				match(IS);
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(800);
				match(ARE);
				}
				break;
			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(801);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(802);
				match(NOT);
				}
				break;
			case 4:
				enterOuterAlt(_localctx, 4);
				{
				setState(803);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(804);
				match(THE);
				setState(805);
				match(SAME);
				setState(806);
				match(AS);
				}
				break;
			case 5:
				enterOuterAlt(_localctx, 5);
				{
				setState(807);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(808);
				match(NOT);
				setState(809);
				match(THE);
				setState(810);
				match(SAME);
				setState(811);
				match(AS);
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CmpOpContext extends ParserRuleContext {
		public TerminalNode LESS() { return getToken(ScenarioParser.LESS, 0); }
		public TerminalNode THAN() { return getToken(ScenarioParser.THAN, 0); }
		public TerminalNode IS() { return getToken(ScenarioParser.IS, 0); }
		public TerminalNode ARE() { return getToken(ScenarioParser.ARE, 0); }
		public TerminalNode NOT() { return getToken(ScenarioParser.NOT, 0); }
		public TerminalNode EQUAL() { return getToken(ScenarioParser.EQUAL, 0); }
		public TerminalNode GREATER() { return getToken(ScenarioParser.GREATER, 0); }
		public CmpOpContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_cmpOp; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCmpOp(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCmpOp(this);
		}
	}

	public final CmpOpContext cmpOp() throws RecognitionException {
		CmpOpContext _localctx = new CmpOpContext(_ctx, getState());
		enterRule(_localctx, 172, RULE_cmpOp);
		int _la;
		try {
			setState(834);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(814);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(815);
				match(LESS);
				setState(816);
				match(THAN);
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(817);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(818);
				match(NOT);
				setState(819);
				match(LESS);
				setState(820);
				match(THAN);
				}
				break;
			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(821);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(822);
				match(LESS);
				setState(823);
				match(EQUAL);
				}
				break;
			case 4:
				enterOuterAlt(_localctx, 4);
				{
				setState(824);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(825);
				match(GREATER);
				setState(826);
				match(THAN);
				}
				break;
			case 5:
				enterOuterAlt(_localctx, 5);
				{
				setState(827);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(828);
				match(GREATER);
				setState(829);
				match(EQUAL);
				}
				break;
			case 6:
				enterOuterAlt(_localctx, 6);
				{
				setState(830);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(831);
				match(NOT);
				setState(832);
				match(GREATER);
				setState(833);
				match(THAN);
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class CollOpContext extends ParserRuleContext {
		public TerminalNode CONTAIN() { return getToken(ScenarioParser.CONTAIN, 0); }
		public TerminalNode CONTAINS() { return getToken(ScenarioParser.CONTAINS, 0); }
		public TerminalNode NOT() { return getToken(ScenarioParser.NOT, 0); }
		public TerminalNode DO() { return getToken(ScenarioParser.DO, 0); }
		public TerminalNode DOES() { return getToken(ScenarioParser.DOES, 0); }
		public CollOpContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_collOp; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterCollOp(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitCollOp(this);
		}
	}

	public final CollOpContext collOp() throws RecognitionException {
		CollOpContext _localctx = new CollOpContext(_ctx, getState());
		enterRule(_localctx, 174, RULE_collOp);
		int _la;
		try {
			setState(841);
			_errHandler.sync(this);
			switch (_input.LA(1)) {
			case CONTAIN:
				enterOuterAlt(_localctx, 1);
				{
				setState(836);
				match(CONTAIN);
				}
				break;
			case CONTAINS:
				enterOuterAlt(_localctx, 2);
				{
				setState(837);
				match(CONTAINS);
				}
				break;
			case DO:
			case DOES:
				enterOuterAlt(_localctx, 3);
				{
				setState(838);
				_la = _input.LA(1);
				if ( !(_la==DO || _la==DOES) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(839);
				match(NOT);
				setState(840);
				match(CONTAIN);
				}
				break;
			default:
				throw new NoViableAltException(this);
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class StrOpContext extends ParserRuleContext {
		public TerminalNode MATCH() { return getToken(ScenarioParser.MATCH, 0); }
		public TerminalNode MATCHES() { return getToken(ScenarioParser.MATCHES, 0); }
		public StrOpContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_strOp; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterStrOp(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitStrOp(this);
		}
	}

	public final StrOpContext strOp() throws RecognitionException {
		StrOpContext _localctx = new StrOpContext(_ctx, getState());
		enterRule(_localctx, 176, RULE_strOp);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(843);
			_la = _input.LA(1);
			if ( !(_la==MATCH || _la==MATCHES) ) {
			_errHandler.recoverInline(this);
			}
			else {
				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
				_errHandler.reportMatch(this);
				consume();
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class PredOpExprContext extends ParserRuleContext {
		public AccessContext lhs;
		public PredOpContext predOp() {
			return getRuleContext(PredOpContext.class,0);
		}
		public AccessContext access() {
			return getRuleContext(AccessContext.class,0);
		}
		public PredOpExprContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_predOpExpr; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterPredOpExpr(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitPredOpExpr(this);
		}
	}

	public final PredOpExprContext predOpExpr() throws RecognitionException {
		PredOpExprContext _localctx = new PredOpExprContext(_ctx, getState());
		enterRule(_localctx, 178, RULE_predOpExpr);
		int _la;
		try {
			enterOuterAlt(_localctx, 1);
			{
			setState(846);
			_errHandler.sync(this);
			_la = _input.LA(1);
			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALL) | (1L << ANSWER) | (1L << ATTRIBUTE) | (1L << EVERY) | (1L << FALSE) | (1L << IT) | (1L << LINK) | (1L << MATCH) | (1L << MATCHES) | (1L << SOME) | (1L << THE) | (1L << TRUE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TYPE - 64)) | (1L << (WHERE - 64)) | (1L << (WHOSE - 64)) | (1L << (CODE_BLOCK - 64)) | (1L << (INTEGER - 64)) | (1L << (DECIMAL - 64)) | (1L << (STRING_LITERAL - 64)) | (1L << (WORD - 64)))) != 0)) {
				{
				setState(845);
				((PredOpExprContext)_localctx).lhs = access();
				}
			}

			setState(848);
			predOp();
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public static class PredOpContext extends ParserRuleContext {
		public TerminalNode EMPTY() { return getToken(ScenarioParser.EMPTY, 0); }
		public TerminalNode IS() { return getToken(ScenarioParser.IS, 0); }
		public TerminalNode ARE() { return getToken(ScenarioParser.ARE, 0); }
		public TerminalNode NOT() { return getToken(ScenarioParser.NOT, 0); }
		public PredOpContext(ParserRuleContext parent, int invokingState) {
			super(parent, invokingState);
		}
		@Override public int getRuleIndex() { return RULE_predOp; }
		@Override
		public void enterRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).enterPredOp(this);
		}
		@Override
		public void exitRule(ParseTreeListener listener) {
			if ( listener instanceof ScenarioParserListener ) ((ScenarioParserListener)listener).exitPredOp(this);
		}
	}

	public final PredOpContext predOp() throws RecognitionException {
		PredOpContext _localctx = new PredOpContext(_ctx, getState());
		enterRule(_localctx, 180, RULE_predOp);
		int _la;
		try {
			setState(855);
			_errHandler.sync(this);
			switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(850);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(851);
				match(EMPTY);
				}
				break;
			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(852);
				_la = _input.LA(1);
				if ( !(_la==ARE || _la==IS) ) {
				_errHandler.recoverInline(this);
				}
				else {
					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
					_errHandler.reportMatch(this);
					consume();
				}
				setState(853);
				match(NOT);
				setState(854);
				match(EMPTY);
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}

	public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
		switch (ruleIndex) {
		case 5:
			return sentenceEnd_sempred((SentenceEndContext)_localctx, predIndex);
		}
		return true;
	}
	private boolean sentenceEnd_sempred(SentenceEndContext _localctx, int predIndex) {
		switch (predIndex) {
		case 0:
			return _input.LA(-1) == CODE_BLOCK_END;
		}
		return true;
	}

	public static final String _serializedATN =
		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3f\u035c\4\2\t\2\4"+
		"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
		"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
		"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
		"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
		",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
		"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
		"\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
		"\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+
		"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\3\2\7\2\u00ba\n\2\f"+
		"\2\16\2\u00bd\13\2\3\2\3\2\3\3\3\3\7\3\u00c3\n\3\f\3\16\3\u00c6\13\3\3"+
		"\4\3\4\3\4\3\4\3\5\3\5\5\5\u00ce\n\5\3\5\5\5\u00d1\n\5\3\6\3\6\3\6\3\6"+
		"\3\6\3\6\3\6\3\6\3\6\5\6\u00dc\n\6\3\7\3\7\5\7\u00e0\n\7\3\b\3\b\3\b\3"+
		"\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\5\b\u00ee\n\b\3\t\3\t\3\t\3\t\7\t\u00f4"+
		"\n\t\f\t\16\t\u00f7\13\t\3\t\3\t\3\t\5\t\u00fc\n\t\3\n\3\n\5\n\u0100\n"+
		"\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\5\r\u010c\n\r\3\r\7\r\u010f"+
		"\n\r\f\r\16\r\u0112\13\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u011c"+
		"\n\16\3\17\3\17\3\17\5\17\u0121\n\17\3\17\5\17\u0124\n\17\3\17\3\17\3"+
		"\17\3\17\5\17\u012a\n\17\5\17\u012c\n\17\3\20\3\20\3\20\3\20\3\20\6\20"+
		"\u0133\n\20\r\20\16\20\u0134\5\20\u0137\n\20\3\20\5\20\u013a\n\20\3\20"+
		"\3\20\3\20\3\20\3\20\3\20\6\20\u0142\n\20\r\20\16\20\u0143\3\20\5\20\u0147"+
		"\n\20\5\20\u0149\n\20\3\21\3\21\3\21\3\21\5\21\u014f\n\21\3\22\3\22\3"+
		"\22\3\22\5\22\u0155\n\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u015e"+
		"\n\23\3\23\3\23\3\23\3\23\3\23\5\23\u0165\n\23\5\23\u0167\n\23\3\24\3"+
		"\24\3\24\3\24\6\24\u016d\n\24\r\24\16\24\u016e\3\24\3\24\3\24\5\24\u0174"+
		"\n\24\3\25\3\25\3\25\3\25\7\25\u017a\n\25\f\25\16\25\u017d\13\25\3\26"+
		"\3\26\3\26\3\27\5\27\u0183\n\27\3\27\3\27\3\27\3\27\3\27\3\27\5\27\u018b"+
		"\n\27\3\30\3\30\3\30\3\30\3\30\5\30\u0192\n\30\3\30\5\30\u0195\n\30\3"+
		"\30\3\30\3\30\3\30\3\30\5\30\u019c\n\30\3\31\5\31\u019f\n\31\3\31\3\31"+
		"\3\31\5\31\u01a4\n\31\3\32\3\32\3\32\3\32\5\32\u01aa\n\32\3\33\3\33\3"+
		"\33\3\33\5\33\u01b0\n\33\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\5\35"+
		"\u01ba\n\35\3\36\3\36\3\36\3\36\5\36\u01c0\n\36\3\37\3\37\5\37\u01c4\n"+
		"\37\3\37\3\37\3 \3 \3 \3 \7 \u01cc\n \f \16 \u01cf\13 \3!\3!\3!\3!\5!"+
		"\u01d5\n!\3\"\3\"\3\"\3\"\5\"\u01db\n\"\3#\3#\3#\3#\3#\5#\u01e2\n#\3#"+
		"\5#\u01e5\n#\3$\3$\3$\3$\3$\3$\5$\u01ed\n$\3$\5$\u01f0\n$\3%\3%\3%\3%"+
		"\3%\3%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3)\3)"+
		"\3)\3)\3)\3)\5)\u020f\n)\3)\5)\u0212\n)\3)\5)\u0215\n)\3)\5)\u0218\n)"+
		"\3)\3)\3)\5)\u021d\n)\3)\3)\3)\3*\3*\5*\u0224\n*\3+\3+\3+\3+\3,\3,\3,"+
		"\3,\7,\u022e\n,\f,\16,\u0231\13,\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3"+
		"/\5/\u0240\n/\3/\3/\3\60\3\60\3\60\3\60\7\60\u0248\n\60\f\60\16\60\u024b"+
		"\13\60\3\60\3\60\3\60\6\60\u0250\n\60\r\60\16\60\u0251\5\60\u0254\n\60"+
		"\3\61\3\61\3\61\3\61\5\61\u025a\n\61\3\61\3\61\5\61\u025e\n\61\3\62\3"+
		"\62\3\62\3\62\7\62\u0264\n\62\f\62\16\62\u0267\13\62\3\63\3\63\3\63\3"+
		"\63\5\63\u026d\n\63\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65"+
		"\3\65\3\65\3\65\5\65\u027c\n\65\3\66\3\66\3\66\3\66\3\66\5\66\u0283\n"+
		"\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\5\67\u028d\n\67\3\67\3\67"+
		"\38\38\38\39\39\59\u0296\n9\3:\3:\3:\3:\3:\3:\3:\5:\u029f\n:\3;\3;\3<"+
		"\3<\3=\3=\3>\3>\3?\3?\3@\5@\u02ac\n@\3@\3@\3A\3A\3B\3B\3B\7B\u02b5\nB"+
		"\fB\16B\u02b8\13B\3C\3C\3D\5D\u02bd\nD\3D\3D\3E\3E\3E\3E\5E\u02c5\nE\3"+
		"F\3F\5F\u02c9\nF\3G\3G\5G\u02cd\nG\3H\5H\u02d0\nH\3H\3H\3H\3H\3I\3I\3"+
		"I\3I\3J\3J\3J\3J\3J\3K\3K\3K\3K\5K\u02e3\nK\3L\3L\5L\u02e7\nL\3M\3M\3"+
		"M\3M\6M\u02ed\nM\rM\16M\u02ee\3N\3N\5N\u02f3\nN\3O\3O\3O\3O\3P\3P\3Q\3"+
		"Q\3Q\7Q\u02fe\nQ\fQ\16Q\u0301\13Q\3R\3R\3R\7R\u0306\nR\fR\16R\u0309\13"+
		"R\3S\3S\3S\5S\u030e\nS\3T\5T\u0311\nT\3T\3T\3T\3U\5U\u0317\nU\3U\3U\3"+
		"U\3V\3V\3V\3V\5V\u0320\nV\3W\3W\3W\3W\3W\3W\3W\3W\3W\3W\3W\3W\3W\5W\u032f"+
		"\nW\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\5X\u0345"+
		"\nX\3Y\3Y\3Y\3Y\3Y\5Y\u034c\nY\3Z\3Z\3[\5[\u0351\n[\3[\3[\3\\\3\\\3\\"+
		"\3\\\3\\\5\\\u035a\n\\\3\\\2\2]\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36"+
		" \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082"+
		"\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a"+
		"\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2"+
		"\u00b4\u00b6\2\23\3\2MN\4\2\3\3\7\7\4\2\13\13%%\3\2!\"\3\2\25\26\3\2\16"+
		"\17\3\2\t\n\3\2IJ\3\2\4\5\3\2\65\66\3\29:\3\2+,\3\2PQ\3\2VW\4\2\36\36"+
		"AA\f\2\r\r\34\34\36\36))+,88ABFFHHYY\3\2\27\30\2\u0381\2\u00bb\3\2\2\2"+
		"\4\u00c0\3\2\2\2\6\u00c7\3\2\2\2\b\u00d0\3\2\2\2\n\u00db\3\2\2\2\f\u00df"+
		"\3\2\2\2\16\u00ed\3\2\2\2\20\u00ef\3\2\2\2\22\u00ff\3\2\2\2\24\u0101\3"+
		"\2\2\2\26\u0105\3\2\2\2\30\u0109\3\2\2\2\32\u011b\3\2\2\2\34\u012b\3\2"+
		"\2\2\36\u0148\3\2\2\2 \u014e\3\2\2\2\"\u0154\3\2\2\2$\u0166\3\2\2\2&\u0168"+
		"\3\2\2\2(\u0175\3\2\2\2*\u017e\3\2\2\2,\u018a\3\2\2\2.\u018c\3\2\2\2\60"+
		"\u019e\3\2\2\2\62\u01a5\3\2\2\2\64\u01ab\3\2\2\2\66\u01b1\3\2\2\28\u01b4"+
		"\3\2\2\2:\u01bb\3\2\2\2<\u01c3\3\2\2\2>\u01c7\3\2\2\2@\u01d0\3\2\2\2B"+
		"\u01d6\3\2\2\2D\u01dc\3\2\2\2F\u01e6\3\2\2\2H\u01f1\3\2\2\2J\u01f7\3\2"+
		"\2\2L\u01fd\3\2\2\2N\u0203\3\2\2\2P\u0208\3\2\2\2R\u0223\3\2\2\2T\u0225"+
		"\3\2\2\2V\u0229\3\2\2\2X\u0232\3\2\2\2Z\u0235\3\2\2\2\\\u023b\3\2\2\2"+
		"^\u0253\3\2\2\2`\u0259\3\2\2\2b\u025f\3\2\2\2d\u026c\3\2\2\2f\u026e\3"+
		"\2\2\2h\u0274\3\2\2\2j\u0282\3\2\2\2l\u028c\3\2\2\2n\u0290\3\2\2\2p\u0295"+
		"\3\2\2\2r\u029e\3\2\2\2t\u02a0\3\2\2\2v\u02a2\3\2\2\2x\u02a4\3\2\2\2z"+
		"\u02a6\3\2\2\2|\u02a8\3\2\2\2~\u02ab\3\2\2\2\u0080\u02af\3\2\2\2\u0082"+
		"\u02b1\3\2\2\2\u0084\u02b9\3\2\2\2\u0086\u02bc\3\2\2\2\u0088\u02c4\3\2"+
		"\2\2\u008a\u02c8\3\2\2\2\u008c\u02cc\3\2\2\2\u008e\u02cf\3\2\2\2\u0090"+
		"\u02d5\3\2\2\2\u0092\u02d9\3\2\2\2\u0094\u02e2\3\2\2\2\u0096\u02e6\3\2"+
		"\2\2\u0098\u02e8\3\2\2\2\u009a\u02f2\3\2\2\2\u009c\u02f4\3\2\2\2\u009e"+
		"\u02f8\3\2\2\2\u00a0\u02fa\3\2\2\2\u00a2\u0302\3\2\2\2\u00a4\u030d\3\2"+
		"\2\2\u00a6\u0310\3\2\2\2\u00a8\u0316\3\2\2\2\u00aa\u031f\3\2\2\2\u00ac"+
		"\u032e\3\2\2\2\u00ae\u0344\3\2\2\2\u00b0\u034b\3\2\2\2\u00b2\u034d\3\2"+
		"\2\2\u00b4\u0350\3\2\2\2\u00b6\u0359\3\2\2\2\u00b8\u00ba\5\4\3\2\u00b9"+
		"\u00b8\3\2\2\2\u00ba\u00bd\3\2\2\2\u00bb\u00b9\3\2\2\2\u00bb\u00bc\3\2"+
		"\2\2\u00bc\u00be\3\2\2\2\u00bd\u00bb\3\2\2\2\u00be\u00bf\7\2\2\3\u00bf"+
		"\3\3\2\2\2\u00c0\u00c4\5\6\4\2\u00c1\u00c3\5\n\6\2\u00c2\u00c1\3\2\2\2"+
		"\u00c3\u00c6\3\2\2\2\u00c4\u00c2\3\2\2\2\u00c4\u00c5\3\2\2\2\u00c5\5\3"+
		"\2\2\2\u00c6\u00c4\3\2\2\2\u00c7\u00c8\7K\2\2\u00c8\u00c9\7b\2\2\u00c9"+
		"\u00ca\7a\2\2\u00ca\7\3\2\2\2\u00cb\u00d1\7D\2\2\u00cc\u00ce\7=\2\2\u00cd"+
		"\u00cc\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf\u00d1\5\u0082"+
		"B\2\u00d0\u00cb\3\2\2\2\u00d0\u00cd\3\2\2\2\u00d1\t\3\2\2\2\u00d2\u00d3"+
		"\5\20\t\2\u00d3\u00d4\5\f\7\2\u00d4\u00dc\3\2\2\2\u00d5\u00d6\5\22\n\2"+
		"\u00d6\u00d7\5\f\7\2\u00d7\u00dc\3\2\2\2\u00d8\u00dc\5Z.\2\u00d9\u00dc"+
		"\5\24\13\2\u00da\u00dc\5\26\f\2\u00db\u00d2\3\2\2\2\u00db\u00d5\3\2\2"+
		"\2\u00db\u00d8\3\2\2\2\u00db\u00d9\3\2\2\2\u00db\u00da\3\2\2\2\u00dc\13"+
		"\3\2\2\2\u00dd\u00e0\7S\2\2\u00de\u00e0\6\7\2\2\u00df\u00dd\3\2\2\2\u00df"+
		"\u00de\3\2\2\2\u00e0\r\3\2\2\2\u00e1\u00ee\5\32\16\2\u00e2\u00ee\5$\23"+
		"\2\u00e3\u00ee\5&\24\2\u00e4\u00ee\5<\37\2\u00e5\u00ee\5T+\2\u00e6\u00ee"+
		"\5\\/\2\u00e7\u00ee\5B\"\2\u00e8\u00ee\5D#\2\u00e9\u00ee\5F$\2\u00ea\u00ee"+
		"\5H%\2\u00eb\u00ee\5J&\2\u00ec\u00ee\5L\'\2\u00ed\u00e1\3\2\2\2\u00ed"+
		"\u00e2\3\2\2\2\u00ed\u00e3\3\2\2\2\u00ed\u00e4\3\2\2\2\u00ed\u00e5\3\2"+
		"\2\2\u00ed\u00e6\3\2\2\2\u00ed\u00e7\3\2\2\2\u00ed\u00e8\3\2\2\2\u00ed"+
		"\u00e9\3\2\2\2\u00ed\u00ea\3\2\2\2\u00ed\u00eb\3\2\2\2\u00ed\u00ec\3\2"+
		"\2\2\u00ee\17\3\2\2\2\u00ef\u00f5\5\16\b\2\u00f0\u00f1\5\u0094K\2\u00f1"+
		"\u00f2\5\16\b\2\u00f2\u00f4\3\2\2\2\u00f3\u00f0\3\2\2\2\u00f4\u00f7\3"+
		"\2\2\2\u00f5\u00f3\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6\u00fb\3\2\2\2\u00f7"+
		"\u00f5\3\2\2\2\u00f8\u00f9\5\u0094K\2\u00f9\u00fa\5\22\n\2\u00fa\u00fc"+
		"\3\2\2\2\u00fb\u00f8\3\2\2\2\u00fb\u00fc\3\2\2\2\u00fc\21\3\2\2\2\u00fd"+
		"\u0100\5N(\2\u00fe\u0100\5P)\2\u00ff\u00fd\3\2\2\2\u00ff\u00fe\3\2\2\2"+
		"\u0100\23\3\2\2\2\u0101\u0102\7L\2\2\u0102\u0103\7b\2\2\u0103\u0104\7"+
		"a\2\2\u0104\25\3\2\2\2\u0105\u0106\t\2\2\2\u0106\u0107\7b\2\2\u0107\u0108"+
		"\7a\2\2\u0108\27\3\2\2\2\u0109\u010b\7O\2\2\u010a\u010c\7d\2\2\u010b\u010a"+
		"\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u0110\3\2\2\2\u010d\u010f\7f\2\2\u010e"+
		"\u010d\3\2\2\2\u010f\u0112\3\2\2\2\u0110\u010e\3\2\2\2\u0110\u0111\3\2"+
		"\2\2\u0111\u0113\3\2\2\2\u0112\u0110\3\2\2\2\u0113\u0114\7e\2\2\u0114"+
		"\31\3\2\2\2\u0115\u0116\7?\2\2\u0116\u0117\7%\2\2\u0117\u011c\5\34\17"+
		"\2\u0118\u0119\7?\2\2\u0119\u011a\7\13\2\2\u011a\u011c\5\36\20\2\u011b"+
		"\u0115\3\2\2\2\u011b\u0118\3\2\2\2\u011c\33\3\2\2\2\u011d\u011e\t\3\2"+
		"\2\u011e\u0120\5 \21\2\u011f\u0121\5\u0082B\2\u0120\u011f\3\2\2\2\u0120"+
		"\u0121\3\2\2\2\u0121\u0123\3\2\2\2\u0122\u0124\5(\25\2\u0123\u0122\3\2"+
		"\2\2\u0123\u0124\3\2\2\2\u0124\u012c\3\2\2\2\u0125\u0126\7=\2\2\u0126"+
		"\u0127\5 \21\2\u0127\u0129\5\u0082B\2\u0128\u012a\5(\25\2\u0129\u0128"+
		"\3\2\2\2\u0129\u012a\3\2\2\2\u012a\u012c\3\2\2\2\u012b\u011d\3\2\2\2\u012b"+
		"\u0125\3\2\2\2\u012c\35\3\2\2\2\u012d\u0136\5\"\22\2\u012e\u0132\5\u0082"+
		"B\2\u012f\u0130\5\u0094K\2\u0130\u0131\5\u0082B\2\u0131\u0133\3\2\2\2"+
		"\u0132\u012f\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0132\3\2\2\2\u0134\u0135"+
		"\3\2\2\2\u0135\u0137\3\2\2\2\u0136\u012e\3\2\2\2\u0136\u0137\3\2\2\2\u0137"+
		"\u0139\3\2\2\2\u0138\u013a\5(\25\2\u0139\u0138\3\2\2\2\u0139\u013a\3\2"+
		"\2\2\u013a\u0149\3\2\2\2\u013b\u013c\7=\2\2\u013c\u013d\5\"\22\2\u013d"+
		"\u0141\5\u0082B\2\u013e\u013f\5\u0094K\2\u013f\u0140\5\u0082B\2\u0140"+
		"\u0142\3\2\2\2\u0141\u013e\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0141\3\2"+
		"\2\2\u0143\u0144\3\2\2\2\u0144\u0146\3\2\2\2\u0145\u0147\5(\25\2\u0146"+
		"\u0145\3\2\2\2\u0146\u0147\3\2\2\2\u0147\u0149\3\2\2\2\u0148\u012d\3\2"+
		"\2\2\u0148\u013b\3\2\2\2\u0149\37\3\2\2\2\u014a\u014f\5\u0080A\2\u014b"+
		"\u014c\5\u0082B\2\u014c\u014d\7\20\2\2\u014d\u014f\3\2\2\2\u014e\u014a"+
		"\3\2\2\2\u014e\u014b\3\2\2\2\u014f!\3\2\2\2\u0150\u0155\5\u0080A\2\u0151"+
		"\u0152\5\u0082B\2\u0152\u0153\7\21\2\2\u0153\u0155\3\2\2\2\u0154\u0150"+
		"\3\2\2\2\u0154\u0151\3\2\2\2\u0155#\3\2\2\2\u0156\u0157\7\34\2\2\u0157"+
		"\u0158\5 \21\2\u0158\u0159\7%\2\2\u0159\u015a\t\3\2\2\u015a\u015b\5 \21"+
		"\2\u015b\u0167\3\2\2\2\u015c\u015e\7=\2\2\u015d\u015c\3\2\2\2\u015d\u015e"+
		"\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u0160\5\u0082B\2\u0160\u0161\7%\2\2"+
		"\u0161\u0162\t\3\2\2\u0162\u0164\5 \21\2\u0163\u0165\5(\25\2\u0164\u0163"+
		"\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0167\3\2\2\2\u0166\u0156\3\2\2\2\u0166"+
		"\u015d\3\2\2\2\u0167%\3\2\2\2\u0168\u016c\5\u0082B\2\u0169\u016a\5\u0094"+
		"K\2\u016a\u016b\5\u0082B\2\u016b\u016d\3\2\2\2\u016c\u0169\3\2\2\2\u016d"+
		"\u016e\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0170\3\2"+
		"\2\2\u0170\u0171\7\13\2\2\u0171\u0173\5\"\22\2\u0172\u0174\5(\25\2\u0173"+
		"\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174\'\3\2\2\2\u0175\u017b\5*\26\2"+
		"\u0176\u0177\5\u0094K\2\u0177\u0178\5*\26\2\u0178\u017a\3\2\2\2\u0179"+
		"\u0176\3\2\2\2\u017a\u017d\3\2\2\2\u017b\u0179\3\2\2\2\u017b\u017c\3\2"+
		"\2\2\u017c)\3\2\2\2\u017d\u017b\3\2\2\2\u017e\u017f\7E\2\2\u017f\u0180"+
		"\5,\27\2\u0180+\3\2\2\2\u0181\u0183\7=\2\2\u0182\u0181\3\2\2\2\u0182\u0183"+
		"\3\2\2\2\u0183\u0184\3\2\2\2\u0184\u0185\5\u0080A\2\u0185\u0186\5p9\2"+
		"\u0186\u018b\3\2\2\2\u0187\u0188\5v<\2\u0188\u0189\5\u0082B\2\u0189\u018b"+
		"\3\2\2\2\u018a\u0182\3\2\2\2\u018a\u0187\3\2\2\2\u018b-\3\2\2\2\u018c"+
		"\u018d\5\u0080A\2\u018d\u018e\7\b\2\2\u018e\u0191\t\4\2\2\u018f\u0190"+
		"\7\61\2\2\u0190\u0192\7.\2\2\u0191\u018f\3\2\2\2\u0191\u0192\3\2\2\2\u0192"+
		"\u0194\3\2\2\2\u0193\u0195\7=\2\2\u0194\u0193\3\2\2\2\u0194\u0195\3\2"+
		"\2\2\u0195\u0196\3\2\2\2\u0196\u0197\5\u0080A\2\u0197\u019b\7.\2\2\u0198"+
		"\u019c\5p9\2\u0199\u019c\5\62\32\2\u019a\u019c\5\64\33\2\u019b\u0198\3"+
		"\2\2\2\u019b\u0199\3\2\2\2\u019b\u019a\3\2\2\2\u019c/\3\2\2\2\u019d\u019f"+
		"\t\3\2\2\u019e\u019d\3\2\2\2\u019e\u019f\3\2\2\2\u019f\u01a0\3\2\2\2\u01a0"+
		"\u01a3\5\u0082B\2\u01a1\u01a4\5\66\34\2\u01a2\u01a4\58\35\2\u01a3\u01a1"+
		"\3\2\2\2\u01a3\u01a2\3\2\2\2\u01a4\61\3\2\2\2\u01a5\u01a6\t\3\2\2\u01a6"+
		"\u01a9\5 \21\2\u01a7\u01a8\7(\2\2\u01a8\u01aa\5p9\2\u01a9\u01a7\3\2\2"+
		"\2\u01a9\u01aa\3\2\2\2\u01aa\63\3\2\2\2\u01ab\u01ac\7*\2\2\u01ac\u01af"+
		"\5\"\22\2\u01ad\u01ae\7(\2\2\u01ae\u01b0\5p9\2\u01af\u01ad\3\2\2\2\u01af"+
		"\u01b0\3\2\2\2\u01b0\65\3\2\2\2\u01b1\u01b2\7(\2\2\u01b2\u01b3\5p9\2\u01b3"+
		"\67\3\2\2\2\u01b4\u01b5\7.\2\2\u01b5\u01b6\7B\2\2\u01b6\u01b9\5 \21\2"+
		"\u01b7\u01b8\7(\2\2\u01b8\u01ba\5p9\2\u01b9\u01b7\3\2\2\2\u01b9\u01ba"+
		"\3\2\2\2\u01ba9\3\2\2\2\u01bb\u01bc\7\34\2\2\u01bc\u01bf\5 \21\2\u01bd"+
		"\u01be\7(\2\2\u01be\u01c0\5\u0086D\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3"+
		"\2\2\2\u01c0;\3\2\2\2\u01c1\u01c4\5:\36\2\u01c2\u01c4\5\u0086D\2\u01c3"+
		"\u01c1\3\2\2\2\u01c3\u01c2\3\2\2\2\u01c4\u01c5\3\2\2\2\u01c5\u01c6\5>"+
		" \2\u01c6=\3\2\2\2\u01c7\u01cd\5@!\2\u01c8\u01c9\5\u0094K\2\u01c9\u01ca"+
		"\5@!\2\u01ca\u01cc\3\2\2\2\u01cb\u01c8\3\2\2\2\u01cc\u01cf\3\2\2\2\u01cd"+
		"\u01cb\3\2\2\2\u01cd\u01ce\3\2\2\2\u01ce?\3\2\2\2\u01cf\u01cd\3\2\2\2"+
		"\u01d0\u01d4\t\5\2\2\u01d1\u01d5\5,\27\2\u01d2\u01d5\5.\30\2\u01d3\u01d5"+
		"\5\60\31\2\u01d4\u01d1\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4\u01d3\3\2\2\2"+
		"\u01d5A\3\2\2\2\u01d6\u01d7\5\b\5\2\u01d7\u01da\t\6\2\2\u01d8\u01db\5"+
		"\34\17\2\u01d9\u01db\5\36\20\2\u01da\u01d8\3\2\2\2\u01da\u01d9\3\2\2\2"+
		"\u01dbC\3\2\2\2\u01dc\u01dd\5\b\5\2\u01dd\u01de\t\7\2\2\u01de\u01e1\5"+
		"\u0082B\2\u01df\u01e0\7\60\2\2\u01e0\u01e2\5p9\2\u01e1\u01df\3\2\2\2\u01e1"+
		"\u01e2\3\2\2\2\u01e2\u01e4\3\2\2\2\u01e3\u01e5\5(\25\2\u01e4\u01e3\3\2"+
		"\2\2\u01e4\u01e5\3\2\2\2\u01e5E\3\2\2\2\u01e6\u01e7\5\b\5\2\u01e7\u01e8"+
		"\t\b\2\2\u01e8\u01e9\7E\2\2\u01e9\u01ef\5p9\2\u01ea\u01ec\7$\2\2\u01eb"+
		"\u01ed\7=\2\2\u01ec\u01eb\3\2\2\2\u01ec\u01ed\3\2\2\2\u01ed\u01ee\3\2"+
		"\2\2\u01ee\u01f0\5\u0082B\2\u01ef\u01ea\3\2\2\2\u01ef\u01f0\3\2\2\2\u01f0"+
		"G\3\2\2\2\u01f1\u01f2\5\b\5\2\u01f2\u01f3\t\t\2\2\u01f3\u01f4\5p9\2\u01f4"+
		"\u01f5\7$\2\2\u01f5\u01f6\5p9\2\u01f6I\3\2\2\2\u01f7\u01f8\5\b\5\2\u01f8"+
		"\u01f9\t\n\2\2\u01f9\u01fa\5p9\2\u01fa\u01fb\7C\2\2\u01fb\u01fc\5p9\2"+
		"\u01fcK\3\2\2\2\u01fd\u01fe\5\b\5\2\u01fe\u01ff\t\13\2\2\u01ff\u0200\5"+
		"p9\2\u0200\u0201\7\37\2\2\u0201\u0202\5p9\2\u0202M\3\2\2\2\u0203\u0204"+
		"\7\f\2\2\u0204\u0205\5\u009eP\2\u0205\u0206\7R\2\2\u0206\u0207\5R*\2\u0207"+
		"O\3\2\2\2\u0208\u0209\5\b\5\2\u0209\u0217\t\f\2\2\u020a\u020b\t\3\2\2"+
		"\u020b\u020e\5\u0082B\2\u020c\u020d\7(\2\2\u020d\u020f\5p9\2\u020e\u020c"+
		"\3\2\2\2\u020e\u020f\3\2\2\2\u020f\u0218\3\2\2\2\u0210\u0212\7=\2\2\u0211"+
		"\u0210\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0215\5\u0080"+
		"A\2\u0214\u0211\3\2\2\2\u0214\u0215\3\2\2\2\u0215\u0216\3\2\2\2\u0216"+
		"\u0218\5p9\2\u0217\u020a\3\2\2\2\u0217\u0214\3\2\2\2\u0218\u0219\3\2\2"+
		"\2\u0219\u021a\7\37\2\2\u021a\u021c\5p9\2\u021b\u021d\7R\2\2\u021c\u021b"+
		"\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u021f\7\b\2\2\u021f"+
		"\u0220\5R*\2\u0220Q\3\2\2\2\u0221\u0224\5\22\n\2\u0222\u0224\5\20\t\2"+
		"\u0223\u0221\3\2\2\2\u0223\u0222\3\2\2\2\u0224S\3\2\2\2\u0225\u0226\7"+
		"D\2\2\u0226\u0227\7\35\2\2\u0227\u0228\5V,\2\u0228U\3\2\2\2\u0229\u022f"+
		"\5X-\2\u022a\u022b\5\u0094K\2\u022b\u022c\5X-\2\u022c\u022e\3\2\2\2\u022d"+
		"\u022a\3\2\2\2\u022e\u0231\3\2\2\2\u022f\u022d\3\2\2\2\u022f\u0230\3\2"+
		"\2\2\u0230W\3\2\2\2\u0231\u022f\3\2\2\2\u0232\u0233\7<\2\2\u0233\u0234"+
		"\5\u009eP\2\u0234Y\3\2\2\2\u0235\u0236\7]\2\2\u0236\u0237\5p9\2\u0237"+
		"\u0238\7^\2\2\u0238\u0239\7`\2\2\u0239\u023a\7_\2\2\u023a[\3\2\2\2\u023b"+
		"\u023c\5\b\5\2\u023c\u023f\t\r\2\2\u023d\u023e\7\60\2\2\u023e\u0240\5"+
		"p9\2\u023f\u023d\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0241\3\2\2\2\u0241"+
		"\u0242\5^\60\2\u0242]\3\2\2\2\u0243\u0249\5`\61\2\u0244\u0245\5\u0094"+
		"K\2\u0245\u0246\5`\61\2\u0246\u0248\3\2\2\2\u0247\u0244\3\2\2\2\u0248"+
		"\u024b\3\2\2\2\u0249\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u0254\3\2"+
		"\2\2\u024b\u0249\3\2\2\2\u024c\u024f\7U\2\2\u024d\u024e\t\16\2\2\u024e"+
		"\u0250\5`\61\2\u024f\u024d\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u024f\3\2"+
		"\2\2\u0251\u0252\3\2\2\2\u0252\u0254\3\2\2\2\u0253\u0243\3\2\2\2\u0253"+
		"\u024c\3\2\2\2\u0254_\3\2\2\2\u0255\u0256\78\2\2\u0256\u025a\5 \21\2\u0257"+
		"\u0258\7\6\2\2\u0258\u025a\5\"\22\2\u0259\u0255\3\2\2\2\u0259\u0257\3"+
		"\2\2\2\u025a\u025b\3\2\2\2\u025b\u025d\5\u0082B\2\u025c\u025e\5b\62\2"+
		"\u025d\u025c\3\2\2\2\u025d\u025e\3\2\2\2\u025ea\3\2\2\2\u025f\u0265\5"+
		"d\63\2\u0260\u0261\5\u0094K\2\u0261\u0262\5d\63\2\u0262\u0264\3\2\2\2"+
		"\u0263\u0260\3\2\2\2\u0264\u0267\3\2\2\2\u0265\u0263\3\2\2\2\u0265\u0266"+
		"\3\2\2\2\u0266c\3\2\2\2\u0267\u0265\3\2\2\2\u0268\u026d\5f\64\2\u0269"+
		"\u026d\5h\65\2\u026a\u026d\5j\66\2\u026b\u026d\5n8\2\u026c\u0268\3\2\2"+
		"\2\u026c\u0269\3\2\2\2\u026c\u026a\3\2\2\2\u026c\u026b\3\2\2\2\u026de"+
		"\3\2\2\2\u026e\u026f\7E\2\2\u026f\u0270\78\2\2\u0270\u0271\7)\2\2\u0271"+
		"\u0272\7C\2\2\u0272\u0273\5\u0082B\2\u0273g\3\2\2\2\u0274\u027b\7E\2\2"+
		"\u0275\u0276\5\u0082B\2\u0276\u0277\5p9\2\u0277\u027c\3\2\2\2\u0278\u0279"+
		"\5v<\2\u0279\u027a\5\u0082B\2\u027a\u027c\3\2\2\2\u027b\u0275\3\2\2\2"+
		"\u027b\u0278\3\2\2\2\u027ci\3\2\2\2\u027d\u027e\7F\2\2\u027e\u027f\78"+
		"\2\2\u027f\u0283\7\r\2\2\u0280\u0281\7H\2\2\u0281\u0283\5\u0082B\2\u0282"+
		"\u027d\3\2\2\2\u0282\u0280\3\2\2\2\u0283\u0284\3\2\2\2\u0284\u0285\5\u00aa"+
		"V\2\u0285\u0286\5p9\2\u0286k\3\2\2\2\u0287\u0288\7F\2\2\u0288\u0289\7"+
		"8\2\2\u0289\u028d\7\r\2\2\u028a\u028b\7H\2\2\u028b\u028d\5\u0082B\2\u028c"+
		"\u0287\3\2\2\2\u028c\u028a\3\2\2\2\u028d\u028e\3\2\2\2\u028e\u028f\5\u00b6"+
		"\\\2\u028fm\3\2\2\2\u0290\u0291\7F\2\2\u0291\u0292\5\u009eP\2\u0292o\3"+
		"\2\2\2\u0293\u0296\5\u0088E\2\u0294\u0296\5\u0096L\2\u0295\u0293\3\2\2"+
		"\2\u0295\u0294\3\2\2\2\u0296q\3\2\2\2\u0297\u029f\5v<\2\u0298\u029f\5"+
		"x=\2\u0299\u029f\5z>\2\u029a\u029f\5\30\r\2\u029b\u029f\5|?\2\u029c\u029f"+
		"\5~@\2\u029d\u029f\5\u0086D\2\u029e\u0297\3\2\2\2\u029e\u0298\3\2\2\2"+
		"\u029e\u0299\3\2\2\2\u029e\u029a\3\2\2\2\u029e\u029b\3\2\2\2\u029e\u029c"+
		"\3\2\2\2\u029e\u029d\3\2\2\2\u029fs\3\2\2\2\u02a0\u02a1\5r:\2\u02a1u\3"+
		"\2\2\2\u02a2\u02a3\t\17\2\2\u02a3w\3\2\2\2\u02a4\u02a5\t\20\2\2\u02a5"+
		"y\3\2\2\2\u02a6\u02a7\7X\2\2\u02a7{\3\2\2\2\u02a8\u02a9\7&\2\2\u02a9}"+
		"\3\2\2\2\u02aa\u02ac\7=\2\2\u02ab\u02aa\3\2\2\2\u02ab\u02ac\3\2\2\2\u02ac"+
		"\u02ad\3\2\2\2\u02ad\u02ae\7\t\2\2\u02ae\177\3\2\2\2\u02af\u02b0\5\u0084"+
		"C\2\u02b0\u0081\3\2\2\2\u02b1\u02b6\5\u0084C\2\u02b2\u02b5\5\u0084C\2"+
		"\u02b3\u02b5\7V\2\2\u02b4\u02b2\3\2\2\2\u02b4\u02b3\3\2\2\2\u02b5\u02b8"+
		"\3\2\2\2\u02b6\u02b4\3\2\2\2\u02b6\u02b7\3\2\2\2\u02b7\u0083\3\2\2\2\u02b8"+
		"\u02b6\3\2\2\2\u02b9\u02ba\t\21\2\2\u02ba\u0085\3\2\2\2\u02bb\u02bd\7"+
		"=\2\2\u02bc\u02bb\3\2\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02be\3\2\2\2\u02be"+
		"\u02bf\5\u0082B\2\u02bf\u0087\3\2\2\2\u02c0\u02c5\5r:\2\u02c1\u02c5\5"+
		"\u008eH\2\u02c2\u02c5\5\u0090I\2\u02c3\u02c5\5\u0092J\2\u02c4\u02c0\3"+
		"\2\2\2\u02c4\u02c1\3\2\2\2\u02c4\u02c2\3\2\2\2\u02c4\u02c3\3\2\2\2\u02c5"+
		"\u0089\3\2\2\2\u02c6\u02c9\5\u0086D\2\u02c7\u02c9\5\u008eH\2\u02c8\u02c6"+
		"\3\2\2\2\u02c8\u02c7\3\2\2\2\u02c9\u008b\3\2\2\2\u02ca\u02cd\5\u008aF"+
		"\2\u02cb\u02cd\5\u0090I\2\u02cc\u02ca\3\2\2\2\u02cc\u02cb\3\2\2\2\u02cd"+
		"\u008d\3\2\2\2\u02ce\u02d0\7=\2\2\u02cf\u02ce\3\2\2\2\u02cf\u02d0\3\2"+
		"\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d2\5\u0082B\2\u02d2\u02d3\7.\2\2\u02d3"+
		"\u02d4\5\u0088E\2\u02d4\u008f\3\2\2\2\u02d5\u02d6\5t;\2\u02d6\u02d7\7"+
		"\37\2\2\u02d7\u02d8\5\u008aF\2\u02d8\u0091\3\2\2\2\u02d9\u02da\7\6\2\2"+
		"\u02da\u02db\5p9\2\u02db\u02dc\7G\2\2\u02dc\u02dd\5\u009eP\2\u02dd\u0093"+
		"\3\2\2\2\u02de\u02e3\7R\2\2\u02df\u02e3\7\b\2\2\u02e0\u02e1\7R\2\2\u02e1"+
		"\u02e3\7\b\2\2\u02e2\u02de\3\2\2\2\u02e2\u02df\3\2\2\2\u02e2\u02e0\3\2"+
		"\2\2\u02e3\u0095\3\2\2\2\u02e4\u02e7\5\u0098M\2\u02e5\u02e7\5\u009cO\2"+
		"\u02e6\u02e4\3\2\2\2\u02e6\u02e5\3\2\2\2\u02e7\u0097\3\2\2\2\u02e8\u02ec"+
		"\5\u009aN\2\u02e9\u02ea\5\u0094K\2\u02ea\u02eb\5\u009aN\2\u02eb\u02ed"+
		"\3\2\2\2\u02ec\u02e9\3\2\2\2\u02ed\u02ee\3\2\2\2\u02ee\u02ec\3\2\2\2\u02ee"+
		"\u02ef\3\2\2\2\u02ef\u0099\3\2\2\2\u02f0\u02f3\5\u0088E\2\u02f1\u02f3"+
		"\5\u009cO\2\u02f2\u02f0\3\2\2\2\u02f2\u02f1\3\2\2\2\u02f3\u009b\3\2\2"+
		"\2\u02f4\u02f5\5\u0088E\2\u02f5\u02f6\7C\2\2\u02f6\u02f7\5\u0088E\2\u02f7"+
		"\u009d\3\2\2\2\u02f8\u02f9\5\u00a0Q\2\u02f9\u009f\3\2\2\2\u02fa\u02ff"+
		"\5\u00a2R\2\u02fb\u02fc\7\b\2\2\u02fc\u02fe\5\u00a2R\2\u02fd\u02fb\3\2"+
		"\2\2\u02fe\u0301\3\2\2\2\u02ff\u02fd\3\2\2\2\u02ff\u0300\3\2\2\2\u0300"+
		"\u00a1\3\2\2\2\u0301\u02ff\3\2\2\2\u0302\u0307\5\u00a4S\2\u0303\u0304"+
		"\7/\2\2\u0304\u0306\5\u00a4S\2\u0305\u0303\3\2\2\2\u0306\u0309\3\2\2\2"+
		"\u0307\u0305\3\2\2\2\u0307\u0308\3\2\2\2\u0308\u00a3\3\2\2\2\u0309\u0307"+
		"\3\2\2\2\u030a\u030e\5\u00a6T\2\u030b\u030e\5\u00a8U\2\u030c\u030e\5\u00b4"+
		"[\2\u030d\u030a\3\2\2\2\u030d\u030b\3\2\2\2\u030d\u030c\3\2\2\2\u030e"+
		"\u00a5\3\2\2\2\u030f\u0311\5\u0088E\2\u0310\u030f\3\2\2\2\u0310\u0311"+
		"\3\2\2\2\u0311\u0312\3\2\2\2\u0312\u0313\t\5\2\2\u0313\u0314\5,\27\2\u0314"+
		"\u00a7\3\2\2\2\u0315\u0317\5\u0088E\2\u0316\u0315\3\2\2\2\u0316\u0317"+
		"\3\2\2\2\u0317\u0318\3\2\2\2\u0318\u0319\5\u00aaV\2\u0319\u031a\5\u0088"+
		"E\2\u031a\u00a9\3\2\2\2\u031b\u0320\5\u00acW\2\u031c\u0320\5\u00aeX\2"+
		"\u031d\u0320\5\u00b0Y\2\u031e\u0320\5\u00b2Z\2\u031f\u031b\3\2\2\2\u031f"+
		"\u031c\3\2\2\2\u031f\u031d\3\2\2\2\u031f\u031e\3\2\2\2\u0320\u00ab\3\2"+
		"\2\2\u0321\u032f\7%\2\2\u0322\u032f\7\13\2\2\u0323\u0324\t\4\2\2\u0324"+
		"\u032f\7-\2\2\u0325\u0326\t\4\2\2\u0326\u0327\7=\2\2\u0327\u0328\7\67"+
		"\2\2\u0328\u032f\7\f\2\2\u0329\u032a\t\4\2\2\u032a\u032b\7-\2\2\u032b"+
		"\u032c\7=\2\2\u032c\u032d\7\67\2\2\u032d\u032f\7\f\2\2\u032e\u0321\3\2"+
		"\2\2\u032e\u0322\3\2\2\2\u032e\u0323\3\2\2\2\u032e\u0325\3\2\2\2\u032e"+
		"\u0329\3\2\2\2\u032f\u00ad\3\2\2\2\u0330\u0331\t\4\2\2\u0331\u0332\7\'"+
		"\2\2\u0332\u0345\7;\2\2\u0333\u0334\t\4\2\2\u0334\u0335\7-\2\2\u0335\u0336"+
		"\7\'\2\2\u0336\u0345\7;\2\2\u0337\u0338\t\4\2\2\u0338\u0339\7\'\2\2\u0339"+
		"\u0345\7\33\2\2\u033a\u033b\t\4\2\2\u033b\u033c\7 \2\2\u033c\u0345\7;"+
		"\2\2\u033d\u033e\t\4\2\2\u033e\u033f\7 \2\2\u033f\u0345\7\33\2\2\u0340"+
		"\u0341\t\4\2\2\u0341\u0342\7-\2\2\u0342\u0343\7 \2\2\u0343\u0345\7;\2"+
		"\2\u0344\u0330\3\2\2\2\u0344\u0333\3\2\2\2\u0344\u0337\3\2\2\2\u0344\u033a"+
		"\3\2\2\2\u0344\u033d\3\2\2\2\u0344\u0340\3\2\2\2\u0345\u00af\3\2\2\2\u0346"+
		"\u034c\7\23\2\2\u0347\u034c\7\24\2\2\u0348\u0349\t\22\2\2\u0349\u034a"+
		"\7-\2\2\u034a\u034c\7\23\2\2\u034b\u0346\3\2\2\2\u034b\u0347\3\2\2\2\u034b"+
		"\u0348\3\2\2\2\u034c\u00b1\3\2\2\2\u034d\u034e\t\r\2\2\u034e\u00b3\3\2"+
		"\2\2\u034f\u0351\5\u0088E\2\u0350\u034f\3\2\2\2\u0350\u0351\3\2\2\2\u0351"+
		"\u0352\3\2\2\2\u0352\u0353\5\u00b6\\\2\u0353\u00b5\3\2\2\2\u0354\u0355"+
		"\t\4\2\2\u0355\u035a\7\32\2\2\u0356\u0357\t\4\2\2\u0357\u0358\7-\2\2\u0358"+
		"\u035a\7\32\2\2\u0359\u0354\3\2\2\2\u0359\u0356\3\2\2\2\u035a\u00b7\3"+
		"\2\2\2_\u00bb\u00c4\u00cd\u00d0\u00db\u00df\u00ed\u00f5\u00fb\u00ff\u010b"+
		"\u0110\u011b\u0120\u0123\u0129\u012b\u0134\u0136\u0139\u0143\u0146\u0148"+
		"\u014e\u0154\u015d\u0164\u0166\u016e\u0173\u017b\u0182\u018a\u0191\u0194"+
		"\u019b\u019e\u01a3\u01a9\u01af\u01b9\u01bf\u01c3\u01cd\u01d4\u01da\u01e1"+
		"\u01e4\u01ec\u01ef\u020e\u0211\u0214\u0217\u021c\u0223\u022f\u023f\u0249"+
		"\u0251\u0253\u0259\u025d\u0265\u026c\u027b\u0282\u028c\u0295\u029e\u02ab"+
		"\u02b4\u02b6\u02bc\u02c4\u02c8\u02cc\u02cf\u02e2\u02e6\u02ee\u02f2\u02ff"+
		"\u0307\u030d\u0310\u0316\u031f\u032e\u0344\u034b\u0350\u0359";
	public static final ATN _ATN =
		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
	static {
		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy