script engine for added

This commit is contained in:
Moammad97 2021-04-13 22:53:02 +04:30
parent d55506e771
commit db37463331
10 changed files with 829 additions and 476 deletions

View file

@ -8,9 +8,10 @@
.VarArgFunc1->printf
.Operators->or xor and asr asl add sub mul div mod gt lt egt elt eq neq
.OperatorsTwoOperand->or xor and asr asl add sub mul div mod gt lt egt elt eq neq
.OperatorsOneOperand->inc dec
.SemantiRules->start_of_if jmp jz jnz jmp_to_end_and_jzcompleted end_of_if start_of_while end_of_while vargstart mov start_of_do_while end_of_do_while
.SemantiRules->start_of_if jmp jz jnz jmp_to_end_and_jzcompleted end_of_if start_of_while end_of_while vargstart mov start_of_do_while end_of_do_while start_of_for for_inc_dec start_of_for_ommands end_of_if
.Registers->rax rcx rdx rbx rsp rbp rsi rdi r8 r9 r10 r11 r12 r13 r14 r15 ds es fs gs cs ss rflags rip idtr gdtr cr0 cr2 cr3 cr4 cr8
@ -22,6 +23,7 @@ S->eps
STATEMENT->IF_STATEMENT
STATEMENT->WHILE_STATEMENT
STATEMENT->DO_WHILE_STATEMENT
STATEMENT->FOR_STATEMENT
STATEMENT->ASSIGN_STATEMENT ;
STATEMENT->CALL_FUNC_STATEMENT ;
@ -43,6 +45,19 @@ END_OF_IF->eps
WHILE_STATEMENT->while @START_OF_WHILE ( BOOLEAN_EXPRESSION ) @JZ { S @END_OF_WHILE }
DO_WHILE_STATEMENT->do @START_OF_DO_WHILE { S } while ( BOOLEAN_EXPRESSION ) @END_OF_DO_WHILE ;
FOR_STATEMENT->for ( SIMPLE_ASSIGNMENT ; @START_OF_FOR BOOLEAN_EXPRESSION ; @FOR_INC_DEC INC_DEC ) { @START_OF_FOR_COMMANDS S @END_OF_FOR }
SIMPLE_ASSIGNMENT->L_VALUE = EXPRESSION @MOV SIMPLE_ASSIGNMENT'
SIMPLE_ASSIGNMENT->eps
SIMPLE_ASSIGNMENT'->eps
INC_DEC->L_VALUE INC_DEC'
INC_DEC'->++ @INC INC'
INC_DEC'->-- @DEC DEC'
INC'->eps
DEC'->eps
INC_DEC'->eps
BOOLEAN_EXPRESSION->eps

View file

@ -44,7 +44,7 @@ class LALR1Parser:
# maximum of "Right Hand Side(Rhs)" length
self.MAXIMUM_RHS_LEN = 0
self.SPECIAL_TOKENS = ['%', '+', '-', "*", "/", "=", "==", "!=", ",", ";", "(", ")", "{", "}", "|", "||", ">>", ">=", "<<", "<=", "&", "&&", "^"]
self.SPECIAL_TOKENS = ['%', '+', '++', '-', '--', "*", "/", "=", "==", "!=", ",", ";", "(", ")", "{", "}", "|", "||", ">>", ">=", "<<", "<=", "&", "&&", "^"]

View file

