@@ -625,6 +625,7 @@ def visit_pragma(self, pragma):
625625 'event_condition' : self .visit_pragma_event_condition ,
626626 'update_this_entity_data' : self .visit_pragma_update_this_entity ,
627627 'select_entities' : self .visit_pragma_select_entities ,
628+ 'select_entities_not_matching' : self .visit_pragma_select_not_match ,
628629 'if_this_entity' : self .visit_pragma_if_this_entity ,
629630 'at_this_entity' : self .visit_pragma_at_this_entity ,
630631 'exec_align' : self .visit_pragma_exec_align ,
@@ -665,9 +666,7 @@ def _execute_chain_helper(self, exec_type, args):
665666 self .after_next_statement (lambda : self .emit (IR .ExecEnd (label )))
666667
667668 def visit_pragma_select_entities (self , selector ):
668- assert 'select_entities' not in self .pragmas
669669 selector , sel_inv = self .parse_selector_match (selector )
670- self .pragmas ['select_entities' ] = True
671670 sel_dict = selector if selector else sel_inv
672671 label = self .unique_label ('exec_sel' )
673672 inv = 'N' if not selector else ''
@@ -679,12 +678,18 @@ def visit_pragma_select_entities(self, selector):
679678 self .emit (IR .ExecSel (label_inv , 'ASN' , 'e' , sel_inv .items ()))
680679
681680 def run_after ():
682- del self .pragmas ['select_entities' ]
683681 if label_inv :
684682 self .emit (IR .ExecEnd (label_inv ))
685683 self .emit (IR .ExecEnd (label ))
686684 self .after_next_statement (run_after )
687685
686+ def visit_pragma_select_not_match (self , selector ):
687+ selector , sel_inv = self .parse_selector_match (selector )
688+ assert not sel_inv , "TODO"
689+ label = self .unique_label ('exec_sel_not' )
690+ self .emit (IR .ExecSel (label , 'ASN' , 'e' , selector .items ()))
691+ self .after_next_statement (lambda : self .emit (IR .ExecEnd (label )))
692+
688693 def visit_pragma_if_this_entity (self , selector ):
689694 selector , sel_inv = self .parse_selector_match (selector )
690695 assert not sel_inv , "TODO"
@@ -783,13 +788,14 @@ def stringify_nbt(self, node):
783788 for k ,v in node .items ())
784789 if type (node ) == list :
785790 return '[%s]' % ',' .join (map (self .stringify_nbt , node ))
786- if type (node ) == str :
787- return '"%s"' % node
788- if type (node ) == int :
789- return str (node )
790- if type (node ) == float :
791- return '%ff' % node
792- assert False
791+ if type (node ) == tuple :
792+ val_type , value = node
793+ if val_type == 'string' :
794+ return '"%s"' % value
795+ if val_type in ['int' , 'float' , 'byte' ]:
796+ return value
797+ assert False , val_type
798+ assert False , type (node )
793799
794800 def read_nbt_specification (self , parent , path , value ):
795801 path = path .split ('.' )
@@ -810,21 +816,34 @@ def read_nbt_specification(self, parent, path, value):
810816 else :
811817 assert type (parent [node ]) == list
812818 parent = parent [node ]
813- if value .isdigit ():
814- value = int (value )
815- elif value [0 ].isdigit ():
816- # check for floating points
817- if value .count ('.' ) == 1 and value .endswith ('f' ):
819+ val_type = 'string'
820+ # check for numbers
821+ looks_like_num = value [0 ].isdigit () or value [0 ] == '-'
822+ if looks_like_num :
823+ if value .endswith ('b' ):
824+ try :
825+ int (value [:- 1 ])
826+ val_type = 'byte'
827+ except ValueError :
828+ pass
829+ elif value .endswith ('f' ):
830+ try :
831+ float (value [:- 1 ])
832+ val_type = 'float'
833+ except ValueError :
834+ pass
835+ else :
818836 try :
819- value = float (value [:- 1 ])
837+ int (value )
838+ val_type = 'int'
820839 except ValueError :
821840 pass
822841 if path [- 1 ].isdigit ():
823842 pos = int (path [- 1 ])
824843 while len (parent ) < pos + 1 :
825844 parent .append ({})
826845 path [- 1 ] = pos
827- parent [path [- 1 ]] = value
846+ parent [path [- 1 ]] = ( val_type , value )
828847
829848 ### Declarations
830849
0 commit comments