home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 4_2005-2006.ISO / data / Zips / DC3_Compil1905536252005.psc / cProgram.cls < prev   
Text File  |  2005-06-25  |  20KB  |  544 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cProgram"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '================================================================================
  15. ' Part of DC3 Compiler - Interpreter
  16. ' Author: Lorenzi Davide (http://www.hexagora.com)
  17. ' See the file 'license.txt' for informations
  18. '================================================================================
  19. '
  20. 'Esegue la generazione del programma
  21. '
  22. '================================================================================
  23.  
  24. Option Explicit
  25.  
  26. '
  27. 'Variabili di gestione
  28. '
  29. Private moSymbTable As cSymbTable
  30. Private moCurrSymbTable As cSymbTable 'Puntatore alla SymbTable Corrente
  31. Private moCompError As cCompilerError
  32. Private mbAllowResAccMod As Boolean
  33. Private moByteCode As cByteCode
  34. Private moResSymb As cResSymbols
  35.  
  36. '
  37. '//////////////////////////////////////////////////////////////////////////////
  38. '
  39.  
  40. 'Return Byte Code
  41. Public Function GetByteCode() As cByteCode
  42.     Set GetByteCode = moByteCode
  43. End Function
  44.  
  45. 'Return Symbol Table
  46. Public Function GetSymbTable() As cSymbTable
  47.     Set GetSymbTable = moSymbTable
  48. End Function
  49.  
  50. '
  51. '//////////////////////////////////////////////////////////////////////////////
  52. '
  53. Public Function Compile(sSource As String, lstLog As ListBox) As Boolean
  54.     On Error GoTo Errore
  55.     
  56.     'Crea la tabella dei simboli per il programma
  57.     Set moSymbTable = New cSymbTable
  58.     Set moCurrSymbTable = moSymbTable
  59.     Set moCompError = New cCompilerError
  60.     Set moByteCode = New cByteCode
  61.     Set moResSymb = New cResSymbols
  62.     
  63.     lstLog.Clear
  64.     
  65.     'La prima istruzione del programma e' sempre NDATA xche' mi permette di
  66.     'allocare lo spazio per le variabili
  67.     'Questa istruzione verra' poi modificata alla fine della compilazione
  68.     Dim lBCIndexVars As Long
  69.     lBCIndexVars = moByteCode.Count
  70.     moByteCode.Add_INData 0, 1
  71.     
  72.     'Prima compila le parole riservate
  73.     Dim oRes As cReduction
  74.     Set oRes = DoParseFile(App.Path & "\dc3res.vb", lstLog)
  75.     
  76.     If Not oRes Is Nothing Then
  77.         'Solo io posso dichiarare cose riservate ;-)
  78.         mbAllowResAccMod = True
  79.         pCompile oRes
  80.         mbAllowResAccMod = False
  81.     
  82.         'Poi il programma vero e proprio
  83.         Dim oParsed As cReduction
  84.         Set oParsed = DoParse(sSource, lstLog)
  85.         
  86.         If Not oParsed Is Nothing Then
  87.             'Poi compila il programma vero e proprio
  88.             pCompile oParsed
  89.             
  90.             'Istruzione di termine del programma
  91.             moByteCode.Add_IEnd 1
  92.             
  93.             'Adesso cambio il valore dell'NDATA
  94.             moByteCode.SetIstroParam moCurrSymbTable.CountType(estet_const) + _
  95.                                     moCurrSymbTable.CountType(estet_var), _
  96.                                     lBCIndexVars, 1
  97.         
  98.             Compile = True
  99.         Else
  100.             Compile = False
  101.         End If
  102.     Else
  103.         Compile = False
  104.     End If
  105.         
  106.     Exit Function
  107.     
  108. Errore:
  109.     Compile = False
  110.     Log "Compiler Error: " & Err.Description, lstLog
  111.  
  112. End Function
  113.  
  114. '
  115. '//////////////////////////////////////////////////////////////////////////////
  116. '
  117.  
  118.  
  119. 'Rende il tipo di modificatore per una certa variabile o procedura
  120. Private Function getAccessModifierOpt(oReduction As cReduction) As eAccessModifier
  121.     With oReduction.oData
  122.         Select Case .ParentRule.TableIndex
  123.             Case Rule_Accessmodifieropt
  124.                '<AccessModifierOpt> ::= <AccessModifier>
  125.                 getAccessModifierOpt = getAccessModifierOpt(.Tokens(0).Data)
  126.                 
  127.                 'Se in pratica sono all'interno di una funzione allora sbrocco
  128.                 If Not moCurrSymbTable Is moSymbTable Then
  129.                     moCompError.RaiseError ece_AccessModifiersNotAllowedHere, oReduction.lRow, oReduction.lCol
  130.                 End If
  131.                 
  132.             Case Rule_Accessmodifieropt2
  133.                '<AccessModifierOpt> ::=
  134.                 getAccessModifierOpt = eam_private
  135.             Case Rule_Accessmodifier_Public
  136.                '<AccessModifier> ::= Public
  137.                   getAccessModifierOpt = eam_public
  138.             Case Rule_Accessmodifier_Private
  139.                '<AccessModifier> ::= Private
  140.                   getAccessModifierOpt = eam_private
  141.             Case Rule_Accessmodifier_Reserved
  142.                '<AccessModifier> ::= Reserved
  143.                 getAccessModifierOpt = eam_reserved
  144.                 
  145.                 'Solo io posso usare il modificatore d'accesso e lo abilito solo per la parte delle funzioni riservate
  146.                 If Not mbAllowResAccMod Then
  147.                     moCompError.RaiseError ece_CannotUseReservedWord, oReduction.lRow, oReduction.lCol
  148.                 End If
  149.         End Select
  150.     End With
  151. End Function
  152.  
  153.  
  154. '<VarDecl> ::= <AccessModifierOpt> Const <VarDeclList> <NL>
  155. '<VarDecl> ::= <AccessModifierOpt> Dim <VarDeclList> <NL>
  156. '<VarDecl> ::= <AccessModifierOpt> Var <VarDeclList> <NL>
  157. Private Sub doVarDecl(oReduction As cReduction)
  158.     Dim iAccessMod As eAccessModifier
  159.     
  160.     With oReduction.oData
  161.         'Leggo il modificatore d'accesso
  162.         iAccessMod = getAccessModifierOpt(.Tokens(0).Data)
  163.         
  164.         Select Case .ParentRule.TableIndex
  165.             Case Rule_Vardecl_Dim, Rule_Vardecl_Var
  166.                 doVarDeclList .Tokens(2).Data, iAccessMod, estet_var
  167.             
  168.             Case Rule_Vardecl_Const
  169.                 doVarDeclList .Tokens(2).Data, iAccessMod, estet_const
  170.         End Select
  171.     End With
  172. End Sub
  173.  
  174. '<VarDeclList> ::= ID '=' <ConstExpr> ',' <VarDeclList>
  175. '<VarDeclList> ::= ID ',' <VarDeclList>
  176. '<VarDeclList> ::= ID '=' <ConstExpr>
  177. '<VarDeclList> ::= ID
  178. Private Sub doVarDeclList(oReduction As cReduction, _
  179.     ByVal iAccMod As eAccessModifier, ByVal iElType As eSymbTableElType)
  180.     
  181.     Dim sVarName As String
  182.     Dim oSymbEl As cSymbTableEl
  183.     
  184.     'Per la lettura delle costanti
  185.     Dim vVarVal As Variant
  186.     Dim iVarType As eVarType
  187.     
  188.     With oReduction.oData
  189.         sVarName = .Tokens(0).Data
  190.     
  191.         'Aggiunge la variabile alla simbol table
  192.         Set oSymbEl = moCurrSymbTable.AddVar(sVarName, iElType, iAccMod)
  193.         If oSymbEl Is Nothing Then
  194.             'Allora lo cerca e vede se e' riservata
  195.             Set oSymbEl = moCurrSymbTable.Search(sVarName)
  196.             If oSymbEl.iAccMod = eam_reserved Then
  197.                 moCompError.RaiseError ece_CannotRedefineReservedWords, oReduction.lRow, oReduction.lCol
  198.             Else
  199.                 moCompError.RaiseError ece_DuplicateDeclarationInCurrentScope, oReduction.lRow, oReduction.lCol
  200.             End If
  201.         End If
  202.         
  203.         Select Case .ParentRule.TableIndex
  204.           Case Rule_Vardecllist_Id_Eq_Comma
  205.              '<VarDeclList> ::= ID '=' <ConstExpr> ',' <VarDeclList>
  206.             
  207.             'Legge il valore costante
  208.             doConstExpr .Tokens(2).Data, iVarType, vVarVal
  209.             'Crea l'istruzione per la sua valorizzazione
  210.             moByteCode.Add_IConst iVarType, vVarVal, oReduction.lRow
  211.             moByteCode.Add_IStore moCurrSymbTable.GetVarIndex(sVarName), Not moCurrSymbTable Is moSymbTable, oReduction.lRow
  212.             
  213.             'E si richiama sulle altre
  214.             doVarDeclList .Tokens(4).Data, iAccMod, iElType
  215.           
  216.           Case Rule_Vardecllist_Id_Comma
  217.              '<VarDeclList> ::= ID ',' <VarDeclList>
  218.                         
  219.             'Le costanti devono avere un valore
  220.             If iElType = estet_const Then
  221.                 moCompError.RaiseError ece_ConstantMustHaveAValue, oReduction.lRow, oReduction.lCol
  222.             End If
  223.             
  224.             'Si richiama sulle altre
  225.             doVarDeclList .Tokens(2).Data, iAccMod, iElType
  226.             
  227.           Case Rule_Vardecllist_Id_Eq
  228.              '<VarDeclList> ::= ID '=' <ConstExpr>
  229.              
  230.             'Legge il valore costante
  231.             doConstExpr .Tokens(2).Data, iVarType, vVarVal
  232.             'Crea l'istruzione per la sua creazione
  233.             moByteCode.Add_IConst iVarType, vVarVal, oReduction.lRow
  234.             moByteCode.Add_IStore moCurrSymbTable.GetVarIndex(sVarName), Not moCurrSymbTable Is moSymbTable, oReduction.lRow
  235.           
  236.           Case Rule_Vardecllist_Id
  237.              '<VarDeclList> ::= ID
  238.              
  239.             'Le costanti devono avere un valore
  240.             If iElType = estet_const Then
  241.                 moCompError.RaiseError ece_ConstantMustHaveAValue, oReduction.lRow, oReduction.lCol
  242.             End If
  243.         End Select
  244.     End With
  245. End Sub
  246.  
  247. 'Rende il carattere separatore dei decimali
  248. Private Function GetDecSep() As String
  249.     GetDecSep = Mid(CStr(0.1), 2, 1)
  250. End Function
  251.  
  252. '<ConstExpr> ::= <BoolLiteral>
  253. '<ConstExpr> ::= <IntLiteral>
  254. '<ConstExpr> ::= FloatLiteral
  255. '<ConstExpr> ::= StringLiteral
  256. '<ConstExpr> ::= <Nothing>
  257. Private Sub doConstExpr(oReduction As cReduction, _
  258.                     ByRef iType As eVarType, _
  259.                     ByRef vVal As Variant)
  260.     
  261.     With oReduction.oData
  262.         Select Case .ParentRule.TableIndex
  263.             Case Rule_Constexpr
  264.                '<ConstExpr> ::= <BoolLiteral>
  265.                 vVal = getBoolLiteral(.Tokens(0).Data)
  266.                 iType = evt_bool
  267.                 
  268.             Case Rule_Constexpr2
  269.                '<ConstExpr> ::= <IntLiteral>
  270.                 vVal = getIntLiteral(.Tokens(0).Data)
  271.                 iType = evt_long
  272.                   
  273.             Case Rule_Constexpr_Floatliteral
  274.                '<ConstExpr> ::= FloatLiteral
  275.                
  276.                'Rimpiazzo il carattere . con quello che serve in base alla lingua
  277.                 vVal = CDbl(Replace(.Tokens(0).Data, ".", GetDecSep()))
  278.                 iType = evt_double
  279.                   
  280.             Case Rule_Constexpr_Stringliteral
  281.                '<ConstExpr> ::= StringLiteral
  282.                 vVal = CStr(.Tokens(0).Data)
  283.                 'Toglie le parentesi
  284.                 vVal = Mid(vVal, 2, Len(vVal) - 2)
  285.                 'Toglie il doppio apice e lo fa diventare singolo
  286.                 vVal = Replace(vVal, """""", """")
  287.                 'Setta il tipo stringa
  288.                 iType = evt_string
  289.                   
  290.             Case Rule_Constexpr3
  291.                '<ConstExpr> ::= <Nothing>
  292.                 vVal = 0
  293.                 iType = evt_null
  294.         End Select
  295.     End With
  296. End Sub
  297.  
  298. '<BoolLiteral> ::= True
  299. '<BoolLiteral> ::= False
  300. Private Function getBoolLiteral(oReduction As cReduction) As Boolean
  301.     With oReduction.oData
  302.         Select Case .ParentRule.TableIndex
  303.         
  304.             Case Rule_Boolliteral_True
  305.                '<BoolLiteral> ::= True
  306.                 getBoolLiteral = True
  307.             
  308.             Case Rule_Boolliteral_False
  309.                '<BoolLiteral> ::= False
  310.                 getBoolLiteral = False
  311.         
  312.         End Select
  313.     End With
  314. End Function
  315.  
  316. '<IntLiteral> ::= IntLiteral
  317. '<IntLiteral> ::= HexLiteral
  318. '<IntLiteral> ::= OctLiteral
  319. Private Function getIntLiteral(oReduction As cReduction) As Long
  320.     With oReduction.oData
  321.         getIntLiteral = CLng(.Tokens(0).Data)
  322.         
  323. '        Select Case .ParentRule.TableIndex
  324. '            Case Rule_Intliteral_Intliteral
  325. '               '<IntLiteral> ::= IntLiteral
  326. '
  327. '            Case Rule_Intliteral_Hexliteral
  328. '               '<IntLiteral> ::= HexLiteral
  329. '
  330. '            Case Rule_Intliteral_Octliteral
  331. '               '<IntLiteral> ::= OctLiteral
  332. '        End Select
  333.     End With
  334. End Function
  335.  
  336. '<SubDecl> ::= <AccessModifierOpt> Sub ID <MethodArgList> <NL> <MethodStmtList> End Sub <NL>
  337. '<SubDecl> ::= <AccessModifierOpt> Function ID <MethodArgList> <NL> <MethodStmtList> End Function <NL>
  338. Private Sub doSubDef(oReduction As cReduction)
  339.  
  340.     Const C_IDX_ACCMOD = 0
  341.     Const C_IDX_SUBNAME = 2
  342.     Const C_IDX_ARGLIST = 3
  343.     Const C_IDX_BLOCK = 5
  344.  
  345.     Dim sSubName As String
  346.     Dim oSymbEl As cSymbTableEl
  347.     Dim iVarType As eSymbTableElType
  348.     Dim iAccMod As eAccessModifier
  349.     Dim lBCIndexJump As Long
  350.  
  351.     With oReduction.oData
  352.         sSubName = .Tokens(C_IDX_SUBNAME).Data
  353.         iAccMod = getAccessModifierOpt(.Tokens(C_IDX_ACCMOD).Data)
  354.         
  355.         Select Case .ParentRule.TableIndex
  356.             Case Rule_Subdecl_Sub_Id_End_Sub
  357.                 '<SubDecl> ::= <AccessModifierOpt> Sub ID <MethodArgList> <NL> <MethodStmtList> End Sub <NL>
  358.                 iVarType = estet_sub
  359.             
  360.             Case Rule_Subdecl_Function_Id_End_Function
  361.                 '<SubDecl> ::= <AccessModifierOpt> Function ID <MethodArgList> <NL> <MethodStmtList> End Function <NL>
  362.                 iVarType = estet_func
  363.         End Select
  364.     
  365.         'Aggiunge la variabile alla simbol table
  366.         Set oSymbEl = moCurrSymbTable.AddFunc(sSubName, iVarType, iAccMod)
  367.         If oSymbEl Is Nothing Then
  368.             'Allora lo cerca
  369.             Set oSymbEl = moCurrSymbTable.Search(sSubName)
  370.             If oSymbEl.iAccMod = eam_reserved Then
  371.                 moCompError.RaiseError ece_CannotRedefineReservedWords, oReduction.lRow, oReduction.lCol
  372.             Else
  373.                 moCompError.RaiseError ece_AmbiguousNameDetected, oReduction.lRow, oReduction.lCol
  374.             End If
  375.         Else
  376.             'Setta come symbol table quella corrente
  377.             Set moCurrSymbTable = oSymbEl.oFuncInfos.oSymbTable
  378.         End If
  379.         
  380.         'Dopo aver creato la Symbol Table locale mette come prima variabile locale
  381.         'il nome della funzione/sub
  382.         moCurrSymbTable.AddVar sSubName, estet_var, eam_notused
  383.         
  384.         'Ovviamente non devo creare il codice per le funzioni/sub riservate
  385.         If oSymbEl.iAccMod <> eam_reserved Then
  386.             'Inserisce un'istruzione di salto oltre la funzione in modo
  387.             'che passi qui dentro solo se viene chiamata
  388.             'Il valore lo modifico alla fine
  389.             
  390.             lBCIndexJump = moByteCode.Count
  391.             moByteCode.Add_IJump -1, oReduction.lRow
  392.         End If
  393.     
  394.         'Processa i parametri della sub/function
  395.         doMethodArgList oSymbEl.oFuncInfos, .Tokens(C_IDX_ARGLIST).Data
  396.     
  397.         'Ovviamente non devo creare il codice per le funzioni/sub riservate
  398.         If oSymbEl.iAccMod <> eam_reserved Then
  399.             'Assegna il puntatore all'indirizzo in memoria in cui e' la funzione
  400.             oSymbEl.oFuncInfos.lInstrPointer = moByteCode.Count()
  401.             
  402.             'Istruzione per l'allocazione delle n. variabili locali
  403.             'Da modificare alla fine quando ho tutta la Symb Table completa
  404.             Dim lBCIndexVars As Long
  405.             lBCIndexVars = moByteCode.Count
  406.             moByteCode.Add_INData 0, oReduction.lRow
  407.             
  408.             'Adesso processa le istruzioni interne
  409.             pCompile .Tokens(C_IDX_BLOCK).Data
  410.         
  411.             'Alla fine inserisce l'istruzione di ritorno per l'uscita dalla funzione
  412.             moByteCode.Add_IReturn oReduction.lRow
  413.         
  414.             'Adesso cambia le coordinate del salto
  415.             moByteCode.SetIstroParam moByteCode.Count(), lBCIndexJump, 1
  416.             
  417.             'Adesso cambia il numero di var. da allocare
  418.             moByteCode.SetIstroParam moCurrSymbTable.CountType(estet_const) + _
  419.                                 moCurrSymbTable.CountType(estet_var) - _
  420.                                 oSymbEl.oFuncInfos.oCollParams.Count - 1, _
  421.                                 lBCIndexVars, 1
  422.         Else
  423.             'Se e' una funzione riservta allora tolgo il puntatore al programma per pulizia
  424.             oSymbEl.oFuncInfos.lInstrPointer = -1
  425.         End If
  426.         
  427.     End With
  428.     
  429.     'Risetta come symboltable quella globale
  430.     Set moCurrSymbTable = moSymbTable
  431. End Sub
  432.  
  433. '<MethodArgList> ::= '(' <ArgList> ')'
  434. '<MethodArgList> ::= '(' ')'
  435. '<ArgList> ::= <Arg> ',' <ArgList>
  436. '<ArgList> ::= <Arg>
  437. '<Arg> ::= <ArgModifier> ID
  438. '
  439. 'Si richiama varie volte fino a raggiungere l'argomento
  440. '
  441. Private Sub doMethodArgList(oFuncInfos As cFuncInfos, oReduction As cReduction)
  442.     
  443.     With oReduction.oData
  444.         Select Case .ParentRule.TableIndex
  445.             Case Rule_Methodarglist_Lparan_Rparan
  446.                '<MethodArgList> ::= '(' <ArgList> ')'
  447.                 doMethodArgList oFuncInfos, .Tokens(1).Data
  448.             
  449.             Case Rule_Methodarglist_Lparan_Rparan2
  450.                '<MethodArgList> ::= '(' ')'
  451.             
  452.             Case Rule_Arglist_Comma
  453.                '<ArgList> ::= <Arg> ',' <ArgList>
  454.                
  455.                '<Arg>
  456.                doMethodArgList oFuncInfos, .Tokens(0).Data
  457.                   
  458.                '<ArgList>
  459.                doMethodArgList oFuncInfos, .Tokens(2).Data
  460.                   
  461.             Case Rule_Arglist
  462.                '<ArgList> ::= <Arg>
  463.                 
  464.                 doMethodArgList oFuncInfos, .Tokens(0).Data
  465.                 
  466.             Case Rule_Arg_Id
  467.                '<Arg> ::= <ArgModifier> ID
  468.                
  469.                'Aggiunge il parametro alla funzione corrente
  470.                 oFuncInfos.AddParam getArgModifier(.Tokens(0).Data), .Tokens(1).Data
  471.                
  472.                'e lo aggiunge anche alle variabili locali
  473.                 oFuncInfos.oSymbTable.AddVar .Tokens(1).Data, estet_var, eAccessModifier.eam_notused
  474.                
  475.         End Select
  476.     End With
  477. End Sub
  478.  
  479. '<ArgModifier> ::= ByVal
  480. '<ArgModifier> ::= ByRef
  481. '<ArgModifier> ::=
  482. Private Function getArgModifier(oReduction As cReduction) As eParmMod
  483.     'Modificatore non specificato
  484.     getArgModifier = epm_NotSpecified
  485.     
  486.     With oReduction.oData
  487.         Select Case .ParentRule.TableIndex
  488.             Case Rule_Argmodifier_Byval
  489.                '<ArgModifier> ::= ByVal
  490.                getArgModifier = epm_ByVal
  491.                   
  492.             Case Rule_Argmodifier_Byref
  493.                '<ArgModifier> ::= ByRef
  494.                getArgModifier = epm_ByRef
  495.         End Select
  496.     End With
  497. End Function
  498.  
  499. '<AssignStmt> ::= <QualifiedID> '=' <Expr>
  500. '<AssignStmt> ::= <QualifiedID> '+=' <Expr>
  501. '<AssignStmt> ::= <QualifiedID> '-=' <Expr>
  502. '<AssignStmt> ::= <QualifiedID> '++'
  503. '<AssignStmt> ::= <QualifiedID> '--'
  504. Private Sub doAssignStmt(oReduction As cReduction)
  505.     Dim oSymbEl As cSymbTableEl
  506.     Dim bIsLocal As Boolean
  507.     Dim poSymbTable As cSymbTable
  508.  
  509.     With oReduction.oData
  510.         'Prende il nome della variabile
  511.         getQualifiedId .Tokens(0).Data, oSymbEl, bIsLocal
  512.         
  513.         'Non posso cambiare il valore di una costante
  514.         If oSymbEl.iType = estet_const Then
  515.             moCompError.RaiseError ece_AssignmentToConstantNotPermitted, oReduction.lRow, oReduction.lCol
  516.         End If
  517.         
  518.         If bIsLocal Then
  519.             Set poSymbTable = moCurrSymbTable
  520.         Else
  521.             Set poSymbTable = moSymbTable
  522.             
  523.             If oSymbEl.iType = estet_func Or oSymbEl.iType = estet_sub Then
  524.                 moCompError.RaiseError ece_AssignmentToFunctionNotPermitted, oReduction.lRow, oReduction.lCol
  525.             End If
  526.             
  527.         End If
  528.     
  529.         Select Case .ParentRule.TableIndex
  530.             Case Rule_Assignstmt_Eq
  531.                 '<AssignStmt> ::= <QualifiedID> '=' <Expr>
  532.                 
  533.                 'Adesso esegue l'espressione
  534.                 doExpr .Tokens(2).Data
  535.                 
  536.                 'Adesso crea l'istro di assegnazione
  537.                 moByteCode.Add_IStore poSymbTable.GetVarIndex(oSymbEl.sName), bIsLocal, oReduction.lRow
  538.         
  539.             Case Rule_Assignstmt_Pluseq
  540.              '<AssignStmt> ::= <QualifiedID> '+=' <Expr>
  541.                 
  542.                 'Aggiunge il suo valore attuale in testa allo stack
  543.                 moByteCode.Add_IG valorizzazione
  544.             moByteCode.Add_ICon