pp_c.ssl
来自「开放源码的编译器open watcom 1.6.0版的源代码」· SSL 代码 · 共 1,263 行 · 第 1/2 页
SSL
1,263 行
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright (C) 1987, by WATCOM Systems Inc. All rights %
% reserved. No part of this software may be reproduced %
% in any form or by any means - graphic, electronic or %
% mechanical, including photocopying, recording, taping %
% or information storage and retrieval systems - except %
% with the written permission of WATCOM Systems Inc. %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Modified By Reason
% -------- -- ------
% 88-06-25 Steve Fry initial implementation
% 93/01/20 B.J. Stecher added C++ stuff
%
!include "dbgintr.ssl"
input:
% one character delimiters
ET_GETS '=' = 0x20
ET_LT '<'
ET_GT '>'
ET_PLUS '+'
ET_MINUS '-'
ET_OR '|'
ET_MUL '*'
ET_DIV '/'
ET_AND '&'
ET_NOT '~'
ET_MOD '%'
ET_DOT '.'
ET_COLON ':'
ET_LEFT_PAREN '('
ET_RIGHT_PAREN ')'
ET_COMMA ','
ET_EXCLAMATION '!'
ET_XOR '^'
ET_LEFT_BRACKET '['
ET_RIGHT_BRACKET ']'
ET_MODULE_SPEC '@'
ET_VAR_EXIST '?'
ET_STRING_QUOTE '"'
% two character delimiters
ET_EQ '=='
ET_NE '!='
ET_LE '<='
ET_GE '>='
ET_PLUS_PLUS '++'
ET_MINUS_MINUS '--'
ET_AND_AND '&&'
ET_OR_OR '||'
ET_MUL_GETS '*='
ET_DIV_GETS '/='
ET_MOD_GETS '%='
ET_PLUS_GETS '+='
ET_MINUS_GETS '-='
ET_AND_GETS '&='
ET_XOR_GETS '^='
ET_OR_GETS '|='
ET_LSHIFT '<<'
ET_RSHIFT '>>'
ET_RIGHT_ARROW '->'
!ifdef CPP
ET_SCOPE '::'
!endif
% three character delimiters
ET_LSHFT_GETS '<<='
ET_RSHFT_GETS '>>='
% keywords
ET_CHAR 'char'
ET_DOUBLE 'double'
ET_FLOAT 'float'
ET_INT 'int'
ET_LONG 'long'
ET_SHORT 'short'
ET_SIZEOF 'sizeof'
ET_VOID 'void'
!ifdef JAVA
ET_BYTE 'byte'
ET_BOOLEAN 'boolean'
!else
ET_FAR 'far'
ET_HUGE 'huge'
ET_NEAR 'near'
ET_SIGNED 'signed'
ET_UNSIGNED 'unsigned'
!endif
!ifdef CPP
ET_OPERATOR 'operator'
ET_TRUE 'true'
ET_FALSE 'false'
!endif
% character string escape sequences
% do NOT alter their values or sequences without corresponding
% modifications in dbgscan.c
ET_NL '\\n' = 0x80
ET_HT '\\t'
ET_VT '\\v'
ET_BS '\\b'
ET_CR '\\r'
ET_FF '\\f'
ET_BEL '\\a'
ET_BACKSLASH '\\\\'
ET_QUESTION_MARK '\\?'
ET_SINGLE_QUOTE '\\\''
ET_DOUBLE_QUOTE '\\"'
ET_ZERO '\\0';
input :
% character strings for various structure display operators
% first character is priority
TSTR_PAREN '9(x)' = 0x1000
TSTR_POINTER_IND '1*x'
TSTR_FIELD_SELECT '2x.y'
TSTR_POINTER_FIELD '2x->y'
TSTR_ARRAY '2x[y]'
TSTR_SELF '0x'
TSTR_NULL '0NULL';
rules
expr:
!ifdef JAVA
[SSLVersion( version_dip )
| false:
#err_bad_version
| *:
]
!endif
MarkArrayOrder( false )
SwitchOn( sw_case_sensitive )
ScanCCharNum( true ) % tell scanner to recognise C char as numbers
MoveScanPtr( 0 ) % rescan current token
PurgePgmStack
@assignment
;
!ifdef CPP
get_dtor >>bool:
ScanSave
[
| ET_NOT:
[GetDtorName
| true:
ScanPop
>>true
| *:
]
| *:
]
ScanRestore
>>false
;
get_operator >>bool:
[
| ET_OPERATOR:
GetOperatorName
>>true
| *:
>>false
]
;
parse_qualified_name >>bool:
[@get_operator
| true:
>>true
| *:
]
[@get_dtor
| true:
>>true
| *:
[GetName
| false:
>>false
| *:
]
]
>>true
;
!else
parse_qualified_name >>bool:
[GetName
| false:
>>false
| *:
>>true
]
;
!endif
parse_string:
ScanString( true ) %
ScanRestore % do these so that Scan() won't skip leading spaces
MoveScanPtr( 1 )
{
[
| ET_STRING_QUOTE:
MoveScanPtr( 1 )
ScanString( false )
ScanSave
[
| ET_STRING_QUOTE: % concaternate adjacent strings
ScanString( true )
ScanRestore
MoveScanPtr( 1 )
| *:
AddCCharZero
ScanPop
PushString
>>
]
| ET_NL, ET_HT, ET_VT, ET_BS, ET_CR, ET_FF, ET_BEL,
ET_BACKSLASH, ET_QUESTION_MARK, ET_SINGLE_QUOTE,
ET_DOUBLE_QUOTE, ET_ZERO:
AddCEscapeChar
MoveScanPtr( 2 )
| *:
AddChar
MoveScanPtr( 1 )
]
}
;
!include "dbgrules.ssl"
parsetypename >>bool:
BitsSet( bits_none )
{
[
!ifdef JAVA
| ET_BYTE:
[BitsOr( bits_byte )
| false:
| *:
#err_duplicate_type_spec
]
| ET_BOOLEAN:
[BitsOr( bits_boolean )
| false:
| *:
#err_duplicate_type_spec
]
!else
| ET_SIGNED:
[BitsOr( bits_signed )
| false:
| *:
#err_duplicate_type_spec
]
| ET_UNSIGNED:
[BitsOr( bits_unsigned )
| false:
| *:
#err_duplicate_type_spec
]
!endif
| ET_VOID:
[BitsOr( bits_void )
| false:
| *:
#err_duplicate_type_spec
]
| ET_CHAR:
[BitsOr( bits_char )
| false:
| *:
#err_duplicate_type_spec
]
| ET_SHORT:
[BitsOr( bits_short )
| false:
| *:
#err_duplicate_type_spec
]
| ET_INT:
[BitsOr( bits_int )
| false:
| *:
#err_duplicate_type_spec
]
| ET_LONG:
[BitsOr( bits_long )
| false:
| *:
#err_duplicate_type_spec
]
| ET_FLOAT:
[BitsOr( bits_float )
| false:
| *:
#err_duplicate_type_spec
]
| ET_DOUBLE:
[BitsOr( bits_double )
| false:
| *:
#err_duplicate_type_spec
]
| *:
[BitsGet
| bits_none:
ScanSave
[@push_symbol
| false:
ScanPop
>>false
| *:
[DoLkupType
| false:
PopEntry
ScanRestore
>>false
| *:
]
]
ScanPop
| *:
!ifdef JAVA
@push_scalar_type
!else
[SSLVersion( version_dip )
| false:
@push_scalar_type_old
| *:
@push_scalar_type
]
!endif
]
>
]
}
!ifndef JAVA
{
[
| ET_NEAR:
ET_MUL
@do_point_type_near
| ET_FAR, ET_HUGE:
ET_MUL
@do_point_type_far
| ET_MUL:
@do_point_type_default
| *:
>
]
}
!endif
>>true
;
!ifdef JAVA
push_scalar_type:
[BitsGet
| bits_void:
PushType( TI_void )
| bits_char:
PushType( TI_char_unsigned_2 )
| bits_boolean:
PushType( TI_bool_unsigned_1 )
| bits_byte:
PushType( TI_integer_signed_1 )
| bits_short:
PushType( TI_integer_signed_2 )
| bits_int:
PushType( TI_integer_signed_4 )
| bits_long:
PushType( TI_integer_signed_8 )
| bits_float:
PushType( TI_real_4 )
| bits_double:
PushType( TI_real_8 )
| *:
#err_illegal_type_spec
]
;
!else
push_scalar_type:
[BitsGet
| bits_void:
PushType( TI_void )
| bits_int, bits_signed_int, bits_signed:
PushType( TI_integer_signed_0 )
| bits_short, bits_short_int, bits_signed_short_int, bits_signed_short:
PushType( TI_integer_signed_2 )
| bits_long, bits_signed_long, bits_long_int, bits_signed_long_int:
PushType( TI_integer_signed_4 )
| bits_float:
PushType( TI_real_4 )
| bits_double, bits_long_float, bits_long_double:
PushType( TI_real_8 )
| bits_signed_char:
PushType( TI_integer_signed_1 )
| bits_char, bits_unsigned_char:
PushType( TI_integer_unsigned_1 )
| bits_unsigned, bits_unsigned_int:
PushType( TI_integer_unsigned_0 )
| bits_unsigned_short, bits_unsigned_short_int:
PushType( TI_integer_unsigned_2 )
| bits_unsigned_long, bits_unsigned_long_int:
PushType( TI_integer_unsigned_4 )
| *:
#err_illegal_type_spec
]
;
push_scalar_type_old: %OBSOLETE
[BitsGet
| bits_void:
PushScalarType( type_void )
| bits_char, bits_unsigned_char:
PushScalarType( type_u1 )
| bits_int, bits_signed_int, bits_signed:
[SwitchChk( sw_32_bit )
| false:
PushScalarType( type_s2 )
| *:
PushScalarType( type_s4 )
]
| bits_short, bits_short_int, bits_signed_short_int, bits_signed_short:
PushScalarType( type_s2 )
| bits_long, bits_signed_long, bits_long_int, bits_signed_long_int:
PushScalarType( type_s4 )
| bits_float:
PushScalarType( type_f4 )
| bits_double, bits_long_float, bits_long_double:
PushScalarType( type_f8 )
| bits_signed_char:
PushScalarType( type_s1 )
| bits_unsigned, bits_unsigned_int:
[SwitchChk( sw_32_bit )
| false:
PushScalarType( type_u2 )
| *:
PushScalarType( type_u4 )
]
| bits_unsigned_short, bits_unsigned_short_int:
PushScalarType( type_u2 )
| bits_unsigned_long, bits_unsigned_long_int:
PushScalarType( type_u4 )
| *:
#err_illegal_type_spec
]
;
!endif
nest_expr:
@assignment
;
nest_callexpr:
ExprDepthAdj( 1 )
@assignment
ExprDepthAdj( -1 )
;
assignment:
@conditional
[
| ET_GETS:
@assignment
SwitchOn( sw_side_effect )
[SkipCount
| 0:
DoAssign
| *:
]
| ET_MUL_GETS:
@check_dup
SwitchOn( sw_side_effect )
[SkipCount
| 0:
DoMul
DoAssign
| *:
]
| ET_DIV_GETS:
@check_dup
SwitchOn( sw_side_effect )
[SkipCount
| 0:
DoDiv
DoAssign
| *:
]
| ET_MOD_GETS:
@check_dup
SwitchOn( sw_side_effect )
[SkipCount
| 0:
DoMod
DoAssign
| *:
]
| ET_PLUS_GETS:
@check_dup
SwitchOn( sw_side_effect )
[SkipCount
| 0:
@perform_add
DoAssign
| *:
]
| ET_MINUS_GETS:
@check_dup
SwitchOn( sw_side_effect )
[SkipCount
| 0:
@perform_minus
DoAssign
| *:
]
| ET_RSHFT_GETS:
@check_dup
SwitchOn( sw_side_effect )
[SkipCount
| 0:
@negate
DoShift
DoAssign
| *:
]
| ET_LSHFT_GETS:
@check_dup
SwitchOn( sw_side_effect )
[SkipCount
| 0:
DoShift
DoAssign
| *:
]
| ET_AND_GETS:
@check_dup
SwitchOn( sw_side_effect )
[SkipCount
| 0:
DoAnd
DoAssign
| *:
]
| ET_XOR_GETS:
@check_dup
SwitchOn( sw_side_effect )
[SkipCount
| 0:
DoXor
DoAssign
| *:
]
| ET_OR_GETS:
@check_dup
SwitchOn( sw_side_effect )
[SkipCount
| 0:
DoOr
DoAssign
| *:
]
| *:
]
;
check_dup:
[SkipCount
| 0:
PushDup
| *:
]
@assignment
;
logical_or:
@logical_and
{
[
| ET_OR_OR:
[SkipCount
| 0:
[DoTstTrue( 1 )
| false:
PopEntry
| *:
@skip_ors
>
]
| *:
]
@logical_and
[SkipCount
| 0:
DoTstTrue( 1 ) % make result either true or false
| *:
]
| *:
>
]
}
;
skip_ors:
SkipCountAdd( 1 )
{
@logical_and
[
| ET_OR_OR:
| *:
>
]
}
SkipCountAdd( -1 )
;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?