Skip to content

Commit

Permalink
Implement SubroutinesVisitor
Browse files Browse the repository at this point in the history
  • Loading branch information
certik committed Oct 27, 2017
1 parent 6f57f19 commit 94f621d
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 3 deletions.
2 changes: 1 addition & 1 deletion build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ set -x

antlr4="java org.antlr.v4.Tool"

$antlr4 -Dlanguage=Python3 fortran.g4
$antlr4 -Dlanguage=Python3 -no-listener -visitor fortran.g4
7 changes: 5 additions & 2 deletions fortran_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from antlr4.error.ErrorListener import ErrorListener
from fortranParser import fortranParser
from fortranLexer import fortranLexer
from fortranListener import fortranListener

class SyntaxErrorException(Exception):
pass
Expand All @@ -15,13 +14,17 @@ def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e):
print("line", line, ":", column, "at", offendingSymbol, ":", msg)
raise SyntaxErrorException("Syntax error.")

def parse(source, rule="root"):
def get_parser(source):
stream = antlr4.InputStream(source)
lexer = fortranLexer(stream)
tokens = antlr4.CommonTokenStream(lexer)
parser = fortranParser(tokens)
parser.removeErrorListeners()
parser.addErrorListener(VerboseListener())
return parser

def parse(source, rule="root"):
parser = get_parser(source)
try:
tree = getattr(parser, rule)()
except SyntaxErrorException:
Expand Down
21 changes: 21 additions & 0 deletions list_subroutines.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from fortranParser import fortranParser
from fortranVisitor import fortranVisitor
from fortran_parser import get_parser

class SubroutinesVisitor(fortranVisitor):

# Visit a parse tree produced by fortranParser#subroutine.
def visitSubroutine(self, ctx:fortranParser.SubroutineContext):
print("subroutine", ctx.ID().getText())
return self.visitChildren(ctx)

def main():
filename = "examples/random.f90"
source = open(filename).read()
parser = get_parser(source)
tree = parser.root()
v = SubroutinesVisitor()
v.visit(tree)

if __name__ == "__main__":
main()

0 comments on commit 94f621d

Please sign in to comment.