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:
Rangi
2021-04-20 10:02:39 -04:00
committed by Eldred Habert
parent b0f8d75d1d
commit fe3521c7a4
14 changed files with 53 additions and 53 deletions

View File

@@ -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);

View File

@@ -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

View 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

View File

@@ -1 +1 @@
\() \<>

View File

@@ -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

View File

@@ -1 +1 @@
\(10!) \<10!>

View File

@@ -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 '!'

View File

@@ -1 +1 @@
\(foo) \<foo>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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