diff --git a/Hello.g4 b/Hello.g4 index b241f24..bfb64a5 100644 --- a/Hello.g4 +++ b/Hello.g4 @@ -1,6 +1,5 @@ grammar Hello; -start : 'Hello' ID ; - +start : 'hello' ID ; ID : [a-zA-Z]+ ; WS : [ \t\r\n]+ -> skip ; diff --git a/Hello.interp b/Hello.interp new file mode 100644 index 0000000..1562c8a --- /dev/null +++ b/Hello.interp @@ -0,0 +1,18 @@ +token literal names: +null +'hello' +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/Hello.tokens b/Hello.tokens new file mode 100644 index 0000000..090a996 --- /dev/null +++ b/Hello.tokens @@ -0,0 +1,4 @@ +T__0=1 +ID=2 +WS=3 +'hello'=1 diff --git a/HelloLexer.interp b/HelloLexer.interp new file mode 100644 index 0000000..c5ed873 --- /dev/null +++ b/HelloLexer.interp @@ -0,0 +1,26 @@ +token literal names: +null +'hello' +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, 25, 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, 1, 4, 1, 15, 8, 1, 11, 1, 12, 1, 16, 1, 2, 4, 2, 20, 8, 2, 11, 2, 12, 2, 21, 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, 26, 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, 14, 1, 0, 0, 0, 5, 19, 1, 0, 0, 0, 7, 8, 5, 104, 0, 0, 8, 9, 5, 101, 0, 0, 9, 10, 5, 108, 0, 0, 10, 11, 5, 108, 0, 0, 11, 12, 5, 111, 0, 0, 12, 2, 1, 0, 0, 0, 13, 15, 7, 0, 0, 0, 14, 13, 1, 0, 0, 0, 15, 16, 1, 0, 0, 0, 16, 14, 1, 0, 0, 0, 16, 17, 1, 0, 0, 0, 17, 4, 1, 0, 0, 0, 18, 20, 7, 1, 0, 0, 19, 18, 1, 0, 0, 0, 20, 21, 1, 0, 0, 0, 21, 19, 1, 0, 0, 0, 21, 22, 1, 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 24, 6, 2, 0, 0, 24, 6, 1, 0, 0, 0, 3, 0, 16, 21, 1, 6, 0, 0] \ No newline at end of file diff --git a/HelloLexer.py b/HelloLexer.py new file mode 100644 index 0000000..8699829 --- /dev/null +++ b/HelloLexer.py @@ -0,0 +1,55 @@ +# Generated from ./Hello.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,25,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, + 1,4,1,15,8,1,11,1,12,1,16,1,2,4,2,20,8,2,11,2,12,2,21,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,26,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,14,1,0,0,0,5,19, + 1,0,0,0,7,8,5,104,0,0,8,9,5,101,0,0,9,10,5,108,0,0,10,11,5,108,0, + 0,11,12,5,111,0,0,12,2,1,0,0,0,13,15,7,0,0,0,14,13,1,0,0,0,15,16, + 1,0,0,0,16,14,1,0,0,0,16,17,1,0,0,0,17,4,1,0,0,0,18,20,7,1,0,0,19, + 18,1,0,0,0,20,21,1,0,0,0,21,19,1,0,0,0,21,22,1,0,0,0,22,23,1,0,0, + 0,23,24,6,2,0,0,24,6,1,0,0,0,3,0,16,21,1,6,0,0 + ] + +class HelloLexer(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 = [ "", + "'hello'" ] + + symbolicNames = [ "", + "ID", "WS" ] + + ruleNames = [ "T__0", "ID", "WS" ] + + grammarFileName = "Hello.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/HelloLexer.tokens b/HelloLexer.tokens new file mode 100644 index 0000000..090a996 --- /dev/null +++ b/HelloLexer.tokens @@ -0,0 +1,4 @@ +T__0=1 +ID=2 +WS=3 +'hello'=1 diff --git a/HelloListener.py b/HelloListener.py new file mode 100644 index 0000000..20612a4 --- /dev/null +++ b/HelloListener.py @@ -0,0 +1,21 @@ +# Generated from ./Hello.g4 by ANTLR 4.13.2 +from antlr4 import * +if "." in __name__: + from .HelloParser import HelloParser +else: + from HelloParser import HelloParser + +# This class defines a complete listener for a parse tree produced by HelloParser. +class HelloListener(ParseTreeListener): + + # Enter a parse tree produced by HelloParser#start. + def enterStart(self, ctx:HelloParser.StartContext): + pass + + # Exit a parse tree produced by HelloParser#start. + def exitStart(self, ctx:HelloParser.StartContext): + pass + + + +del HelloParser \ No newline at end of file diff --git a/HelloParser.py b/HelloParser.py new file mode 100644 index 0000000..a3f300c --- /dev/null +++ b/HelloParser.py @@ -0,0 +1,94 @@ +# Generated from ./Hello.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 HelloParser ( Parser ): + + grammarFileName = "Hello.g4" + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + sharedContextCache = PredictionContextCache() + + literalNames = [ "", "'hello'" ] + + 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(HelloParser.ID, 0) + + def getRuleIndex(self): + return HelloParser.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 = HelloParser.StartContext(self, self._ctx, self.state) + self.enterRule(localctx, 0, self.RULE_start) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2 + self.match(HelloParser.T__0) + self.state = 3 + 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 + + + + + diff --git a/main.py b/main.py new file mode 100644 index 0000000..55503bf --- /dev/null +++ b/main.py @@ -0,0 +1,27 @@ +import sys + +from antlr4 import * +from HelloLexer import HelloLexer +from HelloParser import HelloParser +from HelloListener import HelloListener + +from antlr4.tree.Trees import Trees + + +def main(argv): + if len(argv) == 1: + InputStream = StdinStream() + else: + inpname = argv[1] + InputStream = FileStream(inpname) + lexer = HelloLexer(InputStream) + tokstream = CommonTokenStream(lexer) + parser = HelloParser(tokstream) + + tree = parser.start() + + print(Trees.toStringTree(tree, None, parser)) +if __name__ == '__main__': + main(sys.argv) + + diff --git a/srcfile.txt b/srcfile.txt new file mode 100644 index 0000000..24f29e9 --- /dev/null +++ b/srcfile.txt @@ -0,0 +1 @@ +hello marvin \ No newline at end of file