wsl.ssl

来自「开放源码的编译器open watcom 1.6.0版的源代码」· SSL 代码 · 共 893 行 · 第 1/2 页

SSL
893
字号


    relational:
        @additive
        {
            [
              | ET_EQ:
                @additive
                [SkipCount
                  | 0:
                    DoTstEQ( -1 )
                  | *:
                ]
              | ET_NE:
                @additive
                [SkipCount
                  | 0:
                    DoTstEQ( -1 )
                    PushInt( -1 )
                    DoXor
                  | *:
                ]
              | ET_LE:
                @additive
                [SkipCount
                  | 0:
                    StackSwap( 1 )
                    DoTstLT( -1 )
                    PushInt( -1 )
                    DoXor
                  | *:
                ]
              | ET_GE:
                @additive
                [SkipCount
                  | 0:
                    DoTstLT( -1 )
                    PushInt( -1 )
                    DoXor
                  | *:
                ]
              | ET_LT:
                @additive
                [SkipCount
                  | 0:
                    DoTstLT( -1 )
                  | *:
                ]
              | ET_GT:
                @additive
                [SkipCount
                  | 0:
                    StackSwap( 1 )
                    DoTstLT( -1 )
                  | *:
                ]
              | *:
                >>
            ]
        }
    ;


    additive:
        @multiplicative
        {
            [
              | ET_PLUS:
                @multiplicative
                [SkipCount
                  | 0:
                    DoPlus
                  | *:
                ]
              | ET_MINUS:
                @multiplicative
                [SkipCount
                  | 0:
                    DoMinus
                  | *:
                ]
              | *:
                >>
            ]
        }
    ;



    multiplicative:
        @factor
        {
            [
              | ET_MUL:
                @factor
                [SkipCount
                  | 0:
                    DoMul
                  | *:
                ]
              | ET_DIV:
                @factor
                [SkipCount
                  | 0:
                    DoDiv
                  | *:
                ]
              | ET_MOD:
                @factor
                [SkipCount
                  | 0:
                    DoMod
                  | *:
                ]
              | ET_LSHIFT:
                @factor
                [SkipCount
                  | 0:
                    DoShift
                  | *:
                ]
              | ET_RSHIFT:
                @factor
                [SkipCount
                  | 0:
                    @negate
                    DoShift
                  | *:
                ]
              | *:
                >>
            ]
        }
    ;


    factor:
        [
          | ET_POUND:
            @name
            [SkipCount
              | 0:
                DoAddr
              | *:
            ]
          | ET_MINUS:
            @factor
            [SkipCount
              | 0:
                @negate
              | *:
            ]
          | ET_NOT:
            @factor
            [SkipCount
              | 0:
                PushInt( -1 )
                DoXor
              | *:
            ]
          | ET_LSHIFT:
            @factor
            [SkipCount
              | 0:
                PushInt( 1 )
                DoShift
              | *:
            ]
          | ET_RSHIFT:
            @factor
            [SkipCount
              | 0:
                PushInt( -1 )
                DoShift
              | *:
            ]
          | *:
            @name
        ]
    ;


    name:
        @basic_name
        {
            ScanSave
            [
              | ET_POINT:
                [SkipCount
                  | 0:
                    DoPoints(stk_unsigned)
                  | *:
                ]
              | ET_FAR_INDIR:
                [SkipCount
                  | 0:
                    DoPoints(stk_far_ptr)
                  | *:
                ]
              | ET_LEFT_BRACKET:
                @nest_expr
                [SkipCount
                  | 0:
                    StackRValue( 0 )    % get undefined symbols
                    ET_RIGHT_BRACKET
                    @scale_add
                    DoPoints(stk_unsigned)
                  | *:
                    ET_RIGHT_BRACKET
                ]
              | ET_DOT:
                % ********have to implement type casting*******
                PushName
                [SkipCount
                  | 0:
                    DoField
                  | *:
                ]
              | ET_PLUS_PLUS:
                [SkipCount
                  | 0:
                    PushDup
                    StackRValue( 0 )
                    StackSwap( 1 )
                    PushDup
                    PushInt( 1 )
                    @scale_add
                    DoAssign
                    PopEntry
                  | *:
                ]
              | ET_MINUS_MINUS:
                [SkipCount
                  | 0:
                    PushDup
                    StackRValue( 0 )
                    StackSwap( 1 )
                    PushDup
                    PushInt( -1 )
                    @scale_add
                    DoAssign
                    PopEntry
                  | *:
                ]
              | ET_LEFT_PAREN:
                [ExprType
                  | expr_call:
                    [ParenLevel
                      | 0:
                        ScanRestore     % unget '(' token
                        >>
                      | *:
                    ]
                  | *:
                ]
                NumSet( 0 )
                [
                  | ET_RIGHT_PAREN:
                    % endchoice
                  | *:
                    {
                        @nest_expr
                        [SkipCount
                          | 0:
                            StackValue(0)
                          | *:
                        ]
                        NumAdd( 1 )
                        [
                          | ET_COMMA:
                            % null statement
                          | ET_RIGHT_PAREN:
                            >
                          | *:
                            ET_RIGHT_PAREN % cause error
                        ]
                    }
                ]
                [SkipCount
                  | 0:
                    DoCall
                  | *:
                ]
              | *:
                >>
            ]
        }
    ;


    basic_name:
        [
          | ET_PLUS_PLUS:
            @basic_name
            [SkipCount
              | 0:
                PushDup
                PushInt( 1 )
                @scale_add
                DoAssign
              | *:
            ]
          | ET_MINUS_MINUS:
            @basic_name
            [SkipCount
              | 0:
                PushDup
                PushInt( -1 )
                @scale_add
                DoAssign
              | *:
            ]
          | *:
            @seg_expr
        ]
    ;


   seg_expr:
        [
          | ET_DOT:
            [SkipCount
              | 0:
                PushDot
              | *:
            ]
          | *:
            @primary
            [
              | ET_COLON:
                @primary
                [SkipCount
                  | 0:
                    DoMakeAddr
                  | *:
                ]
              | *:
            ]
        ]
    ;


    primary:
        [
          | ET_LEFT_PAREN:
            @nest_expr
            @req_right_paren
          | ET_LEFT_BRACKET:
            [PushRegSet
              | false:
                #err_loc_and_want_reg_name
              | *:
                [SkipCount
                  | 0:
                  | *:
                    PopEntry
                ]
            ]
            ET_RIGHT_BRACKET
          | ET_MODULE_SPEC:
            ModCurr
            @name_or_lnum
            [SkipCount
              | 0:
              | *:
                PopEntry
            ]
          | *:
            ModNull
            [PushName
              | false :
                [PushNum
                  | false:
                    #err_loc_and_want_operand
                  | *:
                ]
              | *:
                [
                  | ET_MODULE_SPEC:
                      ModNameLkup
                      @name_or_lnum
                  | *:
                ]
            ]
            [SkipCount
             | 0:
             | *:
                PopEntry
            ]
        ]
    ;


    name_or_lnum:
        [PushName
          | false:
            [PushLineNum
              | false:
                #err_loc_and_want_operand
              | *:
            ]
          | *:
        ]
    ;


    scale_add:
        StackRValue( 1 )
        [StackClass( 1 )
          | stk_near_ptr, stk_far_ptr:
            StackMoveSP( 1 )
            PushDup
            DoBaseType
            DoSizeType
            StackMoveSP( -1 )
            DoMul
          | *:
        ]
        DoPlus
    ;


    req_right_paren:
        [
          | ET_RIGHT_PAREN:
            % endchoice
          | *:
            StackLValue(0)      % get undefined symbol
            ET_RIGHT_PAREN      % cause error
        ]
    ;


    negate:
        PushInt( 0 )
        StackSwap( 1 )
        DoMinus
    ;


    nest_expr:
        ParenLevelAdd( 1 )
        @assignment
        ParenLevelAdd( -1 )
    ;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?