📄 pas.gmr
字号:
# Pascal Draak Gmr file.
#
#TODO: Multiplication needs serious work.
#TODO: (Obje)cts/Classes would be nice.
#TODO: (Fill in the Integer types)
#TODO: Real types, (with FPU?)
#TODO: (Type declares)
#TODO: Typecasting.
#TODO: (More Robust register allocation.)
#TODO: External DiGraph reduction. (Far future)
#TODO: Strings/(Arrays)
#TODO: (VAR/OUT/CONST/DEFAULT method modifiers)
#TODO: Structured function returns
#TODO: DIRECTIVES
#TODO: (RECOR)Ds
#TODO: (Enumerated, Subrange), Set types, (Booleans)
#TODO: (Pointers)
#TODO: Exceptions
#TODO: (Case)/With
#TODO: Scoping.
#TODO: Packages/Libraries/Dynamic Unit(?)
#TODO: Init/Finalization
#TODO: Int64/QWord
#TODO: Record Varients
#
#TODO: Units with extra printings.
#
#
<Goal> -> <GoalType>
!C n &'uses' True
!I E
!a $reset
!E %1
!b
!I S
#Global Hash Variables
!v u debug T
!v s align 2
!v s addr $u2
# regsx setup
!v s byte IntP
!v s word IntP
!v s cardinal IntP
!v s shortint IntP
!v s smallint IntP
!v s longint IntP
!v s address IntP
!v s ptr ptr
!v s Enum Enum
!v s EnumP EnumP
!v s bool bool
!v s boolP boolP
!v s array array
!v s record record
!v s IntP IntP
!v s Int Int
!v s FloatP FloatP
!v s Float Float
!v s Const Int
!v s raw raw
#Basic data types
@t $base $vn
@d +%undef $1
@d *$1: &'3' 0x00
@d !v s '9' $1
@D !v s '9' &'Base'&'bp'
!C n &'debug' T
!I E
@D +; &'0' $1 &'Base'&'bp'
!I S
@D !C N &'4' &'align'
@D !I l
@D !v i bp &'align'
@D !I s
@D !v i bp &'4'
@D !I S
@l !a $&'1'ify &'sxPack'
@l !C n &'regsx'^ IntP
@l !I E
@l +mov &'5' [&'offset'&'9'], &'sx'^
@l !I s &'regsx'^ Int
@l !a $subrange &'7' &'sx' &'0'
@l +mov &'5' [&'offset'&'9'], &'sx'
@l !I s
@l !Z Expected integer type for $1, got &'regsx'.
@l !I S
@l !a $d
@r !C n $2
@r !I N
@r !Z Incorrect syntax for $1 (Not a function).
@r !I S
@r !a $a
@r !a $&'1'ify &'sxPack'
@r +mov &'sx'^, &'5' [&'offset'&'9']
@a sizeof
@a !v s sizeof &'4'
@a !v s typed &'0'
@a raw
@a !v s sx &'offset'&'9'
@a !v s regsx raw
@a !v s sxsz &'4'
@a !a $pack new
@a sxRaw
@a !a $a
@a !a $addressify &'sxPack'
@a +mov &'sx'^, &'offset'&'9'
@a !a $pack new
@a .
@a !C n $2
@a !I N
@a !z Incorrect usage of !a ($2 not defined in $1)
@a !b
@a !I S
@a !a $&'6'ify &'sxPack'
@a !C n &'regsx'^ IntP
@a !I E
@a +push &'6' &'sx'^
@a !I s &'regsx'^ Int
@a !a $subrange &'7' &'sx' &'0'
@a +push &'6' &'sx'
@a !I S
@a !a $d
@t $subrange $vn
# Examines a subrange, to see if it is violated.
# [1]: bottem, [2]: top, [3]: number, [4]: type name
@a !v s subrange $2
@a !C N &'subrange'[3] &'subrange'[1]
@a !I l
@a !Z &'subrange'[3] violates the subrange bound of a "&'subrange'[4]".
@a !I S
@a !C N &'subrange'[3] &'subrange'[2]
@a !I g
@a !Z &'subrange'[3] violates the subrange bound of a "&'subrange'[4]".
@a !I S
# &'0': Name of type
# &'1': ify type
# &'3': Asm space saver
# &'4': Size in bytes
# &'5': refrence name
# &'6': ify to call when pushing onto stack
# &'7': subrange numbers
# &'9': Defined name.
@t byte $u1
!v C
!v s '0' byte
!v s '1' byte
!v s '3' db
!v s '4' 1
!v s '5' byte
!v s '6' word
!v s '7' 0 255
@s
@E $base
@t word $u2
!v C
!v s '0' word
!v s '1' word
!v s '3' dw
!v s '4' 2
!v s '5' word
!v s '6' word
!v s '7' 0 65535
@s
@E $base
@t cardinal $u4
!v C
!v s '0' cardinal
!v s '1' cardinal
!v s '3' dd
!v s '4' 4
!v s '5' dword
!v s '6' dword
!v s '7' 0 4294967295
@s
@E $base
@T longword cardinal
#@t qword $u8
@t shortint $s1
!v C
!v s '0' shortint
!v s '1' shortint
!v s '3' db
!v s '4' 1
!v s '5' byte
!v s '6' smallint
!v s '7' -128 127
@s
@E $base
@t smallint $s2
!v C
!v s '0' smallint
!v s '1' smallint
!v s '3' dw
!v s '4' 2
!v s '5' word
!v s '6' smallint
!v s '7'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -