update variable type and add float type in script enginr

This commit is contained in:
xmaple555 2026-07-20 23:21:34 +08:00
parent ec5fe7cc8a
commit d44c726dff
25 changed files with 3595 additions and 1301 deletions

View file

@ -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

View file

@ -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

View file

@ -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()

View file

@ -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

View file

@ -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