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 + -
显示快捷键?