Added translation actions for Arithmetic expressions
This commit is contained in:
parent
5dfc8d2483
commit
81a2de075c
6 changed files with 689 additions and 396 deletions
|
|
@ -1,15 +1,39 @@
|
||||||
import ply.lex as lex
|
import ply.lex as lex
|
||||||
import ply.yacc as yacc
|
import ply.yacc as yacc
|
||||||
import sys
|
import sys
|
||||||
|
from stack import Stack
|
||||||
|
|
||||||
|
resultQuadruplets = []
|
||||||
|
quadrupletIndex = 1
|
||||||
|
|
||||||
|
# Auxiliary stacks.
|
||||||
|
operandsStack = []
|
||||||
|
operatorsStack = []
|
||||||
|
jumpsStack = []
|
||||||
|
auxStack = []
|
||||||
|
avail = []
|
||||||
|
for i in range(50):
|
||||||
|
avail.append('T' + str(i))
|
||||||
|
|
||||||
# Operations related to the table of symbols
|
# Operations related to the table of symbols
|
||||||
symbolsNames = []
|
symbolsNames = []
|
||||||
symbolsTypes = []
|
symbolsTypes = []
|
||||||
|
symbols = {}
|
||||||
|
|
||||||
def addSymbol(name, symbolType):
|
# # Implementation using lists.
|
||||||
symbolsNames.append(name)
|
# def addSymbol(name, symbolType):
|
||||||
symbolsTypes.append(symbolType)
|
# symbolsNames.append(name)
|
||||||
|
# symbolsTypes.append(symbolType)
|
||||||
|
|
||||||
|
# Implementation using a dictionary
|
||||||
|
def addSymbol(name, symbolsTypes):
|
||||||
|
initialValue = 0 if symbolsTypes == 'integer' else 0.0
|
||||||
|
symbols[name] = [name, initialValue]
|
||||||
|
|
||||||
|
def peek(list):
|
||||||
|
if (len(list) == 0):
|
||||||
|
return None
|
||||||
|
return list[len(list) - 1]
|
||||||
|
|
||||||
tokens = [
|
tokens = [
|
||||||
'doubleColon',
|
'doubleColon',
|
||||||
|
|
@ -189,10 +213,13 @@ def p_S(p):
|
||||||
| exit
|
| exit
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
# Adjust the action to support matrices
|
||||||
def p_Dimensional(p):
|
def p_Dimensional(p):
|
||||||
'''
|
'''
|
||||||
Dimensional : id DimensionsOrEmpty
|
Dimensional : id DimensionsOrEmpty
|
||||||
'''
|
'''
|
||||||
|
p[0] = p[1]
|
||||||
|
|
||||||
|
|
||||||
def p_DimensionsOrEmpty(p):
|
def p_DimensionsOrEmpty(p):
|
||||||
'''
|
'''
|
||||||
|
|
@ -245,19 +272,21 @@ def p_IntOrEmpty(p):
|
||||||
def p_EA(p):
|
def p_EA(p):
|
||||||
'''
|
'''
|
||||||
EA : MultDiv
|
EA : MultDiv
|
||||||
| EA SumOrSub MultDiv
|
| EA SumOrSub action_3 MultDiv action_4
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
def p_SumOrSub(p):
|
def p_SumOrSub(p):
|
||||||
'''
|
'''
|
||||||
SumOrSub : plus
|
SumOrSub : plus
|
||||||
| minus
|
| minus
|
||||||
'''
|
'''
|
||||||
|
p[0] = p[1]
|
||||||
|
|
||||||
def p_MultDiv(p):
|
def p_MultDiv(p):
|
||||||
'''
|
'''
|
||||||
MultDiv : EAParens
|
MultDiv : EAParens
|
||||||
| MultDiv MDSymbols EAParens
|
| MultDiv MDSymbols action_5 EAParens action_6
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def p_MDSymbols(p):
|
def p_MDSymbols(p):
|
||||||
|
|
@ -265,6 +294,7 @@ def p_MDSymbols(p):
|
||||||
MDSymbols : mul
|
MDSymbols : mul
|
||||||
| div
|
| div
|
||||||
'''
|
'''
|
||||||
|
p[0] = p[1]
|
||||||
|
|
||||||
def p_EAParens(p):
|
def p_EAParens(p):
|
||||||
'''
|
'''
|
||||||
|
|
@ -293,9 +323,9 @@ def p_Equality(p):
|
||||||
|
|
||||||
def p_EItem(p):
|
def p_EItem(p):
|
||||||
'''
|
'''
|
||||||
EItem : Dimensional
|
EItem : Dimensional action_1
|
||||||
| int
|
| int action_2
|
||||||
| rea
|
| rea action_2
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def p_EQSymbols(p):
|
def p_EQSymbols(p):
|
||||||
|
|
@ -308,6 +338,51 @@ def p_EQSymbols(p):
|
||||||
| moreEquals
|
| moreEquals
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
def p_action_1(p):
|
||||||
|
"action_1 :"
|
||||||
|
operandsStack.append(p[-1])
|
||||||
|
|
||||||
|
|
||||||
|
def p_action_2(p):
|
||||||
|
"action_2 :"
|
||||||
|
operandsStack.append(p[-1])
|
||||||
|
|
||||||
|
def p_action_3(p):
|
||||||
|
"action_3 :"
|
||||||
|
operatorsStack.append(p[-1])
|
||||||
|
|
||||||
|
def p_action_4(p):
|
||||||
|
"action_4 :"
|
||||||
|
if (peek(operatorsStack) == '+' or peek(operatorsStack) == '-'):
|
||||||
|
global quadrupletIndex
|
||||||
|
operator = operatorsStack.pop()
|
||||||
|
operand2 = operandsStack.pop()
|
||||||
|
operand1 = operandsStack.pop()
|
||||||
|
temp = avail.pop(0)
|
||||||
|
operandsStack.append(temp)
|
||||||
|
resultQuadruplets.append(str(operator) + ' ' + str(operand1) + ' ' + str(operand2) + ' ' + str(temp) + '\n')
|
||||||
|
quadrupletIndex += 1
|
||||||
|
|
||||||
|
|
||||||
|
def p_action_5(p):
|
||||||
|
"action_5 :"
|
||||||
|
operatorsStack.append(p[-1])
|
||||||
|
|
||||||
|
|
||||||
|
def p_action_6(p):
|
||||||
|
"action_6 :"
|
||||||
|
if (peek(operatorsStack) == '*' or peek(operatorsStack) == '/'):
|
||||||
|
global quadrupletIndex
|
||||||
|
operator = operatorsStack.pop()
|
||||||
|
operand2 = operandsStack.pop()
|
||||||
|
operand1 = operandsStack.pop()
|
||||||
|
temp = avail.pop(0)
|
||||||
|
operandsStack.append(temp)
|
||||||
|
resultQuadruplets.append(str(operator) + ' ' + str(operand1) + ' ' + str(operand2) + ' ' + str(temp) + '\n')
|
||||||
|
quadrupletIndex += 1
|
||||||
|
|
||||||
|
|
||||||
def p_error(p):
|
def p_error(p):
|
||||||
print('XXX Invalid program')
|
print('XXX Invalid program')
|
||||||
print(p)
|
print(p)
|
||||||
|
|
@ -317,11 +392,18 @@ parser = yacc.yacc()
|
||||||
if (len(sys.argv) > 1):
|
if (len(sys.argv) > 1):
|
||||||
programName = sys.argv[1]
|
programName = sys.argv[1]
|
||||||
programFile = open(programName, "r")
|
programFile = open(programName, "r")
|
||||||
|
resultFile = open(programName + '.out', "w+")
|
||||||
# This is neccessary because the read method parses literal ends
|
# This is neccessary because the read method parses literal ends
|
||||||
# of lines as \\n instead of \n.
|
# of lines as \\n instead of \n.
|
||||||
program = programFile.read().replace('\\n', '\n')
|
program = programFile.read().replace('\\n', '\n')
|
||||||
parser.parse(program)
|
parser.parse(program)
|
||||||
|
|
||||||
|
print(resultQuadruplets)
|
||||||
|
resultFile.writelines(resultQuadruplets)
|
||||||
|
|
||||||
|
# Close the files.
|
||||||
programFile.close()
|
programFile.close()
|
||||||
|
resultFile.close()
|
||||||
else:
|
else:
|
||||||
raise Exception('''
|
raise Exception('''
|
||||||
No file name was provided.
|
No file name was provided.
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
20
final_lang/stack.py
Normal file
20
final_lang/stack.py
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
class Stack:
|
||||||
|
def __init__(self):
|
||||||
|
self.items = []
|
||||||
|
|
||||||
|
def isEmpty(self):
|
||||||
|
return self.items == []
|
||||||
|
|
||||||
|
def push(self, item):
|
||||||
|
self.items.append(item)
|
||||||
|
|
||||||
|
def pop(self):
|
||||||
|
return self.items.pop()
|
||||||
|
|
||||||
|
def peek(self):
|
||||||
|
if (self.isEmpty):
|
||||||
|
return None
|
||||||
|
return self.items[len(self.items)-1]
|
||||||
|
|
||||||
|
def size(self):
|
||||||
|
return len(self.items)
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
program test
|
program test
|
||||||
integer :: a, b
|
integer :: a, b
|
||||||
a = 1 + 2
|
a = (2 + 1) * 2
|
||||||
b = a
|
b = a
|
||||||
end program
|
end program
|
||||||
2
final_lang/test2.fort.out
Normal file
2
final_lang/test2.fort.out
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
+ 2 1 T0
|
||||||
|
* T0 2 T1
|
||||||
Loading…
Add table
Add a link
Reference in a new issue