@ -46,13 +46,14 @@ class LL1Parser:
self.MAXIMUM_RHS_LEN = 0
self.SPECIAL_TOKENS = ['%', '+', '-', "*", "/", "=", "==", "!=", ",", ";", "(", ")", "{", "}", "|", "||", ">>", ">=", "<<", "<=", "&", "&&", "^"]
self.SPECIAL_TOKENS = ['%', '+', '++', '-', '--', "*", "/", "=", "==", "!=", ",", ";", "(", ")", "{", "}", "|", "||", ">>", ">=", "<<", "<=", "&", "&&", "^"]
# INVALID rule indicator
self.INVALID = -99
self.FunctionsDict = dict()
self.OperatorsList = []
self.OperatorsTwoOperand = []
self.OperatorsOneOperand = []
self.RegistersList = []
self.PseudoRegistersList = []
self.keywordList = []
@ -105,10 +106,11 @@ class LL1Parser:
self.HeaderFile.write("#define START_VARIABLE " + "\"" + self.Start +"\"\n")
self.HeaderFile.write("#define MAX_RHS_LEN " + str(self.MAXIMUM_RHS_LEN) +"\n")
self.HeaderFile.write("#define KEYWORD_LIST_LENGTH " + str(len(self.keywordList)) +"\n")
self.HeaderFile.write("#define OPERATORS_LIST_LENGTH " + str(len(self.OperatorsList)) + "\n")
self.HeaderFile.write("#define OPERATORS_ONE_OPERAND_LIST_LENGTH " + str(len(self.OperatorsOneOperand)) + "\n")
self.HeaderFile.write("#define OPERATORS_TWO_OPERAND_LIST_LENGTH " + str(len(self.OperatorsTwoOperand)) + "\n")
self.HeaderFile.write("#define REGISTER_MAP_LIST_LENGTH " + str(len(self.RegistersList))+ "\n")
self.HeaderFile.write("#define PSEUDO_REGISTER_MAP_LIST_LENGTH " + str(len(self.PseudoRegistersList))+ "\n")
self.HeaderFile.write("#define SEMANTIC_RULES_MAP_LIST_LENGTH " + str(len(self.keywordList) + len(self.OperatorsList) + len(self.SemantiRulesList))+ "\n")
self.HeaderFile.write("#define SEMANTIC_RULES_MAP_LIST_LENGTH " + str(len(self.keywordList) + len(self.OperatorsOneOperand) + len(self.OperatorsTwoOperand) + len(self.SemantiRulesList))+ "\n")
for Key in self.FunctionsDict:
self.HeaderFile.write("#define "+ Key[1:].upper() + "_LENGTH "+ str(len(self.FunctionsDict[Key]))+"\n")
@ -342,8 +344,11 @@ class LL1Parser:
elif Line[0] == ".":
L = Line.split("->")
Elements = L[1].split(" ")
if L[0][1:] == "Operators":
self.OperatorsList += Elements
if L[0][1:] == "OperatorsTwoOperand":
self.OperatorsTwoOperand += Elements
continue
if L[0][1:] == "OperatorsOneOperand":
self.OperatorsOneOperand += Elements
continue
elif L[0][1:] == "SemantiRules":
self.SemantiRulesList += Elements
@ -421,7 +426,11 @@ class LL1Parser:
def WriteSemanticMaps(self):
Counter = 0
for X in self.OperatorsList:
for X in self.OperatorsOneOperand:
self.CommonHeaderFile.write("#define " + "FUNC_" + X.upper() + " " + str(Counter) + "\n")
Counter += 1
for X in self.OperatorsTwoOperand:
self.CommonHeaderFile.write("#define " + "FUNC_" + X.upper() + " " + str(Counter) + "\n")
Counter += 1
@ -438,7 +447,10 @@ class LL1Parser:
self.SourceFile.write("const SYMBOL_MAP SemanticRulesMapList[]= {\n")
self.HeaderFile.write("extern const SYMBOL_MAP SemanticRulesMapList[];\n")
for X in self.OperatorsList:
for X in self.OperatorsOneOperand:
self.SourceFile.write("{\"@" + X.upper() + "\", "+ "FUNC_" + X.upper() + "},\n")
for X in self.OperatorsTwoOperand:
self.SourceFile.write("{\"@" + X.upper() + "\", "+ "FUNC_" + X.upper() + "},\n")
for X in self.SemantiRulesList:
@ -526,12 +538,24 @@ class LL1Parser:
self.SourceFile.write("};\n")
def WriteOperatorsList(self):
self.SourceFile.write("const char* OperatorsList[]= {\n")
self.HeaderFile.write("extern const char* OperatorsList[];\n")
self.SourceFile.write("const char* OperatorsTwoOperandList[]= {\n")
self.HeaderFile.write("extern const char* OperatorsTwoOperandList[];\n")
Counter = 0
for X in self.OperatorsList:
if Counter == len(self.OperatorsList)-1:
for X in self.OperatorsTwoOperand:
if Counter == len(self.OperatorsTwoOperand)-1:
self.SourceFile.write("\"" + "@"+ X.upper() + "\"" + "\n")
else:
self.SourceFile.write("\"" + "@"+ X.upper() + "\"" + ",\n")
Counter +=1
self.SourceFile.write("};\n")
self.SourceFile.write("const char* OperatorsOneOperandList[]= {\n")
self.HeaderFile.write("extern const char* OperatorsOneOperandList[];\n")
Counter = 0
for X in self.OperatorsOneOperand:
if Counter == len(self.OperatorsOneOperand)-1:
self.SourceFile.write("\"" + "@"+ X.upper() + "\"" + "\n")
else:
self.SourceFile.write("\"" + "@"+ X.upper() + "\"" + ",\n")