private void relExp( TreeNode ptr ) { TreeNode p ; TreeNode tar = new TreeNode() ; typeIR tIR = new typeIR() ; integer ntype = new integer( 0 ) ; tar.IsTerminal=true ; tar.NonTerminal = nonTerminals.Exp ; p = Search( ptr , tar , 1 ) ; if( p != null ) { Exp( p , tIR , ntype ) ; if( tIR.Equals( CharTy ) ) tIR.copy( IntTy ) ; p = Search( ptr.childs[1] , tar , 2 ) ; ntype.value = 1 ; Exp( p , tIR , ntype ) ; } }
private void term( TreeNode ptr , typeIR tIR , integer ntype) { TreeNode p , q ; TreeNode tar = new TreeNode() ; tar.IsTerminal=true ; tar.NonTerminal = nonTerminals.Factor ; p = Search( ptr , tar , 1 ) ; if( p != null ) { tar.NonTerminal = nonTerminals.Exp ; q = Search( p , tar , 0 ) ; if( q !=null ) Exp( q , tIR , ntype) ; else { tar.NonTerminal = nonTerminals.Variable ; q = Search( p , tar , 1 ) ; if( q != null ){ variable( q , tIR , ntype ) ; } else if( tIR != null && p.ChildNum != 0 && ( q = p.childs[0] ).Terminal.Equals( LexType.INTC)) { if( !tIR.Equals( IntTy ) && ntype.value != 2 ){ error( "语义错误: 类型应该为" + tIR.Kind + ",而不应该是整型" , q.Line , q.Row ) ; } } } tar.NonTerminal = nonTerminals.OtherFactor ; q = Search( ptr , tar , 0 ) ; if( q != null ) { tar.NonTerminal = nonTerminals.Term ; q = Search( q , tar , 0 ) ; if( q != null ) term( q , tIR , ntype ) ; } } }
private void assignmentRest( TreeNode ptr , SymTableNode sym ) { TreeNode p ; TreeNode tar = new TreeNode() ; typeIR tIR = new typeIR() ; tIR.copy( sym.attrIR.idtype ) ; integer ntype = new integer( 1 ) ; tar.IsTerminal=true ; tar.NonTerminal = nonTerminals.VariMore ; p = Search( ptr , tar , 0 ) ; if( p != null ) variMore( p , sym , tIR ) ; if( tIR.Equals( CharTy ) ) tIR.copy( IntTy ) ; tar.NonTerminal = nonTerminals.Exp ; p = Search( ptr , tar , 0 ) ; if( p != null ) { Exp( p , tIR , ntype ) ; } }