Improve parser

This commit is contained in:
Bartłomiej Pluta
2019-06-30 19:58:37 +02:00
parent 607e9f9214
commit 65353a80f2
5 changed files with 44 additions and 53 deletions

View File

@@ -83,13 +83,24 @@ def parseNoteOrColon(input, parent):
note = parseNote(input, parent)
if len(input) > 1 and input[0].type == TokenType.COLON:
input.pop(0)
b = parseExpression(input, parent) #TODO: only expressions!
b = parseNote(input, parent) #TODO: only expressions!
if b is None:
raise ParseError(f"Line {input[0].pos[0]+1}, col {input[0].pos[1]+1}: Invalid colon argument '{input[0].value}'")
return ColonNode(note, b)
return note
def parseIntegerOrColon(input, parent):
integer = parseInteger(input, parent)
if len(input) > 1 and input[0].type == TokenType.COLON:
input.pop(0)
b = parseInteger(input, parent) #TODO: only expressions!
if b is None:
raise ParseError(f"Line {input[0].pos[0]+1}, col {input[0].pos[1]+1}: Invalid colon argument '{input[0].value}'")
return ColonNode(integer, b)
return integer
def parseFunctionCallOrAssignOrIdentifier(input, parent):
identifier = IdentifierNode(input.pop(0).value)
# Function call
@@ -111,10 +122,19 @@ def parsePercent(input, parent):
return PercentNode(value)
def parseMinus(input, parent):
input.pop(0)
value = parseInteger(input, parent)
return IntegerLiteralNode(-value.value)
def parseExpression(input, parent):
type = input[0].type
if type == TokenType.MINUS:
return parseMinus(input, parent)
if type == TokenType.INTEGER:
return parseInteger(input, parent)
return parseIntegerOrColon(input, parent)
if type == TokenType.STRING:
return parseString(input, parent)
if type == TokenType.NOTE:
@@ -125,6 +145,7 @@ def parseExpression(input, parent):
return parsePercent(input, parent)
if type == TokenType.OPEN_PAREN:
return parseList(input, parent)
raise ParseError(f"Line {input[0].pos[0]+1}, col {input[0].pos[1]+1}: Unexpected character '{input[0].value}'")
def parseArrayElement(input, parent):
type = input[0].type