#!/usr/bin/env python # # Copyright 2007 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import sys from antlr3 import * from antlr3.compat import set, frozenset allOrdinals = set([1, 2, 3, 4, 5]) numOrdinals = len(allOrdinals) HIDDEN = BaseRecognizer.HIDDEN THIRD=12 SEPTEMBER=35 FOURTH=13 SECOND=11 WEDNESDAY=21 NOVEMBER=37 SATURDAY=24 JULY=33 APRIL=30 DIGITS=8 OCTOBER=36 MAY=31 EVERY=6 FEBRUARY=28 MONDAY=19 SUNDAY=25 JUNE=32 DAY=18 MARCH=29 OF=4 EOF=-1 JANUARY=27 MONTH=26 FRIDAY=23 FIFTH=14 MINUTES=17 TIME=5 WS=40 QUARTER=39 THURSDAY=22 COMMA=9 DECEMBER=38 AUGUST=34 DIGIT=7 TUESDAY=20 HOURS=16 FIRST=10 FOURTH_OR_FIFTH=15 tokenNames = [ "", "", "", "", "OF", "TIME", "EVERY", "DIGIT", "DIGITS", "COMMA", "FIRST", "SECOND", "THIRD", "FOURTH", "FIFTH", "FOURTH_OR_FIFTH", "HOURS", "MINUTES", "DAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY", "MONTH", "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER", "QUARTER", "WS" ] class GrocParser(Parser): grammarFileName = "Groc.g" antlr_version = version_str_to_tuple("3.1.1") antlr_version_str = "3.1.1" tokenNames = tokenNames def __init__(self, input, state=None): if state is None: state = RecognizerSharedState() Parser.__init__(self, input, state) self.dfa3 = self.DFA3( self, 3, eot = self.DFA3_eot, eof = self.DFA3_eof, min = self.DFA3_min, max = self.DFA3_max, accept = self.DFA3_accept, special = self.DFA3_special, transition = self.DFA3_transition ) self.ordinal_set = set() self.weekday_set = set() self.month_set = set() self.time_string = ''; self.interval_mins = 0; self.period_string = ''; valuesDict = { SUNDAY: 0, FIRST: 1, MONDAY: 1, JANUARY: 1, TUESDAY: 2, SECOND: 2, FEBRUARY: 2, WEDNESDAY: 3, THIRD: 3, MARCH: 3, THURSDAY: 4, FOURTH: 4, APRIL: 4, FRIDAY: 5, FIFTH: 5, MAY: 5, SATURDAY: 6, JUNE: 6, JULY: 7, AUGUST: 8, SEPTEMBER: 9, OCTOBER: 10, NOVEMBER: 11, DECEMBER: 12, } def ValueOf(self, token_type): return self.valuesDict.get(token_type, -1) def timespec(self, ): try: try: pass alt1 = 2 LA1_0 = self.input.LA(1) if (LA1_0 == EVERY) : LA1_1 = self.input.LA(2) if ((DIGIT <= LA1_1 <= DIGITS)) : alt1 = 2 elif ((DAY <= LA1_1 <= SUNDAY)) : alt1 = 1 else: nvae = NoViableAltException("", 1, 1, self.input) raise nvae elif ((FIRST <= LA1_0 <= FOURTH_OR_FIFTH)) : alt1 = 1 else: nvae = NoViableAltException("", 1, 0, self.input) raise nvae if alt1 == 1: pass self._state.following.append(self.FOLLOW_specifictime_in_timespec44) self.specifictime() self._state.following.pop() elif alt1 == 2: pass self._state.following.append(self.FOLLOW_interval_in_timespec48) self.interval() self._state.following.pop() except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def specifictime(self, ): TIME1 = None try: try: pass pass alt3 = 2 alt3 = self.dfa3.predict(self.input) if alt3 == 1: pass pass pass self._state.following.append(self.FOLLOW_ordinals_in_specifictime69) self.ordinals() self._state.following.pop() self._state.following.append(self.FOLLOW_weekdays_in_specifictime71) self.weekdays() self._state.following.pop() self.match(self.input, OF, self.FOLLOW_OF_in_specifictime74) alt2 = 2 LA2_0 = self.input.LA(1) if ((MONTH <= LA2_0 <= DECEMBER)) : alt2 = 1 elif ((FIRST <= LA2_0 <= THIRD) or LA2_0 == QUARTER) : alt2 = 2 else: nvae = NoViableAltException("", 2, 0, self.input) raise nvae if alt2 == 1: pass self._state.following.append(self.FOLLOW_monthspec_in_specifictime77) self.monthspec() self._state.following.pop() elif alt2 == 2: pass self._state.following.append(self.FOLLOW_quarterspec_in_specifictime79) self.quarterspec() self._state.following.pop() elif alt3 == 2: pass pass self._state.following.append(self.FOLLOW_ordinals_in_specifictime96) self.ordinals() self._state.following.pop() self._state.following.append(self.FOLLOW_weekdays_in_specifictime98) self.weekdays() self._state.following.pop() self.month_set = set(range(1,13)) TIME1=self.match(self.input, TIME, self.FOLLOW_TIME_in_specifictime112) self.time_string = TIME1.text except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def interval(self, ): intervalnum = None period2 = None try: try: pass pass self.match(self.input, EVERY, self.FOLLOW_EVERY_in_interval131) intervalnum = self.input.LT(1) if (DIGIT <= self.input.LA(1) <= DIGITS): self.input.consume() self._state.errorRecovery = False else: mse = MismatchedSetException(None, self.input) raise mse self.interval_mins = int(intervalnum.text) self._state.following.append(self.FOLLOW_period_in_interval157) period2 = self.period() self._state.following.pop() if ((period2 is not None) and [self.input.toString(period2.start,period2.stop)] or [None])[0] == "hours": self.period_string = "hours" else: self.period_string = "minutes" except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def ordinals(self, ): try: try: pass alt5 = 2 LA5_0 = self.input.LA(1) if (LA5_0 == EVERY) : alt5 = 1 elif ((FIRST <= LA5_0 <= FOURTH_OR_FIFTH)) : alt5 = 2 else: nvae = NoViableAltException("", 5, 0, self.input) raise nvae if alt5 == 1: pass self.match(self.input, EVERY, self.FOLLOW_EVERY_in_ordinals176) self.ordinal_set = self.ordinal_set.union(allOrdinals) elif alt5 == 2: pass pass self._state.following.append(self.FOLLOW_ordinal_in_ordinals192) self.ordinal() self._state.following.pop() while True: alt4 = 2 LA4_0 = self.input.LA(1) if (LA4_0 == COMMA) : alt4 = 1 if alt4 == 1: pass self.match(self.input, COMMA, self.FOLLOW_COMMA_in_ordinals195) self._state.following.append(self.FOLLOW_ordinal_in_ordinals197) self.ordinal() self._state.following.pop() else: break except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def ordinal(self, ): ord = None try: try: pass ord = self.input.LT(1) if (FIRST <= self.input.LA(1) <= FOURTH_OR_FIFTH): self.input.consume() self._state.errorRecovery = False else: mse = MismatchedSetException(None, self.input) raise mse self.ordinal_set.add(self.ValueOf(ord.type)); except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return class period_return(ParserRuleReturnScope): def __init__(self): ParserRuleReturnScope.__init__(self) def period(self, ): retval = self.period_return() retval.start = self.input.LT(1) try: try: pass if (HOURS <= self.input.LA(1) <= MINUTES): self.input.consume() self._state.errorRecovery = False else: mse = MismatchedSetException(None, self.input) raise mse retval.stop = self.input.LT(-1) except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return retval def weekdays(self, ): try: try: pass alt7 = 2 LA7_0 = self.input.LA(1) if (LA7_0 == DAY) : alt7 = 1 elif ((MONDAY <= LA7_0 <= SUNDAY)) : alt7 = 2 else: nvae = NoViableAltException("", 7, 0, self.input) raise nvae if alt7 == 1: pass self.match(self.input, DAY, self.FOLLOW_DAY_in_weekdays280) self.weekday_set = set([self.ValueOf(SUNDAY), self.ValueOf(MONDAY), self.ValueOf(TUESDAY), self.ValueOf(WEDNESDAY), self.ValueOf(THURSDAY), self.ValueOf(FRIDAY), self.ValueOf(SATURDAY), self.ValueOf(SUNDAY)]) elif alt7 == 2: pass pass self._state.following.append(self.FOLLOW_weekday_in_weekdays288) self.weekday() self._state.following.pop() while True: alt6 = 2 LA6_0 = self.input.LA(1) if (LA6_0 == COMMA) : alt6 = 1 if alt6 == 1: pass self.match(self.input, COMMA, self.FOLLOW_COMMA_in_weekdays291) self._state.following.append(self.FOLLOW_weekday_in_weekdays293) self.weekday() self._state.following.pop() else: break except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def weekday(self, ): dayname = None try: try: pass dayname = self.input.LT(1) if (MONDAY <= self.input.LA(1) <= SUNDAY): self.input.consume() self._state.errorRecovery = False else: mse = MismatchedSetException(None, self.input) raise mse self.weekday_set.add(self.ValueOf(dayname.type)) except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def monthspec(self, ): try: try: pass alt8 = 2 LA8_0 = self.input.LA(1) if (LA8_0 == MONTH) : alt8 = 1 elif ((JANUARY <= LA8_0 <= DECEMBER)) : alt8 = 2 else: nvae = NoViableAltException("", 8, 0, self.input) raise nvae if alt8 == 1: pass self.match(self.input, MONTH, self.FOLLOW_MONTH_in_monthspec373) self.month_set = self.month_set.union(set([ self.ValueOf(JANUARY), self.ValueOf(FEBRUARY), self.ValueOf(MARCH), self.ValueOf(APRIL), self.ValueOf(MAY), self.ValueOf(JUNE), self.ValueOf(JULY), self.ValueOf(AUGUST), self.ValueOf(SEPTEMBER), self.ValueOf(OCTOBER), self.ValueOf(NOVEMBER), self.ValueOf(DECEMBER)])) elif alt8 == 2: pass self._state.following.append(self.FOLLOW_months_in_monthspec383) self.months() self._state.following.pop() except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def months(self, ): try: try: pass pass self._state.following.append(self.FOLLOW_month_in_months400) self.month() self._state.following.pop() while True: alt9 = 2 LA9_0 = self.input.LA(1) if (LA9_0 == COMMA) : alt9 = 1 if alt9 == 1: pass self.match(self.input, COMMA, self.FOLLOW_COMMA_in_months403) self._state.following.append(self.FOLLOW_month_in_months405) self.month() self._state.following.pop() else: break except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def month(self, ): monthname = None try: try: pass monthname = self.input.LT(1) if (JANUARY <= self.input.LA(1) <= DECEMBER): self.input.consume() self._state.errorRecovery = False else: mse = MismatchedSetException(None, self.input) raise mse self.month_set.add(self.ValueOf(monthname.type)); except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def quarterspec(self, ): try: try: pass alt10 = 2 LA10_0 = self.input.LA(1) if (LA10_0 == QUARTER) : alt10 = 1 elif ((FIRST <= LA10_0 <= THIRD)) : alt10 = 2 else: nvae = NoViableAltException("", 10, 0, self.input) raise nvae if alt10 == 1: pass self.match(self.input, QUARTER, self.FOLLOW_QUARTER_in_quarterspec497) self.month_set = self.month_set.union(set([ self.ValueOf(JANUARY), self.ValueOf(APRIL), self.ValueOf(JULY), self.ValueOf(OCTOBER)])) elif alt10 == 2: pass pass self._state.following.append(self.FOLLOW_quarter_ordinals_in_quarterspec509) self.quarter_ordinals() self._state.following.pop() self.match(self.input, MONTH, self.FOLLOW_MONTH_in_quarterspec511) self.match(self.input, OF, self.FOLLOW_OF_in_quarterspec513) self.match(self.input, QUARTER, self.FOLLOW_QUARTER_in_quarterspec515) except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def quarter_ordinals(self, ): try: try: pass pass self._state.following.append(self.FOLLOW_month_of_quarter_ordinal_in_quarter_ordinals534) self.month_of_quarter_ordinal() self._state.following.pop() while True: alt11 = 2 LA11_0 = self.input.LA(1) if (LA11_0 == COMMA) : alt11 = 1 if alt11 == 1: pass self.match(self.input, COMMA, self.FOLLOW_COMMA_in_quarter_ordinals537) self._state.following.append(self.FOLLOW_month_of_quarter_ordinal_in_quarter_ordinals539) self.month_of_quarter_ordinal() self._state.following.pop() else: break except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return def month_of_quarter_ordinal(self, ): offset = None try: try: pass offset = self.input.LT(1) if (FIRST <= self.input.LA(1) <= THIRD): self.input.consume() self._state.errorRecovery = False else: mse = MismatchedSetException(None, self.input) raise mse jOffset = self.ValueOf(offset.type) - 1 self.month_set = self.month_set.union(set([ jOffset + self.ValueOf(JANUARY), jOffset + self.ValueOf(APRIL), jOffset + self.ValueOf(JULY), jOffset + self.ValueOf(OCTOBER)])) except RecognitionException, re: self.reportError(re) self.recover(self.input, re) finally: pass return DFA3_eot = DFA.unpack( u"\13\uffff" ) DFA3_eof = DFA.unpack( u"\13\uffff" ) DFA3_min = DFA.unpack( u"\1\6\1\22\1\11\2\4\1\12\2\uffff\1\23\1\11\1\4" ) DFA3_max = DFA.unpack( u"\1\17\2\31\1\5\1\11\1\17\2\uffff\2\31\1\11" ) DFA3_accept = DFA.unpack( u"\6\uffff\1\1\1\2\3\uffff" ) DFA3_special = DFA.unpack( u"\13\uffff" ) DFA3_transition = [ DFA.unpack(u"\1\1\3\uffff\6\2"), DFA.unpack(u"\1\3\7\4"), DFA.unpack(u"\1\5\10\uffff\1\3\7\4"), DFA.unpack(u"\1\6\1\7"), DFA.unpack(u"\1\6\1\7\3\uffff\1\10"), DFA.unpack(u"\6\11"), DFA.unpack(u""), DFA.unpack(u""), DFA.unpack(u"\7\12"), DFA.unpack(u"\1\5\10\uffff\1\3\7\4"), DFA.unpack(u"\1\6\1\7\3\uffff\1\10") ] DFA3 = DFA FOLLOW_specifictime_in_timespec44 = frozenset([1]) FOLLOW_interval_in_timespec48 = frozenset([1]) FOLLOW_ordinals_in_specifictime69 = frozenset([18, 19, 20, 21, 22, 23, 24, 25]) FOLLOW_weekdays_in_specifictime71 = frozenset([4]) FOLLOW_OF_in_specifictime74 = frozenset([10, 11, 12, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]) FOLLOW_monthspec_in_specifictime77 = frozenset([5]) FOLLOW_quarterspec_in_specifictime79 = frozenset([5]) FOLLOW_ordinals_in_specifictime96 = frozenset([18, 19, 20, 21, 22, 23, 24, 25]) FOLLOW_weekdays_in_specifictime98 = frozenset([5]) FOLLOW_TIME_in_specifictime112 = frozenset([1]) FOLLOW_EVERY_in_interval131 = frozenset([7, 8]) FOLLOW_set_in_interval141 = frozenset([16, 17]) FOLLOW_period_in_interval157 = frozenset([1]) FOLLOW_EVERY_in_ordinals176 = frozenset([1]) FOLLOW_ordinal_in_ordinals192 = frozenset([1, 9]) FOLLOW_COMMA_in_ordinals195 = frozenset([10, 11, 12, 13, 14, 15]) FOLLOW_ordinal_in_ordinals197 = frozenset([1, 9]) FOLLOW_set_in_ordinal218 = frozenset([1]) FOLLOW_set_in_period257 = frozenset([1]) FOLLOW_DAY_in_weekdays280 = frozenset([1]) FOLLOW_weekday_in_weekdays288 = frozenset([1, 9]) FOLLOW_COMMA_in_weekdays291 = frozenset([18, 19, 20, 21, 22, 23, 24, 25]) FOLLOW_weekday_in_weekdays293 = frozenset([1, 9]) FOLLOW_set_in_weekday314 = frozenset([1]) FOLLOW_MONTH_in_monthspec373 = frozenset([1]) FOLLOW_months_in_monthspec383 = frozenset([1]) FOLLOW_month_in_months400 = frozenset([1, 9]) FOLLOW_COMMA_in_months403 = frozenset([26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38]) FOLLOW_month_in_months405 = frozenset([1, 9]) FOLLOW_set_in_month424 = frozenset([1]) FOLLOW_QUARTER_in_quarterspec497 = frozenset([1]) FOLLOW_quarter_ordinals_in_quarterspec509 = frozenset([26]) FOLLOW_MONTH_in_quarterspec511 = frozenset([4]) FOLLOW_OF_in_quarterspec513 = frozenset([39]) FOLLOW_QUARTER_in_quarterspec515 = frozenset([1]) FOLLOW_month_of_quarter_ordinal_in_quarter_ordinals534 = frozenset([1, 9]) FOLLOW_COMMA_in_quarter_ordinals537 = frozenset([10, 11, 12, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]) FOLLOW_month_of_quarter_ordinal_in_quarter_ordinals539 = frozenset([1, 9]) FOLLOW_set_in_month_of_quarter_ordinal558 = frozenset([1]) def main(argv, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr): from antlr3.main import ParserMain main = ParserMain("GrocLexer", GrocParser) main.stdin = stdin main.stdout = stdout main.stderr = stderr main.execute(argv) if __name__ == '__main__': main(sys.argv)