Skip to content

Commit

Permalink
Add location info to parser (+ bug fixes)
Browse files Browse the repository at this point in the history
The bugs had to do with some Parser classes not inheriting from Node and
the function name of SimpleCall not being correctly generated.
  • Loading branch information
jmi2k committed Jun 13, 2020
1 parent 6773bfd commit c57289a
Showing 1 changed file with 71 additions and 27 deletions.
98 changes: 71 additions & 27 deletions learnbot_dsl/learnbotCode/Parser.py
Expand Up @@ -71,10 +71,21 @@ class bcolors:
UNDERLINE = '\033[4m'

class Node:
def __init__(self, src, location):
l = lineno(location, src)
c = col(location, src)

self.start = l, c
self.line = line(location, src)

@property
def used_vars(self):
return set()

@property
def span(self):
return len(self.line)

KEYWORDS = (
Keyword('def')
| Keyword('=')
Expand Down Expand Up @@ -141,7 +152,8 @@ def used_vars(self):
)

class Identifier(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)
self.name = tokens[0]

def to_python(self, gen, *_):
Expand All @@ -159,7 +171,8 @@ def used_vars(self):
STRING = QuotedString('"', escChar = '\\', unquoteResults = False)

class Value(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)
self.value = eval(tokens[0])

def to_python(self, gen, *_):
Expand All @@ -178,15 +191,17 @@ def to_python(self, gen, *_):

"""-----------------CALL-------------------------"""
class Call(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.function = tokens[0]
self.args = tokens[1].asList()

def to_python(self, gen, *_):
function = self.function.to_python(gen)
args = ', '.join([arg.to_python(gen) for arg in self.args])
args = [arg.to_python(gen) for arg in self.args]

return f'robot.{function}({args})'
return f'robot.{function}({", ".join(args)})'

@property
def used_vars(self):
Expand All @@ -204,14 +219,17 @@ def used_vars(self):

"""-----------------SIMPLECALL-------------------------"""
class SimpleCall(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.function = tokens[0]
self.args = tokens[1].asList()

def to_python(self, gen, *_):
args = ', '.join([arg.to_python(gen) for arg in self.args])
function = self.function.to_python(gen)
args = [arg.to_python(gen) for arg in self.args]

return f'{self.function}({args})'
return f'{function}({", ".join(args)})'

@property
def used_vars(self):
Expand All @@ -227,7 +245,9 @@ def used_vars(self):

"""-----------------OPERACIONES---------------------"""
class UnaryOp(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.operator = tokens[0][0]
self.operand = tokens[0][1]

Expand All @@ -254,12 +274,13 @@ def used_vars(self):
return self.operand.used_vars

class BinaryOp(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)
[[*rest, op, last]] = tokens

# NOTE: this assumes left associativity. This is fine for us, as we
# don't have any right-binding operators
self.left = BinaryOp([rest]) if len(rest) > 1 else rest[0]
self.left = BinaryOp(src, location, [rest]) if len(rest) > 1 else rest[0]
self.operator = op
self.right = last

Expand Down Expand Up @@ -300,7 +321,7 @@ def used_vars(self):

"""-----------------PASS-------------------------"""
class Pass(Node):
def __init__(self, location, tokens):
def __init__(self, src, location, tokens):
self.location = location

def to_python(self, gen, *_):
Expand All @@ -310,7 +331,9 @@ def to_python(self, gen, *_):

"""-----------------asignacion-VARIABLES------------"""
class Var(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.var = tokens[0]
self.operator = tokens[1]
self.right = tokens[2]
Expand Down Expand Up @@ -341,7 +364,9 @@ def used_vars(self):

"""-----------------bloque-IF-----------------------"""
class If(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.condition = tokens[0]
self.body = tokens[1].asList()
self.alternatives = tokens[2].asList()
Expand Down Expand Up @@ -372,7 +397,9 @@ def used_vars(self):
return vars

class ElseIf(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.condition = tokens[0]
self.body = tokens[1].asList()

Expand All @@ -399,7 +426,9 @@ def used_vars(self):
return vars

class Else(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.body = tokens[0].asList()

def to_python(self, gen, *_):
Expand Down Expand Up @@ -449,7 +478,9 @@ def used_vars(self):

"""-----------------LOOP----------------------------"""
class While(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.condition = tokens[0]
self.body = tokens[1].asList()

Expand Down Expand Up @@ -486,7 +517,9 @@ def used_vars(self):

"""-----------------WHEN+CONDICION------------------"""
class When(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.name = tokens[0]
self.right = tokens[1] if len(tokens) == 3 else None
self.body = tokens[-1].asList()
Expand Down Expand Up @@ -556,14 +589,17 @@ def to_python(self, gen, *_):

"""-----------------ACTIVATE-CONDITION----------------"""
class Activate(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.name = tokens[0]

def to_python(self, gen, *_):
return f'state_{self.name} = True'

class Deactivate(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
self.location = location
self.name = tokens[0]

def to_python(self, gen, *_):
Expand All @@ -586,7 +622,9 @@ def to_python(self, gen, *_):

"""-----------------DEF----------------------------"""
class Def(Node):
def __init__(self, tokens):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.name = tokens[0]
self.body = tokens[1].asList()

Expand Down Expand Up @@ -625,8 +663,10 @@ def used_vars(self):
).setParseAction(Def)

"""-----------------IMPORT----------------------------"""
class Import:
def __init__(self, tokens):
class Import(Node):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.path = tokens[0][0]

def to_python(self, gen, *_):
Expand All @@ -640,8 +680,10 @@ def to_python(self, gen, *_):
).setParseAction(Import)

"""-----------------MAIN----------------------------"""
class Main:
def __init__(self, tokens):
class Main(Node):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.body = tokens[0].asList()

def to_python(self, gen, *_):
Expand All @@ -664,8 +706,10 @@ def used_vars(self):
+ END
).setParseAction(Main)

class Program:
def __init__(self, tokens):
class Program(Node):
def __init__(self, src, location, tokens):
super().__init__(src, location)

self.imports = tokens[0].asList()
self.inits = tokens[1].asList()
self.defs = tokens[2].asList()
Expand Down

0 comments on commit c57289a

Please sign in to comment.