⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pas.gmr

📁 Draak is a multi-language, macro compiler, meaning all syntax and code generation is defined in a si
💻 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 + -