mirror of
https://github.com/HyperDbg/HyperDbg.git
synced 2026-08-13 10:34:56 +00:00
update variable type and add float type in script enginr
This commit is contained in:
parent
ec5fe7cc8a
commit
d44c726dff
25 changed files with 3595 additions and 1301 deletions
|
|
@ -29,6 +29,7 @@
|
|||
.ThreeOpFunc4->wcsncmp
|
||||
|
||||
.OperatorsOneOperand->inc dec reference dereference
|
||||
.ScriptVariableType->void bool char short int long unsigned signed float double
|
||||
|
||||
S->BE
|
||||
|
||||
|
|
@ -36,13 +37,17 @@ S->BE
|
|||
BE->B1
|
||||
|
||||
|
||||
B1->B1 || B2 @OR
|
||||
B1->B1 || LOGICAL_OR_BEGIN B2 @LOGICAL_OR_END
|
||||
B1->B2
|
||||
|
||||
LOGICAL_OR_BEGIN->eps @LOGICAL_OR_BEGIN
|
||||
|
||||
B2->B2 && B3 @AND
|
||||
|
||||
B2->B2 && LOGICAL_AND_BEGIN B3 @LOGICAL_AND_END
|
||||
B2->B3
|
||||
|
||||
LOGICAL_AND_BEGIN->eps @LOGICAL_AND_BEGIN
|
||||
|
||||
B3->B3 | B4 @OR
|
||||
B3->B4
|
||||
|
||||
|
|
@ -81,8 +86,10 @@ E10->E12
|
|||
E10->- E12 @NEG
|
||||
E10->+ E12
|
||||
E10->~ E12 @NOT
|
||||
E10->! E12 @LOGICAL_NOT_TYPED
|
||||
E10->* E12 @POI
|
||||
E10->& E12 @REFERENCE
|
||||
E10->sizeof SIZEOF_VALUE
|
||||
|
||||
|
||||
E12->.ZeroOpFunc2 ( ) @.ZeroOpFunc2
|
||||
|
|
@ -96,8 +103,7 @@ E12->.OneOpFunc4 ( WstringNumber ) @.OneOpFunc4
|
|||
E12->.TwoOpFunc4 ( WstringNumber , WstringNumber ) @.TwoOpFunc4
|
||||
E12->.ThreeOpFunc4 ( WstringNumber , WstringNumber , EXP ) @.ThreeOpFunc4
|
||||
|
||||
E12->( BE )
|
||||
|
||||
E12->( CAST_OR_BOOLEAN
|
||||
E12->E12 . MEMBER_NAME @MEMBER_DOT_READ
|
||||
E12->E12 -> MEMBER_NAME @MEMBER_ARROW_READ
|
||||
|
||||
|
|
@ -121,6 +127,26 @@ E12->_pseudo_register @PUSH
|
|||
|
||||
|
||||
E12->E13 ( VA2 ) @END_OF_CALLING_USER_DEFINED_FUNCTION_WITH_RETURNING_VALUE
|
||||
|
||||
CAST_OR_BOOLEAN->CAST_TYPE ) E10 @CAST_SCALAR
|
||||
CAST_OR_BOOLEAN->STRUCT_CAST_TYPE ) E10 @CAST_SCALAR
|
||||
CAST_OR_BOOLEAN->BE )
|
||||
|
||||
CAST_TYPE->_script_variable_type CAST_TYPE_REST @PUSH
|
||||
CAST_TYPE_REST->_script_variable_type CAST_TYPE_REST @PUSH
|
||||
CAST_TYPE_REST->* CAST_POINTERS @DECLARE_POINTER_TYPE
|
||||
CAST_TYPE_REST->eps
|
||||
CAST_POINTERS->* CAST_POINTERS @DECLARE_POINTER_TYPE
|
||||
CAST_POINTERS->eps
|
||||
STRUCT_CAST_TYPE->struct _local_id CAST_POINTERS @PUSH
|
||||
|
||||
SIZEOF_BEGIN->eps @SIZEOF_BEGIN
|
||||
SIZEOF_VALUE->( SIZEOF_PAREN
|
||||
SIZEOF_VALUE->SIZEOF_BEGIN E10 @SIZEOF_EXPRESSION
|
||||
SIZEOF_PAREN->CAST_TYPE ) @SIZEOF_TYPE
|
||||
SIZEOF_PAREN->STRUCT_CAST_TYPE ) @SIZEOF_TYPE
|
||||
SIZEOF_PAREN->SIZEOF_BEGIN BE ) @SIZEOF_EXPRESSION
|
||||
|
||||
E13->_function_id @PUSH
|
||||
MEMBER_NAME->_local_id @PUSH
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@
|
|||
|
||||
.AssignmentOperator->add_assignment sub_assignment mul_assignment div_assignment mod_assignment asl_assignment asr_assignment and_assignment xor_assignment or_assignment
|
||||
|
||||
.SemantiRules->jmp jz jnz mov start_of_do_while start_of_do_while_commands end_of_do_while start_of_for for_inc_dec start_of_for_ommands end_of_if ignore_lvalue push pop call ret struct_forward_declaration struct_definition_begin struct_definition_end struct_variable_declaration struct_member_declaration typedef_declaration struct_pointer struct_array_dimension struct_declarator_complete typed_load typed_store aggregate_copy aggregate_zero struct_initializer_begin struct_initializer_end struct_pointer_cast member_address member_read member_dot_lvalue member_arrow_lvalue member_dot_read member_arrow_read mov_float neg_float add_float sub_float mul_float div_float gt_float lt_float egt_float elt_float equal_float neq_float convert_float
|
||||
.SemantiRules->jmp jz jnz mov start_of_do_while start_of_do_while_commands end_of_do_while start_of_for for_inc_dec start_of_for_ommands end_of_if ignore_lvalue push pop call ret struct_forward_declaration struct_definition_begin struct_definition_end struct_variable_declaration struct_member_declaration typedef_declaration struct_pointer struct_array_dimension struct_declarator_complete typed_load typed_store aggregate_copy aggregate_zero struct_initializer_begin struct_initializer_end struct_pointer_cast member_address member_read member_dot_lvalue member_arrow_lvalue member_dot_read member_arrow_read mov_float neg_float add_float sub_float mul_float div_float gt_float lt_float egt_float elt_float equal_float neq_float convert_float cast_scalar type_name_begin sizeof_begin sizeof_type sizeof_expression logical_not_typed logical_or_begin logical_or_end logical_and_begin logical_and_end
|
||||
|
||||
.Registers->rax eax ax ah al rcx ecx cx ch cl rdx edx dx dh dl rbx ebx bx bh bl rsp esp sp spl rbp ebp bp bpl rsi esi si sil rdi edi di dil r8 r8d r8w r8h r8l r9 r9d r9w r9h r9l r10 r10d r10w r10h r10l r11 r11d r11w r11h r11l r12 r12d r12w r12h r12l r13 r13d r13w r13h r13l r14 r14d r14w r14h r14l r15 r15d r15w r15h r15l ds es fs gs cs ss rflags eflags flags cf pf af zf sf tf if df of iopl nt rf vm ac vif vip id rip eip ip idtr ldtr gdtr tr cr0 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr6 dr7
|
||||
|
||||
|
|
@ -188,9 +188,11 @@ STRUCT_ARRAY_DIMS->[ @PUSH CONST_NUMBER @STRUCT_ARRAY_DIMENSION ] STRUCT_ARRAY_D
|
|||
STRUCT_ARRAY_DIMS->eps
|
||||
|
||||
|
||||
# Typedef declarations are accepted, but typedef-name lookup is implemented in
|
||||
# a later type-system stage. Until then an alias cannot be used as a type.
|
||||
TYPEDEF_DECLARATION->typedef TYPEDEF_BASE_TYPE STRUCT_POINTERS @PUSH _local_id ; @TYPEDEF_DECLARATION
|
||||
# Register the alias before consuming ';'. The LL(1) driver scans one token of
|
||||
# lookahead after every terminal, so placing the semantic action after ';'
|
||||
# would classify the first token in the next declaration before the typedef
|
||||
# exists in the type context.
|
||||
TYPEDEF_DECLARATION->typedef TYPEDEF_BASE_TYPE STRUCT_POINTERS @PUSH _local_id @TYPEDEF_DECLARATION ;
|
||||
|
||||
TYPEDEF_BASE_TYPE->STRUCT_SCALAR_TYPE
|
||||
TYPEDEF_BASE_TYPE->struct @PUSH _local_id
|
||||
|
|
@ -337,7 +339,34 @@ E12->.OneOpFunc4 ( WstringNumber @.OneOpFunc4 )
|
|||
E12->.TwoOpFunc4 ( WstringNumber , WstringNumber @.TwoOpFunc4 )
|
||||
E12->.ThreeOpFunc4 ( WstringNumber , WstringNumber , EXPRESSION @.ThreeOpFunc4 )
|
||||
|
||||
E12->( EXPRESSION )
|
||||
E12->( PAREN_EXPRESSION
|
||||
|
||||
PAREN_EXPRESSION->@TYPE_NAME_BEGIN VARIABLE_TYPE1 CAST_TYPE_REST ) E12 @CAST_SCALAR
|
||||
PAREN_EXPRESSION->@TYPE_NAME_BEGIN struct @PUSH _local_id CAST_POINTERS ) E12 @CAST_SCALAR
|
||||
PAREN_EXPRESSION->EXPRESSION )
|
||||
|
||||
CAST_TYPE_REST->VARIABLE_TYPE1 CAST_TYPE_REST
|
||||
CAST_TYPE_REST->* @DECLARE_POINTER_TYPE CAST_POINTERS
|
||||
CAST_TYPE_REST->eps
|
||||
CAST_POINTERS->* @DECLARE_POINTER_TYPE CAST_POINTERS
|
||||
CAST_POINTERS->eps
|
||||
|
||||
E12->sizeof SIZEOF_OPERAND
|
||||
SIZEOF_OPERAND->( SIZEOF_PAREN
|
||||
SIZEOF_OPERAND->@SIZEOF_BEGIN SIZEOF_UNPAREN @SIZEOF_EXPRESSION
|
||||
SIZEOF_PAREN->@TYPE_NAME_BEGIN VARIABLE_TYPE1 CAST_TYPE_REST ) @SIZEOF_TYPE
|
||||
SIZEOF_PAREN->@TYPE_NAME_BEGIN struct @PUSH _local_id CAST_POINTERS ) @SIZEOF_TYPE
|
||||
SIZEOF_PAREN->@SIZEOF_BEGIN EXPRESSION ) @SIZEOF_EXPRESSION
|
||||
|
||||
SIZEOF_UNPAREN->L_VALUE MEMBER_READ_SUFFIX ARRAY_DIMS_READ_OPT
|
||||
SIZEOF_UNPAREN->CONST_NUMBER
|
||||
SIZEOF_UNPAREN->@PUSH _pseudo_register
|
||||
SIZEOF_UNPAREN->- E12 @NEG
|
||||
SIZEOF_UNPAREN->+ E12
|
||||
SIZEOF_UNPAREN->~ E12 @NOT
|
||||
SIZEOF_UNPAREN->! E12 @LOGICAL_NOT_TYPED
|
||||
SIZEOF_UNPAREN->* E12 @POI
|
||||
SIZEOF_UNPAREN->& E12 @REFERENCE
|
||||
|
||||
E12->L_VALUE MEMBER_READ_SUFFIX ARRAY_DIMS_READ_OPT
|
||||
|
||||
|
|
@ -372,6 +401,7 @@ E12->@PUSH _pseudo_register
|
|||
E12->- E12 @NEG
|
||||
E12->+ E12
|
||||
E12->~ E12 @NOT
|
||||
E12->! E12 @LOGICAL_NOT_TYPED
|
||||
E12->* E12 @POI
|
||||
E12->& E12 @REFERENCE
|
||||
|
||||
|
|
|
|||
|
|
@ -14,9 +14,23 @@
|
|||
|
||||
"""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
from ll1_parser import *
|
||||
from lalr1_parser import *
|
||||
|
||||
|
||||
def EnsureDeterministicHashSeed():
|
||||
"""Restart the generator with stable set/dict iteration ordering."""
|
||||
if os.environ.get("PYTHONHASHSEED") == "0":
|
||||
return
|
||||
|
||||
Environment = os.environ.copy()
|
||||
Environment["PYTHONHASHSEED"] = "0"
|
||||
raise SystemExit(subprocess.call([sys.executable] + sys.argv, env=Environment))
|
||||
|
||||
class Generator():
|
||||
def __init__(self):
|
||||
self.SourceFile = open("..\\code\\parse-table.c", "w")
|
||||
|
|
@ -91,6 +105,20 @@ object ScriptConstants {
|
|||
val SYMBOL_VALUE_KIND_INTEGER = 0
|
||||
val SYMBOL_VALUE_KIND_FLOAT32 = 1
|
||||
val SYMBOL_VALUE_KIND_FLOAT64 = 2
|
||||
val SCRIPT_SCALAR_TYPE_INVALID = 0
|
||||
val SCRIPT_SCALAR_TYPE_BOOL = 1
|
||||
val SCRIPT_SCALAR_TYPE_I8 = 2
|
||||
val SCRIPT_SCALAR_TYPE_I16 = 3
|
||||
val SCRIPT_SCALAR_TYPE_I32 = 4
|
||||
val SCRIPT_SCALAR_TYPE_I64 = 5
|
||||
val SCRIPT_SCALAR_TYPE_U8 = 6
|
||||
val SCRIPT_SCALAR_TYPE_U16 = 7
|
||||
val SCRIPT_SCALAR_TYPE_U32 = 8
|
||||
val SCRIPT_SCALAR_TYPE_U64 = 9
|
||||
val SCRIPT_SCALAR_TYPE_F32 = 10
|
||||
val SCRIPT_SCALAR_TYPE_F64 = 11
|
||||
val SCRIPT_SCALAR_TYPE_POINTER = 12
|
||||
val SCRIPT_SCALAR_TYPE_F80 = 13
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -180,6 +208,21 @@ typedef struct ACTION_BUFFER {
|
|||
#define SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL 1
|
||||
#define SCRIPT_ENGINE_ADDRESS_SPACE_REMOTE 2
|
||||
|
||||
#define SCRIPT_SCALAR_TYPE_INVALID 0
|
||||
#define SCRIPT_SCALAR_TYPE_BOOL 1
|
||||
#define SCRIPT_SCALAR_TYPE_I8 2
|
||||
#define SCRIPT_SCALAR_TYPE_I16 3
|
||||
#define SCRIPT_SCALAR_TYPE_I32 4
|
||||
#define SCRIPT_SCALAR_TYPE_I64 5
|
||||
#define SCRIPT_SCALAR_TYPE_U8 6
|
||||
#define SCRIPT_SCALAR_TYPE_U16 7
|
||||
#define SCRIPT_SCALAR_TYPE_U32 8
|
||||
#define SCRIPT_SCALAR_TYPE_U64 9
|
||||
#define SCRIPT_SCALAR_TYPE_F32 10
|
||||
#define SCRIPT_SCALAR_TYPE_F64 11
|
||||
#define SCRIPT_SCALAR_TYPE_POINTER 12
|
||||
#define SCRIPT_SCALAR_TYPE_F80 13
|
||||
|
||||
static const char *const SymbolTypeNames[] = {
|
||||
"SYMBOL_UNDEFINED",
|
||||
"SYMBOL_GLOBAL_ID_TYPE",
|
||||
|
|
@ -219,7 +262,8 @@ static const char *const SymbolTypeNames[] = {
|
|||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
EnsureDeterministicHashSeed()
|
||||
|
||||
gen = Generator()
|
||||
gen.Run()
|
||||
|
||||
|
|
|
|||
|
|
@ -142,8 +142,8 @@ class LALR1Parser:
|
|||
self.SourceFile.write("};\n")
|
||||
|
||||
def WriteTerminalList(self):
|
||||
self.SourceFile.write("const char* LalrTerminalMap[TERMINAL_COUNT]= \n{\n")
|
||||
self.HeaderFile.write("extern const char* LalrTerminalMap[TERMINAL_COUNT];\n")
|
||||
self.SourceFile.write("const char* LalrTerminalMap[LALR_TERMINAL_COUNT]=\n{\n")
|
||||
self.HeaderFile.write("extern const char* LalrTerminalMap[LALR_TERMINAL_COUNT];\n")
|
||||
Counter = 0
|
||||
for X in self.TerminalList:
|
||||
if Counter == len(self.TerminalList)-1:
|
||||
|
|
@ -154,8 +154,8 @@ class LALR1Parser:
|
|||
self.SourceFile.write("};\n")
|
||||
|
||||
def WriteNoneTermianlList(self):
|
||||
self.SourceFile.write("const char* LalrNoneTerminalMap[NONETERMINAL_COUNT]= \n{\n")
|
||||
self.HeaderFile.write("extern const char* LalrNoneTerminalMap[NONETERMINAL_COUNT];\n")
|
||||
self.SourceFile.write("const char* LalrNoneTerminalMap[LALR_NONTERMINAL_COUNT]=\n{\n")
|
||||
self.HeaderFile.write("extern const char* LalrNoneTerminalMap[LALR_NONTERMINAL_COUNT];\n")
|
||||
Counter = 0
|
||||
for X in self.NonTerminalList:
|
||||
if Counter == len(self.NonTerminalList)-1:
|
||||
|
|
@ -292,9 +292,9 @@ class LALR1Parser:
|
|||
|
||||
self.TerminalSet.add("$")
|
||||
|
||||
self.NonTerminalList = list(self.NonTerminalSet)
|
||||
self.NonTerminalList = sorted(self.NonTerminalSet)
|
||||
|
||||
self.TerminalList = list(self.TerminalSet)
|
||||
self.TerminalList = sorted(self.TerminalSet)
|
||||
|
||||
def FillActionTable(self):
|
||||
self.ActionTable = [[self.INVALID for y in range(len(self.TerminalList))] for X in range(self.StateCount)]
|
||||
|
|
@ -305,9 +305,21 @@ class LALR1Parser:
|
|||
Action = self.ParseTable.action[RowId][Terminal]
|
||||
Type = None
|
||||
StateId = None
|
||||
for Element in Action:
|
||||
Type = Element[0]
|
||||
StateId = Element[1]
|
||||
Elements = list(Action)
|
||||
ShiftActions = [Element for Element in Elements if Element[0] == 'S']
|
||||
AcceptActions = [Element for Element in Elements if Element[0] == 'accept']
|
||||
ReduceActions = [Element for Element in Elements if Element[0] == 'R']
|
||||
if AcceptActions:
|
||||
Type, StateId = AcceptActions[0]
|
||||
elif ShiftActions:
|
||||
# Match conventional yacc behavior for shift/reduce
|
||||
# conflicts. In particular, sizeof '(' must shift so
|
||||
# SIZEOF_PAREN can distinguish a type-name from an
|
||||
# expression instead of prematurely reducing the
|
||||
# unparenthesized sizeof production.
|
||||
Type, StateId = sorted(ShiftActions, key=lambda Element: int(Element[1]))[0]
|
||||
elif ReduceActions:
|
||||
Type, StateId = sorted(ReduceActions, key=lambda Element: int(Element[1]))[0]
|
||||
if Type != None:
|
||||
if Type == 'S':
|
||||
self.ActionTable[RowId][self.GetTerminalId(Terminal)] = StateId
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ class LL1Parser:
|
|||
self.MAXIMUM_RHS_LEN = 0
|
||||
|
||||
|
||||
self.SPECIAL_TOKENS = ['%', '+', '~', '++', '-', '--', '->', '.', "*", "/", "=", "==", "!=", ",", ";", "(", ")", "{", "}", "|", "||", ">>", ">=", "<<", "<=", "&", "&&", "^",
|
||||
self.SPECIAL_TOKENS = ['%', '+', '~', '!', '++', '-', '--', '->', '.', "*", "/", "=", "==", "!=", ",", ";", "(", ")", "{", "}", "|", "||", ">>", ">=", "<<", "<=", "&", "&&", "^",
|
||||
"+=", "-=", "*=", "/=", "%=", "<<=", ">>=", "&=", "^=", "|=" , "[", "]"]
|
||||
|
||||
# INVALID rule indicator
|
||||
|
|
@ -430,9 +430,9 @@ class LL1Parser:
|
|||
|
||||
self.TerminalSet.add("$")
|
||||
|
||||
self.NonTerminalList = list(self.NonTerminalSet)
|
||||
self.NonTerminalList = sorted(self.NonTerminalSet)
|
||||
|
||||
self.TerminalList = list(self.TerminalSet)
|
||||
self.TerminalList = sorted(self.TerminalSet)
|
||||
|
||||
|
||||
def WriteSemanticMaps(self):
|
||||
|
|
@ -453,11 +453,23 @@ class LL1Parser:
|
|||
"convert_float"
|
||||
}
|
||||
aggregate_keywords = {"struct", "typedef"}
|
||||
legacy_semantics = [x for x in self.SemantiRulesList if x not in aggregate_semantics]
|
||||
append_only_semantics = [
|
||||
"cast_scalar",
|
||||
"add_typed", "sub_typed", "mul_typed", "div_typed", "mod_typed",
|
||||
"bitwise_and_typed", "bitwise_or_typed", "bitwise_xor_typed",
|
||||
"shift_left_typed", "shift_right_typed",
|
||||
"gt_typed", "lt_typed", "egt_typed", "elt_typed", "equal_typed", "neq_typed",
|
||||
"neg_typed", "bitwise_not_typed", "logical_not_typed", "pointer_diff"
|
||||
]
|
||||
compiler_only_semantics = {
|
||||
"type_name_begin", "sizeof_begin", "sizeof_type", "sizeof_expression",
|
||||
"logical_or_begin", "logical_or_end", "logical_and_begin", "logical_and_end"
|
||||
}
|
||||
legacy_semantics = [x for x in self.SemantiRulesList if x not in aggregate_semantics and x not in append_only_semantics and x not in compiler_only_semantics]
|
||||
new_semantics = [x for x in self.SemantiRulesList if x in aggregate_semantics]
|
||||
legacy_keywords = [x for x in self.keywordList if x not in aggregate_keywords]
|
||||
new_keywords = [x for x in self.keywordList if x in aggregate_keywords]
|
||||
numbered_semantics = legacy_semantics + legacy_keywords + new_semantics + new_keywords
|
||||
numbered_semantics = legacy_semantics + legacy_keywords + new_semantics + new_keywords + append_only_semantics
|
||||
|
||||
self.CommonHeaderFileScala.write("object ScriptEvalFunc {\n object ScriptOperators extends ChiselEnum {\n val ")
|
||||
|
||||
|
|
@ -506,7 +518,10 @@ class LL1Parser:
|
|||
self.SourceFile.write("{\"@" + X.upper() + "\", "+ "FUNC_" + X.upper() + "},\n")
|
||||
|
||||
for X in self.SemantiRulesList:
|
||||
self.SourceFile.write("{\"@" + X.upper() + "\", "+ "FUNC_" + X.upper() + "},\n")
|
||||
if X in compiler_only_semantics:
|
||||
self.SourceFile.write("{\"@" + X.upper() + "\", FUNC_UNDEFINED},\n")
|
||||
else:
|
||||
self.SourceFile.write("{\"@" + X.upper() + "\", "+ "FUNC_" + X.upper() + "},\n")
|
||||
|
||||
for X in self.keywordList:
|
||||
self.SourceFile.write("{\"@" + X.upper() + "\", "+ "FUNC_" + X.upper() + "},\n")
|
||||
|
|
@ -872,8 +887,9 @@ class LL1Parser:
|
|||
self.ParseTable[i][j] = RuleId
|
||||
|
||||
else:
|
||||
|
||||
print("Error! Input grammar is not LL1.")
|
||||
print("Error! Input grammar is not LL1: " + Lhs +
|
||||
" on " + Terminal + " conflicts between rules " +
|
||||
str(self.ParseTable[i][j]) + " and " + str(RuleId) + ".")
|
||||
exit()
|
||||
|
||||
j += 1
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue