Gu#br9f9^{!$=sc1^V8zyEYFOVyl9SR9uWp7^jR?F_(|v
zCwIrg0*jC7CyPxQ`EC^&wh6eI4}JZnz>>`NrI%?Qx}huBuA&FM)RWP$GzK>E0IN{~
z!)W?&sR}oC2$Ypq1m@&ZdPc-l#E~Gn`mTtX3LZ0pP2xSoF{9RYJ)G!a!(ml6?+WXE
za*)deN~$o?FY{n(m2D=orF?i$lfcFgYPO{`#Xp)~0_6(5m_Yva`_31s-MS8)Swq=(@|JlP+kkqem!
z+10R3??qC<$7kWd9$}bvx_B{&4N~|gReTCJ^N?ZL!!3YGcWl{%NP2K9D`0i?idEGs
z72GDUG@~``sZ&C$ZfZ@Msd@1k+@a!5d{#iE@8KPtx*>NT)@u3Ov&h^PnaQ6MsL7}-
z`xfKHKHM!EVnRB+U&TH60s|k@cIdK3?Bmc0BVKdXB7L$zU
zmsEUN9&!poftHTu_J%;Ht)aC!DES^xF(mnlC0}rNY+E842~RUVsN$exEDQy^TGwt0
zv^1tT6^sg;lF`MP(^gBYFY3hz4okNlVsV#eusy?)ESZOKM8UXo890(W~M@RW*g;F~NDGttPCM}uK#EPEHj)+lMdt>QcQE?;-gFtaY}(#rpPpE2Kg`BxADyI<=T!U%&ohrGVv5z?
zw=1(&owV}5h-vRp{6xn6h3xzLTrTdh1gj$yI*sk7h3U^mz)o<;}
zmh+j?VR2>ao-;%g?<3cGLyN^UV_hWGB^Z6O&PjcCGt#ED5*gs&R05|waC6CWWpOs;
zQ|TyMaE5K3_rj^2o*pu7!aG{EKFebTZ}K=kV^&A6k+>`cg?D;WC*HG<4-_)JAJAb>
zU6@;-b@%WF6a7Y5mwq!{)ArJ8sf9JxrYFr-T~-0*sx9%jZZt-t+E@Mg+p-kRNI4YAD3_j=MMf{Yh_A`zh_&MjlNSnXJc|qFzWzLJz=C5%6
z%e48gIRACpT*~`R+FZ)xb(OkGWJkB2Y|xe+yboJXUa4uxZ#f2j$A34i`#qoY@dx~I
z+S0|G^Lohj0(j+S!#A&Twj3^g1IN3MKy*2M&S00zmlN#D@hQOrTo?EgzokrI9yz(`
z*qoI%=W!`cAsKTeW8NIbg=FNeV>7O@8B0BuO3BFo9R9m~`N1y5S2#z&QnLP;0-To3
zWt>TSTtg_HZDT_QBn19~zuL;vc<0ULT~C_7;qNwODW6h{(^op1a3f#*W7?lIkqc&1
zwvqCm8AL9gO?W;D|Ap81{VH{)iCi+9vV%0dv)h!l;IB92DD_v4;vN1mEbsCUVaX7x
zhp=)KXB@!{~B=qmb(`!Vc8?i`??n2qIhjMY-9i%3OC$K3kS^
z$K=zbjP6HGTV>Tj7?#AU!`SJRA~*Xv+{2+oqMqfFgZZvUDi6@edFVv~eb#f31}AVG
z&yC>!P1e(4W$Yz<4;ZYzBu6{3fXDt*up3p_gEhDuXX6Sq^0eK8D|z|53YXw&%Do;@
z9%~ak4fo+1^y69#Q2KRTzk#1YK5yppR@{i!DSaVaZ(xnWpU@_81{?}}978DR+os?R
z4<41#K4=qM%kYfgqg&E}{@4_{|2LpJ`I{ba7lFQ;K;J{4?lEx2zJf_Yn1Xn3
z7Kr()WC~&yl8YapcMOAR5Z^?Im7Fw)^CiT@{1eRB0y$;|b8KZ@Rcqz)gZQ+C*YcUf
z>w%@WS);S+Aio34*t
MAeV1_!h_uZ0HYf~SpWb4
literal 0
HcmV?d00001
diff --git a/HelloParser.java b/HelloParser.java
new file mode 100644
index 0000000..17662e9
--- /dev/null
+++ b/HelloParser.java
@@ -0,0 +1,253 @@
+// Generated from Hello.g4 by ANTLR 4.13.2
+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", "CheckReturnValue", "this-escape"})
+public class HelloParser extends Parser {
+ static { RuntimeMetaData.checkVersion("4.13.2", RuntimeMetaData.VERSION); }
+
+ protected static final DFA[] _decisionToDFA;
+ protected static final PredictionContextCache _sharedContextCache =
+ new PredictionContextCache();
+ public static final int
+ T__0=1, T__1=2, ID=3, WS=4;
+ public static final int
+ RULE_greeting = 0, RULE_greet = 1, RULE_start = 2;
+ private static String[] makeRuleNames() {
+ return new String[] {
+ "greeting", "greet", "start"
+ };
+ }
+ public static final String[] ruleNames = makeRuleNames();
+
+ private static String[] makeLiteralNames() {
+ return new String[] {
+ null, "'hello'", "'hi'"
+ };
+ }
+ private static final String[] _LITERAL_NAMES = makeLiteralNames();
+ private static String[] makeSymbolicNames() {
+ return new String[] {
+ null, null, null, "ID", "WS"
+ };
+ }
+ 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 "Hello.g4"; }
+
+ @Override
+ public String[] getRuleNames() { return ruleNames; }
+
+ @Override
+ public String getSerializedATN() { return _serializedATN; }
+
+ @Override
+ public ATN getATN() { return _ATN; }
+
+ public HelloParser(TokenStream input) {
+ super(input);
+ _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+ }
+
+ @SuppressWarnings("CheckReturnValue")
+ public static class GreetingContext extends ParserRuleContext {
+ public List greet() {
+ return getRuleContexts(GreetContext.class);
+ }
+ public GreetContext greet(int i) {
+ return getRuleContext(GreetContext.class,i);
+ }
+ public GreetingContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_greeting; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof HelloListener ) ((HelloListener)listener).enterGreeting(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof HelloListener ) ((HelloListener)listener).exitGreeting(this);
+ }
+ }
+
+ public final GreetingContext greeting() throws RecognitionException {
+ GreetingContext _localctx = new GreetingContext(_ctx, getState());
+ enterRule(_localctx, 0, RULE_greeting);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(7);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ do {
+ {
+ {
+ setState(6);
+ greet();
+ }
+ }
+ setState(9);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ } while ( _la==T__0 || _la==T__1 );
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ @SuppressWarnings("CheckReturnValue")
+ public static class GreetContext extends ParserRuleContext {
+ public GreetContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_greet; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof HelloListener ) ((HelloListener)listener).enterGreet(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof HelloListener ) ((HelloListener)listener).exitGreet(this);
+ }
+ }
+
+ public final GreetContext greet() throws RecognitionException {
+ GreetContext _localctx = new GreetContext(_ctx, getState());
+ enterRule(_localctx, 2, RULE_greet);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(11);
+ _la = _input.LA(1);
+ if ( !(_la==T__0 || _la==T__1) ) {
+ _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;
+ }
+
+ @SuppressWarnings("CheckReturnValue")
+ public static class StartContext extends ParserRuleContext {
+ public TerminalNode ID() { return getToken(HelloParser.ID, 0); }
+ public StartContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_start; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof HelloListener ) ((HelloListener)listener).enterStart(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof HelloListener ) ((HelloListener)listener).exitStart(this);
+ }
+ }
+
+ public final StartContext start() throws RecognitionException {
+ StartContext _localctx = new StartContext(_ctx, getState());
+ enterRule(_localctx, 4, RULE_start);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(13);
+ match(T__0);
+ setState(14);
+ match(ID);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static final String _serializedATN =
+ "\u0004\u0001\u0004\u0011\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+
+ "\u0002\u0002\u0007\u0002\u0001\u0000\u0004\u0000\b\b\u0000\u000b\u0000"+
+ "\f\u0000\t\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002"+
+ "\u0001\u0002\u0000\u0000\u0003\u0000\u0002\u0004\u0000\u0001\u0001\u0000"+
+ "\u0001\u0002\u000e\u0000\u0007\u0001\u0000\u0000\u0000\u0002\u000b\u0001"+
+ "\u0000\u0000\u0000\u0004\r\u0001\u0000\u0000\u0000\u0006\b\u0003\u0002"+
+ "\u0001\u0000\u0007\u0006\u0001\u0000\u0000\u0000\b\t\u0001\u0000\u0000"+
+ "\u0000\t\u0007\u0001\u0000\u0000\u0000\t\n\u0001\u0000\u0000\u0000\n\u0001"+
+ "\u0001\u0000\u0000\u0000\u000b\f\u0007\u0000\u0000\u0000\f\u0003\u0001"+
+ "\u0000\u0000\u0000\r\u000e\u0005\u0001\u0000\u0000\u000e\u000f\u0005\u0003"+
+ "\u0000\u0000\u000f\u0005\u0001\u0000\u0000\u0000\u0001\t";
+ 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);
+ }
+ }
+}
\ No newline at end of file
diff --git a/HelloParser.py b/HelloParser.py
index a3f300c..2f5d9c6 100644
--- a/HelloParser.py
+++ b/HelloParser.py
@@ -10,8 +10,15 @@ else:
def serializedATN():
return [
- 4,1,3,6,2,0,7,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,4,0,2,1,0,0,0,2,3,5,
- 1,0,0,3,4,5,2,0,0,4,1,1,0,0,0,0
+ 4,1,6,29,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,1,0,4,0,12,8,0,
+ 11,0,12,0,13,1,1,4,1,17,8,1,11,1,12,1,18,1,2,1,2,1,3,1,3,1,3,1,4,
+ 1,4,1,4,1,4,0,0,5,0,2,4,6,8,0,2,1,0,1,2,1,0,3,4,25,0,11,1,0,0,0,
+ 2,16,1,0,0,0,4,20,1,0,0,0,6,22,1,0,0,0,8,25,1,0,0,0,10,12,3,4,2,
+ 0,11,10,1,0,0,0,12,13,1,0,0,0,13,11,1,0,0,0,13,14,1,0,0,0,14,1,1,
+ 0,0,0,15,17,3,8,4,0,16,15,1,0,0,0,17,18,1,0,0,0,18,16,1,0,0,0,18,
+ 19,1,0,0,0,19,3,1,0,0,0,20,21,7,0,0,0,21,5,1,0,0,0,22,23,5,1,0,0,
+ 23,24,5,5,0,0,24,7,1,0,0,0,25,26,7,1,0,0,26,27,5,5,0,0,27,9,1,0,
+ 0,0,2,13,18
]
class HelloParser ( Parser ):
@@ -24,18 +31,26 @@ class HelloParser ( Parser ):
sharedContextCache = PredictionContextCache()
- literalNames = [ "", "'hello'" ]
+ literalNames = [ "", "'hello'", "'hi'", "'bye'", "'goodbye'" ]
- symbolicNames = [ "", "", "ID", "WS" ]
+ symbolicNames = [ "", "", "", "",
+ "", "ID", "WS" ]
- RULE_start = 0
+ RULE_greeting = 0
+ RULE_leaving = 1
+ RULE_greet = 2
+ RULE_start = 3
+ RULE_bye = 4
- ruleNames = [ "start" ]
+ ruleNames = [ "greeting", "leaving", "greet", "start", "bye" ]
EOF = Token.EOF
T__0=1
- ID=2
- WS=3
+ T__1=2
+ T__2=3
+ T__3=4
+ ID=5
+ WS=6
def __init__(self, input:TokenStream, output:TextIO = sys.stdout):
super().__init__(input, output)
@@ -46,6 +61,163 @@ class HelloParser ( Parser ):
+ class GreetingContext(ParserRuleContext):
+ __slots__ = 'parser'
+
+ def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
+ super().__init__(parent, invokingState)
+ self.parser = parser
+
+ def greet(self, i:int=None):
+ if i is None:
+ return self.getTypedRuleContexts(HelloParser.GreetContext)
+ else:
+ return self.getTypedRuleContext(HelloParser.GreetContext,i)
+
+
+ def getRuleIndex(self):
+ return HelloParser.RULE_greeting
+
+ def enterRule(self, listener:ParseTreeListener):
+ if hasattr( listener, "enterGreeting" ):
+ listener.enterGreeting(self)
+
+ def exitRule(self, listener:ParseTreeListener):
+ if hasattr( listener, "exitGreeting" ):
+ listener.exitGreeting(self)
+
+
+
+
+ def greeting(self):
+
+ localctx = HelloParser.GreetingContext(self, self._ctx, self.state)
+ self.enterRule(localctx, 0, self.RULE_greeting)
+ self._la = 0 # Token type
+ try:
+ self.enterOuterAlt(localctx, 1)
+ self.state = 11
+ self._errHandler.sync(self)
+ _la = self._input.LA(1)
+ while True:
+ self.state = 10
+ self.greet()
+ self.state = 13
+ self._errHandler.sync(self)
+ _la = self._input.LA(1)
+ if not (_la==1 or _la==2):
+ break
+
+ except RecognitionException as re:
+ localctx.exception = re
+ self._errHandler.reportError(self, re)
+ self._errHandler.recover(self, re)
+ finally:
+ self.exitRule()
+ return localctx
+
+
+ class LeavingContext(ParserRuleContext):
+ __slots__ = 'parser'
+
+ def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
+ super().__init__(parent, invokingState)
+ self.parser = parser
+
+ def bye(self, i:int=None):
+ if i is None:
+ return self.getTypedRuleContexts(HelloParser.ByeContext)
+ else:
+ return self.getTypedRuleContext(HelloParser.ByeContext,i)
+
+
+ def getRuleIndex(self):
+ return HelloParser.RULE_leaving
+
+ def enterRule(self, listener:ParseTreeListener):
+ if hasattr( listener, "enterLeaving" ):
+ listener.enterLeaving(self)
+
+ def exitRule(self, listener:ParseTreeListener):
+ if hasattr( listener, "exitLeaving" ):
+ listener.exitLeaving(self)
+
+
+
+
+ def leaving(self):
+
+ localctx = HelloParser.LeavingContext(self, self._ctx, self.state)
+ self.enterRule(localctx, 2, self.RULE_leaving)
+ self._la = 0 # Token type
+ try:
+ self.enterOuterAlt(localctx, 1)
+ self.state = 16
+ self._errHandler.sync(self)
+ _la = self._input.LA(1)
+ while True:
+ self.state = 15
+ self.bye()
+ self.state = 18
+ self._errHandler.sync(self)
+ _la = self._input.LA(1)
+ if not (_la==3 or _la==4):
+ break
+
+ except RecognitionException as re:
+ localctx.exception = re
+ self._errHandler.reportError(self, re)
+ self._errHandler.recover(self, re)
+ finally:
+ self.exitRule()
+ return localctx
+
+
+ class GreetContext(ParserRuleContext):
+ __slots__ = 'parser'
+
+ def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
+ super().__init__(parent, invokingState)
+ self.parser = parser
+
+
+ def getRuleIndex(self):
+ return HelloParser.RULE_greet
+
+ def enterRule(self, listener:ParseTreeListener):
+ if hasattr( listener, "enterGreet" ):
+ listener.enterGreet(self)
+
+ def exitRule(self, listener:ParseTreeListener):
+ if hasattr( listener, "exitGreet" ):
+ listener.exitGreet(self)
+
+
+
+
+ def greet(self):
+
+ localctx = HelloParser.GreetContext(self, self._ctx, self.state)
+ self.enterRule(localctx, 4, self.RULE_greet)
+ self._la = 0 # Token type
+ try:
+ self.enterOuterAlt(localctx, 1)
+ self.state = 20
+ _la = self._input.LA(1)
+ if not(_la==1 or _la==2):
+ self._errHandler.recoverInline(self)
+ else:
+ self._errHandler.reportMatch(self)
+ self.consume()
+ except RecognitionException as re:
+ localctx.exception = re
+ self._errHandler.reportError(self, re)
+ self._errHandler.recover(self, re)
+ finally:
+ self.exitRule()
+ return localctx
+
+
class StartContext(ParserRuleContext):
__slots__ = 'parser'
@@ -73,12 +245,61 @@ class HelloParser ( Parser ):
def start(self):
localctx = HelloParser.StartContext(self, self._ctx, self.state)
- self.enterRule(localctx, 0, self.RULE_start)
+ self.enterRule(localctx, 6, self.RULE_start)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 2
+ self.state = 22
self.match(HelloParser.T__0)
- self.state = 3
+ self.state = 23
+ self.match(HelloParser.ID)
+ except RecognitionException as re:
+ localctx.exception = re
+ self._errHandler.reportError(self, re)
+ self._errHandler.recover(self, re)
+ finally:
+ self.exitRule()
+ return localctx
+
+
+ class ByeContext(ParserRuleContext):
+ __slots__ = 'parser'
+
+ def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
+ super().__init__(parent, invokingState)
+ self.parser = parser
+
+ def ID(self):
+ return self.getToken(HelloParser.ID, 0)
+
+ def getRuleIndex(self):
+ return HelloParser.RULE_bye
+
+ def enterRule(self, listener:ParseTreeListener):
+ if hasattr( listener, "enterBye" ):
+ listener.enterBye(self)
+
+ def exitRule(self, listener:ParseTreeListener):
+ if hasattr( listener, "exitBye" ):
+ listener.exitBye(self)
+
+
+
+
+ def bye(self):
+
+ localctx = HelloParser.ByeContext(self, self._ctx, self.state)
+ self.enterRule(localctx, 8, self.RULE_bye)
+ self._la = 0 # Token type
+ try:
+ self.enterOuterAlt(localctx, 1)
+ self.state = 25
+ _la = self._input.LA(1)
+ if not(_la==3 or _la==4):
+ self._errHandler.recoverInline(self)
+ else:
+ self._errHandler.reportMatch(self)
+ self.consume()
+ self.state = 26
self.match(HelloParser.ID)
except RecognitionException as re:
localctx.exception = re
diff --git a/TreesUser.py b/TreesUser.py
new file mode 100644
index 0000000..20b0c79
--- /dev/null
+++ b/TreesUser.py
@@ -0,0 +1,27 @@
+from antlr4.Utils import escapeWhitespace
+from antlr4.tree.Tree import Tree
+from antlr4.tree.Trees import Trees
+
+# need forward declaration
+Parser = None
+
+class TreesUser(Trees):
+
+ # Print out a whole tree in prettier form
+ # Based on Trees.toStringTree()
+ # indent is the number of indents to use in the display
+ @classmethod
+ def PrettyPrint(cls, t:Tree, ruleNames:list=None, recog:Parser=None, indent:int=0):
+ # indentation is the indent to actually display
+ indentation = ''
+ for n in range(indent):
+ indentation += ' '
+ if recog is not None:
+ ruleNames = recog.ruleNames
+ s = escapeWhitespace(cls.getNodeText(t, ruleNames), False)
+ retval = indentation + s + "\n"
+ if t.getChildCount()>0:
+ # we have children to deal with
+ for i in range(0, t.getChildCount()):
+ retval += cls.PrettyPrint(t.getChild(i), ruleNames, indent=indent+1)
+ return retval
diff --git a/Week_3/main.py b/Week_3/main.py
new file mode 100644
index 0000000..e69de29
diff --git a/Week_3/week3.g4 b/Week_3/week3.g4
new file mode 100644
index 0000000..4807632
--- /dev/null
+++ b/Week_3/week3.g4
@@ -0,0 +1,5 @@
+grammar week3;
+
+start : 'minimal' ID ;
+ID : [a-zA-Z]+ ;
+WS : [ \t\r\n]+ -> skip ;
diff --git a/Week_3/week3.interp b/Week_3/week3.interp
new file mode 100644
index 0000000..5d7edbf
--- /dev/null
+++ b/Week_3/week3.interp
@@ -0,0 +1,18 @@
+token literal names:
+null
+'minimal'
+null
+null
+
+token symbolic names:
+null
+null
+ID
+WS
+
+rule names:
+start
+
+
+atn:
+[4, 1, 3, 6, 2, 0, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 2, 1, 0, 0, 0, 2, 3, 5, 1, 0, 0, 3, 4, 5, 2, 0, 0, 4, 1, 1, 0, 0, 0, 0]
\ No newline at end of file
diff --git a/Week_3/week3.tokens b/Week_3/week3.tokens
new file mode 100644
index 0000000..d02f47c
--- /dev/null
+++ b/Week_3/week3.tokens
@@ -0,0 +1,4 @@
+T__0=1
+ID=2
+WS=3
+'minimal'=1
diff --git a/Week_3/week3Lexer.interp b/Week_3/week3Lexer.interp
new file mode 100644
index 0000000..bc0a635
--- /dev/null
+++ b/Week_3/week3Lexer.interp
@@ -0,0 +1,26 @@
+token literal names:
+null
+'minimal'
+null
+null
+
+token symbolic names:
+null
+null
+ID
+WS
+
+rule names:
+T__0
+ID
+WS
+
+channel names:
+DEFAULT_TOKEN_CHANNEL
+HIDDEN
+
+mode names:
+DEFAULT_MODE
+
+atn:
+[4, 0, 3, 27, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 4, 1, 17, 8, 1, 11, 1, 12, 1, 18, 1, 2, 4, 2, 22, 8, 2, 11, 2, 12, 2, 23, 1, 2, 1, 2, 0, 0, 3, 1, 1, 3, 2, 5, 3, 1, 0, 2, 2, 0, 65, 90, 97, 122, 3, 0, 9, 10, 13, 13, 32, 32, 28, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1, 7, 1, 0, 0, 0, 3, 16, 1, 0, 0, 0, 5, 21, 1, 0, 0, 0, 7, 8, 5, 109, 0, 0, 8, 9, 5, 105, 0, 0, 9, 10, 5, 110, 0, 0, 10, 11, 5, 105, 0, 0, 11, 12, 5, 109, 0, 0, 12, 13, 5, 97, 0, 0, 13, 14, 5, 108, 0, 0, 14, 2, 1, 0, 0, 0, 15, 17, 7, 0, 0, 0, 16, 15, 1, 0, 0, 0, 17, 18, 1, 0, 0, 0, 18, 16, 1, 0, 0, 0, 18, 19, 1, 0, 0, 0, 19, 4, 1, 0, 0, 0, 20, 22, 7, 1, 0, 0, 21, 20, 1, 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 21, 1, 0, 0, 0, 23, 24, 1, 0, 0, 0, 24, 25, 1, 0, 0, 0, 25, 26, 6, 2, 0, 0, 26, 6, 1, 0, 0, 0, 3, 0, 18, 23, 1, 6, 0, 0]
\ No newline at end of file
diff --git a/Week_3/week3Lexer.py b/Week_3/week3Lexer.py
new file mode 100644
index 0000000..f4fee75
--- /dev/null
+++ b/Week_3/week3Lexer.py
@@ -0,0 +1,56 @@
+# Generated from ./week3.g4 by ANTLR 4.13.2
+from antlr4 import *
+from io import StringIO
+import sys
+if sys.version_info[1] > 5:
+ from typing import TextIO
+else:
+ from typing.io import TextIO
+
+
+def serializedATN():
+ return [
+ 4,0,3,27,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,1,0,1,0,1,0,1,0,1,0,1,0,1,
+ 0,1,0,1,1,4,1,17,8,1,11,1,12,1,18,1,2,4,2,22,8,2,11,2,12,2,23,1,
+ 2,1,2,0,0,3,1,1,3,2,5,3,1,0,2,2,0,65,90,97,122,3,0,9,10,13,13,32,
+ 32,28,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,1,7,1,0,0,0,3,16,1,0,0,
+ 0,5,21,1,0,0,0,7,8,5,109,0,0,8,9,5,105,0,0,9,10,5,110,0,0,10,11,
+ 5,105,0,0,11,12,5,109,0,0,12,13,5,97,0,0,13,14,5,108,0,0,14,2,1,
+ 0,0,0,15,17,7,0,0,0,16,15,1,0,0,0,17,18,1,0,0,0,18,16,1,0,0,0,18,
+ 19,1,0,0,0,19,4,1,0,0,0,20,22,7,1,0,0,21,20,1,0,0,0,22,23,1,0,0,
+ 0,23,21,1,0,0,0,23,24,1,0,0,0,24,25,1,0,0,0,25,26,6,2,0,0,26,6,1,
+ 0,0,0,3,0,18,23,1,6,0,0
+ ]
+
+class week3Lexer(Lexer):
+
+ atn = ATNDeserializer().deserialize(serializedATN())
+
+ decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ]
+
+ T__0 = 1
+ ID = 2
+ WS = 3
+
+ channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ]
+
+ modeNames = [ "DEFAULT_MODE" ]
+
+ literalNames = [ "",
+ "'minimal'" ]
+
+ symbolicNames = [ "",
+ "ID", "WS" ]
+
+ ruleNames = [ "T__0", "ID", "WS" ]
+
+ grammarFileName = "week3.g4"
+
+ def __init__(self, input=None, output:TextIO = sys.stdout):
+ super().__init__(input, output)
+ self.checkVersion("4.13.2")
+ self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache())
+ self._actions = None
+ self._predicates = None
+
+
diff --git a/Week_3/week3Lexer.tokens b/Week_3/week3Lexer.tokens
new file mode 100644
index 0000000..d02f47c
--- /dev/null
+++ b/Week_3/week3Lexer.tokens
@@ -0,0 +1,4 @@
+T__0=1
+ID=2
+WS=3
+'minimal'=1
diff --git a/Week_3/week3Listener.py b/Week_3/week3Listener.py
new file mode 100644
index 0000000..cb1ae67
--- /dev/null
+++ b/Week_3/week3Listener.py
@@ -0,0 +1,21 @@
+# Generated from ./week3.g4 by ANTLR 4.13.2
+from antlr4 import *
+if "." in __name__:
+ from .week3Parser import week3Parser
+else:
+ from week3Parser import week3Parser
+
+# This class defines a complete listener for a parse tree produced by week3Parser.
+class week3Listener(ParseTreeListener):
+
+ # Enter a parse tree produced by week3Parser#start.
+ def enterStart(self, ctx:week3Parser.StartContext):
+ pass
+
+ # Exit a parse tree produced by week3Parser#start.
+ def exitStart(self, ctx:week3Parser.StartContext):
+ pass
+
+
+
+del week3Parser
\ No newline at end of file
diff --git a/Week_3/week3Parser.py b/Week_3/week3Parser.py
new file mode 100644
index 0000000..7475268
--- /dev/null
+++ b/Week_3/week3Parser.py
@@ -0,0 +1,94 @@
+# Generated from ./week3.g4 by ANTLR 4.13.2
+# encoding: utf-8
+from antlr4 import *
+from io import StringIO
+import sys
+if sys.version_info[1] > 5:
+ from typing import TextIO
+else:
+ from typing.io import TextIO
+
+def serializedATN():
+ return [
+ 4,1,3,6,2,0,7,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,4,0,2,1,0,0,0,2,3,5,
+ 1,0,0,3,4,5,2,0,0,4,1,1,0,0,0,0
+ ]
+
+class week3Parser ( Parser ):
+
+ grammarFileName = "week3.g4"
+
+ atn = ATNDeserializer().deserialize(serializedATN())
+
+ decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ]
+
+ sharedContextCache = PredictionContextCache()
+
+ literalNames = [ "", "'minimal'" ]
+
+ symbolicNames = [ "", "", "ID", "WS" ]
+
+ RULE_start = 0
+
+ ruleNames = [ "start" ]
+
+ EOF = Token.EOF
+ T__0=1
+ ID=2
+ WS=3
+
+ def __init__(self, input:TokenStream, output:TextIO = sys.stdout):
+ super().__init__(input, output)
+ self.checkVersion("4.13.2")
+ self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache)
+ self._predicates = None
+
+
+
+
+ class StartContext(ParserRuleContext):
+ __slots__ = 'parser'
+
+ def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
+ super().__init__(parent, invokingState)
+ self.parser = parser
+
+ def ID(self):
+ return self.getToken(week3Parser.ID, 0)
+
+ def getRuleIndex(self):
+ return week3Parser.RULE_start
+
+ def enterRule(self, listener:ParseTreeListener):
+ if hasattr( listener, "enterStart" ):
+ listener.enterStart(self)
+
+ def exitRule(self, listener:ParseTreeListener):
+ if hasattr( listener, "exitStart" ):
+ listener.exitStart(self)
+
+
+
+
+ def start(self):
+
+ localctx = week3Parser.StartContext(self, self._ctx, self.state)
+ self.enterRule(localctx, 0, self.RULE_start)
+ try:
+ self.enterOuterAlt(localctx, 1)
+ self.state = 2
+ self.match(week3Parser.T__0)
+ self.state = 3
+ self.match(week3Parser.ID)
+ except RecognitionException as re:
+ localctx.exception = re
+ self._errHandler.reportError(self, re)
+ self._errHandler.recover(self, re)
+ finally:
+ self.exitRule()
+ return localctx
+
+
+
+
+
diff --git a/main.py b/main.py
index 55503bf..671e0a4 100644
--- a/main.py
+++ b/main.py
@@ -1,27 +1,38 @@
import sys
from antlr4 import *
+
from HelloLexer import HelloLexer
from HelloParser import HelloParser
from HelloListener import HelloListener
-from antlr4.tree.Trees import Trees
-
+from TreesUser import TreesUser # contains Marina's PrettyPrint()
def main(argv):
if len(argv) == 1:
- InputStream = StdinStream()
+ inpstream = StdinStream()
else:
inpname = argv[1]
- InputStream = FileStream(inpname)
- lexer = HelloLexer(InputStream)
+ inpstream = FileStream(inpname)
+ # The lexer analyses the characters on inpstream and produces tokens
+ lexer = HelloLexer(inpstream)
+ # on the token stream (belonging to a standard ANTLR class)
tokstream = CommonTokenStream(lexer)
+ # The parser produces an abstract syntax tree
parser = HelloParser(tokstream)
+ # When we execute the parse, we need to give it the starting rule of our grammar,
+ listener = HelloListener()
- tree = parser.start()
+ # which in our case is 'greeting' (as defined in hello.g4)
+ tree = parser.greeting()
+ tree = parser.bye()
- print(Trees.toStringTree(tree, None, parser))
+ # traditional Lisp-style parse tree
+ print(TreesUser.toStringTree(tree, None, parser))
+ # pretty-print the parse tree
+ print(TreesUser.PrettyPrint(tree, None, parser))
if __name__ == '__main__':
main(sys.argv)
+