mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Switch from parentheses to angle brackets
`\(` is more likely to be a valid escape sequence in the
future (as is `\[`) and `\{` is already taken.
This commit is contained in:
@@ -717,19 +717,19 @@ static void freeExpansion(struct Expansion *expansion)
|
|||||||
|
|
||||||
static bool isMacroChar(char c)
|
static bool isMacroChar(char c)
|
||||||
{
|
{
|
||||||
return c == '@' || c == '#' || c == '(' || (c >= '0' && c <= '9');
|
return c == '@' || c == '#' || c == '<' || (c >= '0' && c <= '9');
|
||||||
}
|
}
|
||||||
|
|
||||||
/* forward declarations for readParentheticMacroArgNum */
|
/* forward declarations for readBracketedMacroArgNum */
|
||||||
static int peek(void);
|
static int peek(void);
|
||||||
static void shiftChar(void);
|
static void shiftChar(void);
|
||||||
static uint32_t readNumber(int radix, uint32_t baseValue);
|
static uint32_t readNumber(int radix, uint32_t baseValue);
|
||||||
static bool startsIdentifier(int c);
|
static bool startsIdentifier(int c);
|
||||||
static bool continuesIdentifier(int c);
|
static bool continuesIdentifier(int c);
|
||||||
|
|
||||||
static uint32_t readParentheticMacroArgNum(void)
|
static uint32_t readBracketedMacroArgNum(void)
|
||||||
{
|
{
|
||||||
dbgPrint("Reading parenthetic macro arg\n");
|
dbgPrint("Reading bracketed macro arg\n");
|
||||||
bool disableMacroArgs = lexerState->disableMacroArgs;
|
bool disableMacroArgs = lexerState->disableMacroArgs;
|
||||||
bool disableInterpolation = lexerState->disableInterpolation;
|
bool disableInterpolation = lexerState->disableInterpolation;
|
||||||
|
|
||||||
@@ -761,9 +761,9 @@ static uint32_t readParentheticMacroArgNum(void)
|
|||||||
struct Symbol const *sym = sym_FindScopedSymbol(symName);
|
struct Symbol const *sym = sym_FindScopedSymbol(symName);
|
||||||
|
|
||||||
if (!sym)
|
if (!sym)
|
||||||
fatalerror("Parenthetic symbol \"%s\" does not exist\n", symName);
|
fatalerror("Bracketed symbol \"%s\" does not exist\n", symName);
|
||||||
else if (!sym_IsNumeric(sym))
|
else if (!sym_IsNumeric(sym))
|
||||||
fatalerror("Parenthetic symbol \"%s\" is not numeric\n", symName);
|
fatalerror("Bracketed symbol \"%s\" is not numeric\n", symName);
|
||||||
|
|
||||||
num = sym_GetConstantSymValue(sym);
|
num = sym_GetConstantSymValue(sym);
|
||||||
} else {
|
} else {
|
||||||
@@ -771,12 +771,12 @@ static uint32_t readParentheticMacroArgNum(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
c = peek();
|
c = peek();
|
||||||
if (c != ')')
|
if (c != '>')
|
||||||
fatalerror("Invalid character in parenthetic macro argument %s\n", printChar(c));
|
fatalerror("Invalid character in bracketed macro argument %s\n", printChar(c));
|
||||||
else if (empty)
|
else if (empty)
|
||||||
fatalerror("Empty parenthetic macro argument\n");
|
fatalerror("Empty bracketed macro argument\n");
|
||||||
else if (num == 0)
|
else if (num == 0)
|
||||||
fatalerror("Invalid parenthetic macro argument '\\(0)'\n");
|
fatalerror("Invalid bracketed macro argument '\\<0>'\n");
|
||||||
|
|
||||||
shiftChar();
|
shiftChar();
|
||||||
|
|
||||||
@@ -793,12 +793,12 @@ static char const *readMacroArg(char name)
|
|||||||
str = macro_GetUniqueIDStr();
|
str = macro_GetUniqueIDStr();
|
||||||
} else if (name == '#') {
|
} else if (name == '#') {
|
||||||
str = macro_GetAllArgs();
|
str = macro_GetAllArgs();
|
||||||
} else if (name == '(') {
|
} else if (name == '<') {
|
||||||
uint32_t num = readParentheticMacroArgNum();
|
uint32_t num = readBracketedMacroArgNum();
|
||||||
|
|
||||||
str = macro_GetArg(num);
|
str = macro_GetArg(num);
|
||||||
if (!str)
|
if (!str)
|
||||||
fatalerror("Macro argument '\\(%" PRIu32 ")' not defined\n", num);
|
fatalerror("Macro argument '\\<%" PRIu32 ">' not defined\n", num);
|
||||||
} else if (name == '0') {
|
} else if (name == '0') {
|
||||||
fatalerror("Invalid macro argument '\\0'\n");
|
fatalerror("Invalid macro argument '\\0'\n");
|
||||||
} else {
|
} else {
|
||||||
@@ -1569,7 +1569,7 @@ static void readString(void)
|
|||||||
case '7':
|
case '7':
|
||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
case '(':
|
case '<':
|
||||||
shiftChar();
|
shiftChar();
|
||||||
char const *str = readMacroArg(c);
|
char const *str = readMacroArg(c);
|
||||||
|
|
||||||
@@ -1715,7 +1715,7 @@ static size_t appendStringLiteral(size_t i)
|
|||||||
case '7':
|
case '7':
|
||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
case '(':
|
case '<':
|
||||||
shiftChar();
|
shiftChar();
|
||||||
char const *str = readMacroArg(c);
|
char const *str = readMacroArg(c);
|
||||||
|
|
||||||
|
|||||||
@@ -1567,30 +1567,30 @@ The backslash in
|
|||||||
does not need to be escaped because string literals also work as usual inside macro arguments.
|
does not need to be escaped because string literals also work as usual inside macro arguments.
|
||||||
.Pp
|
.Pp
|
||||||
Since there are only nine digits, you can only access the first nine macro arguments like this.
|
Since there are only nine digits, you can only access the first nine macro arguments like this.
|
||||||
To use the rest, you need to put the multi-digit argument number in parentheses, like
|
To use the rest, you need to put the multi-digit argument number in angle brackets, like
|
||||||
.Ql \[rs](10) .
|
.Ql \[rs]<10> .
|
||||||
This parenthetic syntax supports decimal numbers and numeric symbol names.
|
This bracketed syntax supports decimal numbers and numeric symbol names.
|
||||||
For example,
|
For example,
|
||||||
.Ql \[rs](_NARG)
|
.Ql \[rs]<_NARG>
|
||||||
will get the last argument.
|
will get the last argument.
|
||||||
.Pp
|
.Pp
|
||||||
Other macro arguments and symbol interpolations will be expanded inside the parentheses.
|
Other macro arguments and symbol interpolations will be expanded inside the angle brackets.
|
||||||
For example, if
|
For example, if
|
||||||
.Ql \[rs]1
|
.Ql \[rs]1
|
||||||
is
|
is
|
||||||
.Ql 13 ,
|
.Ql 13 ,
|
||||||
then
|
then
|
||||||
.Ql \[rs](\[rs]1)
|
.Ql \[rs]<\[rs]1>
|
||||||
will expand to
|
will expand to
|
||||||
.Ql \[rs](13) .
|
.Ql \[rs]<13> .
|
||||||
Or if
|
Or if
|
||||||
.Ql v10 = 42
|
.Ql v10 = 42
|
||||||
and
|
and
|
||||||
.Ql x = 10 ,
|
.Ql x = 10 ,
|
||||||
then
|
then
|
||||||
.Ql \[rs](v{d:x})
|
.Ql \[rs]<v{d:x}>
|
||||||
will expand to
|
will expand to
|
||||||
.Ql \[rs](42) .
|
.Ql \[rs]<42> .
|
||||||
.Pp
|
.Pp
|
||||||
Another way to access more than nine macro arguments is the
|
Another way to access more than nine macro arguments is the
|
||||||
.Ic SHIFT
|
.Ic SHIFT
|
||||||
|
|||||||
19
test/asm/bracketed-macro-args.asm
Normal file
19
test/asm/bracketed-macro-args.asm
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
MACRO printargs
|
||||||
|
PRINTLN "first = \<1>"
|
||||||
|
FOR I, 2, _NARG
|
||||||
|
PRINTLN "next = \<{d:I}>"
|
||||||
|
ENDR
|
||||||
|
PRINTLN "last = \<{d:_NARG}>"
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
printargs A, B, C, D
|
||||||
|
|
||||||
|
MACRO mac
|
||||||
|
println \<2__> + \<1_2> + \<\1>
|
||||||
|
x = 2
|
||||||
|
println \<{d:x}> + \<1_{d:x}> + \<\<\<13>>>
|
||||||
|
y equs "NARG"
|
||||||
|
println \<x> + \<1_{d:x}_> + \<\<\<_{y}>>>
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
mac 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 1
|
||||||
@@ -1 +1 @@
|
|||||||
\()
|
\<>
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
FATAL: invalid-empty-macro-arg.asm(1):
|
FATAL: invalid-empty-macro-arg.asm(1):
|
||||||
Empty parenthetic macro argument
|
Empty bracketed macro argument
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
\(10!)
|
\<10!>
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
FATAL: invalid-macro-arg-character.asm(1):
|
FATAL: invalid-macro-arg-character.asm(1):
|
||||||
Invalid character in parenthetic macro argument '!'
|
Invalid character in bracketed macro argument '!'
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
\(foo)
|
\<foo>
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
FATAL: invalid-macro-arg-symbol.asm(1):
|
FATAL: invalid-macro-arg-symbol.asm(1):
|
||||||
Parenthetic symbol "foo" does not exist
|
Bracketed symbol "foo" does not exist
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
MACRO printargs
|
|
||||||
PRINTLN "first = \(1)"
|
|
||||||
FOR I, 2, _NARG
|
|
||||||
PRINTLN "next = \({d:I})"
|
|
||||||
ENDR
|
|
||||||
PRINTLN "last = \({d:_NARG})"
|
|
||||||
ENDM
|
|
||||||
|
|
||||||
printargs A, B, C, D
|
|
||||||
|
|
||||||
MACRO mac
|
|
||||||
println \(2__) + \(1_2) + \(\1)
|
|
||||||
x = 2
|
|
||||||
println \({d:x}) + \(1_{d:x}) + \(\(\(13)))
|
|
||||||
y equs "NARG"
|
|
||||||
println \(x) + \(1_{d:x}_) + \(\(\(_{y})))
|
|
||||||
ENDM
|
|
||||||
|
|
||||||
mac 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 1
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
MACRO N
|
MACRO N
|
||||||
FOR R,1,_NARG+1
|
FOR R,1,_NARG+1
|
||||||
PRINT STRSUB("\n\"\\ PR1NT,ABCDEFGHIMnOSU2_+-()",\(R)+1,1)
|
PRINT STRSUB("\n\"\\ PR1NT,ABCDEFGHIMnOSU2_+-()<>",\<R>+1,1)
|
||||||
ENDR
|
ENDR
|
||||||
REPT R-2
|
REPT R-2
|
||||||
PRINT"\1,"
|
PRINT"\1,"
|
||||||
@@ -8,4 +8,4 @@ SHIFT
|
|||||||
ENDR
|
ENDR
|
||||||
PRINT"\1\n"
|
PRINT"\1\n"
|
||||||
ENDM
|
ENDM
|
||||||
N 19,10,12,5,21,3,7,0,15,21,5,3,5,9,6,9,25,7,10,5,16,26,6,0,4,5,18,7,8,3,22,8,5,22,23,11,28,1,2,20,2,1,2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,1,9,2,28,5,29,26,6,9,6,29,0,14,7,13,5,0,5,14,4,8,3,5,27,24,0,4,5,18,7,8,1,2,6,9,1,0,22,17,18,15,8,0,14,7,13,5,0,4,5,18,7,8,1,2,6,2,20,1,0,14,7,13,19,0,3,7,3
|
N 19,10,12,5,21,3,7,0,15,21,5,3,5,9,6,9,25,7,10,5,16,26,6,0,4,5,18,7,8,3,22,8,5,22,23,11,28,1,2,20,2,1,2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,1,9,2,30,5,31,26,6,9,6,29,0,14,7,13,5,0,5,14,4,8,3,5,27,24,0,4,5,18,7,8,1,2,6,9,1,0,22,17,18,15,8,0,14,7,13,5,0,4,5,18,7,8,1,2,6,2,20,1,0,14,7,13,19,0,3,7,3
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
MACRO N
|
MACRO N
|
||||||
FOR R,1,_NARG+1
|
FOR R,1,_NARG+1
|
||||||
PRINT STRSUB("\n\"\\ PR1NT,ABCDEFGHIMnOSU2_+-()",\(R)+1,1)
|
PRINT STRSUB("\n\"\\ PR1NT,ABCDEFGHIMnOSU2_+-()<>",\<R>+1,1)
|
||||||
ENDR
|
ENDR
|
||||||
REPT R-2
|
REPT R-2
|
||||||
PRINT"\1,"
|
PRINT"\1,"
|
||||||
@@ -8,4 +8,4 @@ SHIFT
|
|||||||
ENDR
|
ENDR
|
||||||
PRINT"\1\n"
|
PRINT"\1\n"
|
||||||
ENDM
|
ENDM
|
||||||
N 19,10,12,5,21,3,7,0,15,21,5,3,5,9,6,9,25,7,10,5,16,26,6,0,4,5,18,7,8,3,22,8,5,22,23,11,28,1,2,20,2,1,2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,1,9,2,28,5,29,26,6,9,6,29,0,14,7,13,5,0,5,14,4,8,3,5,27,24,0,4,5,18,7,8,1,2,6,9,1,0,22,17,18,15,8,0,14,7,13,5,0,4,5,18,7,8,1,2,6,2,20,1,0,14,7,13,19,0,3,7,3
|
N 19,10,12,5,21,3,7,0,15,21,5,3,5,9,6,9,25,7,10,5,16,26,6,0,4,5,18,7,8,3,22,8,5,22,23,11,28,1,2,20,2,1,2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,1,9,2,30,5,31,26,6,9,6,29,0,14,7,13,5,0,5,14,4,8,3,5,27,24,0,4,5,18,7,8,1,2,6,9,1,0,22,17,18,15,8,0,14,7,13,5,0,4,5,18,7,8,1,2,6,2,20,1,0,14,7,13,19,0,3,7,3
|
||||||
|
|||||||
Reference in New Issue
Block a user