shortened elsif to elif.

enhanced is_reserved_word() to return a token type through a non-NULL second parameter
This commit is contained in:
hyunghwan.chung 2019-07-26 04:40:33 +00:00
parent 05837aef28
commit bd1d30360e
12 changed files with 86 additions and 138 deletions

View File

@ -70,7 +70,14 @@ class MyClass(Object)
k := if (i < 20) { 30 } else { 40 }. k := if (i < 20) { 30 } else { 40 }.
if (a < 10) { ... } if (a < 10) { ... }
elsif (a < 20) { ... } elif (a < 20) { ... }
else { ... }.
ifnot (i < 20) { 30 } else { 40 }.
nif (i < 20) { 30 } else { 40 }.
if (a < 10) { .. }
elifnot (a > 20) { ... }
else { ... }. else { ... }.
~~~ ~~~

View File

@ -167,10 +167,10 @@ class(#pointer) Array(SequenceableCollection)
s := anArray size. s := anArray size.
if (start < 0) { start := 0 } if (start < 0) { start := 0 }
elsif (start >= s) { start := s - 1 }. elif (start >= s) { start := s - 1 }.
if (end < 0) { end := 0 } if (end < 0) { end := 0 }
elsif (end >= s) { end := s - 1 }. elif (end >= s) { end := s - 1 }.
*/ */
i := 0. i := 0.
ss := self size. ss := self size.
@ -457,11 +457,11 @@ class(#byte) ByteArray(Array)
| firstByte | | firstByte |
firstByte := self at: 0. firstByte := self at: 0.
if ((firstByte bitAnd:2r10000000) == 0) { 1 } if ((firstByte bitAnd:2r10000000) == 0) { 1 }
elsif (firstByte bitAnd:2r11000000) == 2r10000000) { 2 } elif (firstByte bitAnd:2r11000000) == 2r10000000) { 2 }
elsif (firstByte bitAnd:2r11100000) == 2r11000000) { 3 } elif (firstByte bitAnd:2r11100000) == 2r11000000) { 3 }
elsif (firstByte bitAnd:2r11110000) == 2r11100000) { 4 } elif (firstByte bitAnd:2r11110000) == 2r11100000) { 4 }
elsif (firstByte bitAnd:2r11111000) == 2r11110000) { 5 } elif (firstByte bitAnd:2r11111000) == 2r11110000) { 5 }
elsif (firstByte bitAnd:2r11111100) == 2r11111000) { 6 }. elif (firstByte bitAnd:2r11111100) == 2r11111000) { 6 }.
*/ */
} }
} }

View File

@ -514,8 +514,8 @@ extend Apex
//# TODO: convert an exception to a more specific one depending on the error code. //# TODO: convert an exception to a more specific one depending on the error code.
//#if (ec == Error.Code.ERANGE) { self index: index outOfRange: (self basicSize) } //#if (ec == Error.Code.ERANGE) { self index: index outOfRange: (self basicSize) }
//# elsif (ec == Error.Code.EPERM) { self messageProhibited: method name } //# elif (ec == Error.Code.EPERM) { self messageProhibited: method name }
//# elsif (ec == Error.Code.ENOIMPL) { self subclassResponsibility: method name }. //# elif (ec == Error.Code.ENOIMPL) { self subclassResponsibility: method name }.
(PrimitiveFailureException /* in: method */ withErrorCode: ec) signal: msg. (PrimitiveFailureException /* in: method */ withErrorCode: ec) signal: msg.
} }

View File

@ -92,11 +92,11 @@ class(#limited) Character(Magnitude)
{ {
^self asInteger - $0 asInteger ^self asInteger - $0 asInteger
} }
elsif ((self >= $A) and (self <= $Z)) elif ((self >= $A) and (self <= $Z))
{ {
^self asInteger - $A asInteger + 10 ^self asInteger - $A asInteger + 10
} }
elsif ((self >= $a) and (self <= $z)) elif ((self >= $a) and (self <= $z))
{ {
^self asInteger - $a asInteger + 10 ^self asInteger - $a asInteger + 10
}. }.
@ -359,7 +359,7 @@ class(#limited) Number(Magnitude)
/* self < 0 ifTrue: [^-1]. /* self < 0 ifTrue: [^-1].
self > 0 ifTrue: [^1]. self > 0 ifTrue: [^1].
^0.*/ ^0.*/
^if (self < 0) { -1 } elsif (self > 0) { 1 } else { 0 } ^if (self < 0) { -1 } elif (self > 0) { 1 } else { 0 }
} }
} }

View File

@ -113,15 +113,15 @@ class MyObject(Object)
System logNl: "XXXXXXXXX". System logNl: "XXXXXXXXX".
1111 1111
} }
elsif ("abcd" ~= "abcd") elif ("abcd" ~= "abcd")
{ {
System logNl: "second if". System logNl: "second if".
} }
elsif ([k := 20. System logNl: "k => " & (k asString). k + 20. true] value) elif ([k := 20. System logNl: "k => " & (k asString). k + 20. true] value)
{ {
System logNl: "THIRID forever............." & (k asString) System logNl: "THIRID forever............." & (k asString)
} }
elsif (true = true) elif (true = true)
{ {
System logNl: "forever............." System logNl: "forever............."
} }
@ -168,7 +168,7 @@ class MyObject(Object)
}.*/ }.*/
a := if(false) { 10 } elsif (false) { 20 } elsif (false) { 30} else { 40}. a := if(false) { 10 } elif (false) { 20 } elif (false) { 30} else { 40}.
//a := if(false) { 999 } else { 888 }. //a := if(false) { 999 } else { 888 }.
a dump. a dump.

View File

@ -231,7 +231,7 @@ method(#class,#abstract) xxx. => method(#class) xxx { self subclassResponsibilit
// if the internal semaphore has been signaled, // if the internal semaphore has been signaled,
// arrange to return nil to indicate timeout. // arrange to return nil to indicate timeout.
if (r == s) { r := nil } // timed out if (r == s) { r := nil } // timed out
elsif (r signalAction notNil) { r signalAction value: r }. // run the signal action block elif (r signalAction notNil) { r signalAction value: r }. // run the signal action block
] ensure: [ ] ensure: [
// System<<unsignal: doesn't thrown an exception even if the semaphore s is not // System<<unsignal: doesn't thrown an exception even if the semaphore s is not
// register with System<<signal:afterXXX:. otherwise, i would do like this line // register with System<<signal:afterXXX:. otherwise, i would do like this line

View File

@ -59,7 +59,7 @@ class(#byte(4)) IP4Address(IPAddress)
if (acc > 255) { Exception signal: ('invalid IPv4 address B ' & str). }. if (acc > 255) { Exception signal: ('invalid IPv4 address B ' & str). }.
digits := digits + 1. digits := digits + 1.
} }
elsif (c == $.) elif (c == $.)
{ {
if (dots >= 3 or: [digits == 0]) { ^Error.Code.EINVAL }. if (dots >= 3 or: [digits == 0]) { ^Error.Code.EINVAL }.
self basicAt: (dots + address_offset) put: acc. self basicAt: (dots + address_offset) put: acc.
@ -151,7 +151,7 @@ class(#byte(16)) IP6Address(IP4Address)
colonpos := tgpos. colonpos := tgpos.
continue. continue.
} }
elsif (pos >= size) elif (pos >= size)
{ {
// a colon can't be the last character // a colon can't be the last character
^Error.Code.EINVAL ^Error.Code.EINVAL
@ -194,7 +194,7 @@ class(#byte(16)) IP6Address(IP4Address)
self basicShiftFrom: colonpos to: (colonpos + (mysize - tgpos)) count: (tgpos - colonpos). self basicShiftFrom: colonpos to: (colonpos + (mysize - tgpos)) count: (tgpos - colonpos).
//tgpos := tgpos + (mysize - tgpos). //tgpos := tgpos + (mysize - tgpos).
} }
elsif (tgpos ~~ mysize) elif (tgpos ~~ mysize)
{ {
^Error.Code.EINVAL ^Error.Code.EINVAL
}. }.
@ -379,7 +379,7 @@ class SyncSocket(Socket)
self __wait_for_output. self __wait_for_output.
soerr := self _socketError. soerr := self _socketError.
if (soerr == 0) { break } if (soerr == 0) { break }
elsif (soerr > 0) elif (soerr > 0)
{ {
Exception signal: ('unable to connect - error ' & soerr asString). Exception signal: ('unable to connect - error ' & soerr asString).
}. }.

View File

@ -432,7 +432,7 @@ class X11.Button(X11.Label)
self.bgcolor := x. self.bgcolor := x.
self onPaintEvent: llevent. self onPaintEvent: llevent.
} }
elsif (type == X11.LLEventType.BUTTON_RELEASE) elif (type == X11.LLEventType.BUTTON_RELEASE)
{ {
x := self.fgcolor. x := self.fgcolor.
self.fgcolor := self.bgcolor. self.fgcolor := self.bgcolor.

View File

@ -121,9 +121,9 @@ static struct voca_t
{ 8, { 'c','o','n','t','i','n','u','e' } }, { 8, { 'c','o','n','t','i','n','u','e' } },
{ 2, { 'd','o' } }, { 2, { 'd','o' } },
{ 5, { '#','d','u','a','l' } }, { 5, { '#','d','u','a','l' } },
{ 4, { 'e','l','i','f' } },
{ 7, { 'e','l','i','f','n','o','t' } },
{ 4, { 'e','l','s','e' } }, { 4, { 'e','l','s','e' } },
{ 5, { 'e','l','s','i','f' } },
{ 8, { 'e','l','s','i','f','n','o','t' } },
{ 6, { 'e','n','s','u','r','e', } }, { 6, { 'e','n','s','u','r','e', } },
{ 9, { 'e','x','c','e','p','t','i','o','n' } }, { 9, { 'e','x','c','e','p','t','i','o','n' } },
{ 6, { 'e','x','t','e','n','d' } }, { 6, { 'e','x','t','e','n','d' } },
@ -131,6 +131,7 @@ static struct voca_t
{ 6, { '#','f','i','n','a','l' } }, { 6, { '#','f','i','n','a','l' } },
{ 4, { 'f','r','o','m' } }, { 4, { 'f','r','o','m' } },
{ 4, { '#','g','e','t' } }, { 4, { '#','g','e','t' } },
{ 4, { 'g','o','t','o' } },
{ 9, { '#','h','a','l','f','w','o','r','d' } }, { 9, { '#','h','a','l','f','w','o','r','d' } },
{ 2, { 'i','f' } }, { 2, { 'i','f' } },
{ 5, { 'i','f','n','o','t' } }, { 5, { 'i','f','n','o','t' } },
@ -189,9 +190,9 @@ enum voca_id_t
VOCA_CONTINUE, VOCA_CONTINUE,
VOCA_DO, VOCA_DO,
VOCA_DUAL_S, VOCA_DUAL_S,
VOCA_ELIF,
VOCA_ELIFNOT,
VOCA_ELSE, VOCA_ELSE,
VOCA_ELSIF,
VOCA_ELSIFNOT,
VOCA_ENSURE, VOCA_ENSURE,
VOCA_EXCEPTION, VOCA_EXCEPTION,
VOCA_EXTEND, VOCA_EXTEND,
@ -199,6 +200,7 @@ enum voca_id_t
VOCA_FINAL_S, VOCA_FINAL_S,
VOCA_FROM, VOCA_FROM,
VOCA_GET_S, VOCA_GET_S,
VOCA_GOTO,
VOCA_HALFWORD_S, VOCA_HALFWORD_S,
VOCA_IF, VOCA_IF,
VOCA_IFNOT, VOCA_IFNOT,
@ -376,33 +378,45 @@ static MOO_INLINE int is_word (const moo_oocs_t* oocs, voca_id_t id)
moo_equal_oochars(oocs->ptr, vocas[id].str, vocas[id].len); moo_equal_oochars(oocs->ptr, vocas[id].str, vocas[id].len);
} }
static int is_reserved_word (const moo_oocs_t* ucs) static int is_reserved_word (const moo_oocs_t* ucs, moo_iotok_type_t* token_type)
{ {
static int rw[] = static struct
{ {
VOCA_SELF, voca_id_t voca_id;
VOCA_SUPER, moo_iotok_type_t token_type;
VOCA_NIL, } rw[] =
VOCA_TRUE, {
VOCA_FALSE, { VOCA_SELF, MOO_IOTOK_SELF },
VOCA_THIS_CONTEXT, { VOCA_SUPER, MOO_IOTOK_SUPER },
VOCA_THIS_PROCESS, { VOCA_NIL, MOO_IOTOK_NIL },
VOCA_SELFNS, { VOCA_TRUE, MOO_IOTOK_TRUE },
VOCA_IF, { VOCA_FALSE, MOO_IOTOK_FALSE },
VOCA_ELSE, { VOCA_THIS_CONTEXT, MOO_IOTOK_THIS_CONTEXT },
VOCA_ELSIF, { VOCA_THIS_PROCESS, MOO_IOTOK_THIS_PROCESS },
VOCA_ELSIFNOT, { VOCA_SELFNS, MOO_IOTOK_SELFNS },
VOCA_WHILE, { VOCA_IF, MOO_IOTOK_IF },
VOCA_UNTIL, { VOCA_IFNOT, MOO_IOTOK_IFNOT },
VOCA_DO, { VOCA_ELIF, MOO_IOTOK_ELIF },
VOCA_BREAK, { VOCA_ELIFNOT, MOO_IOTOK_ELIFNOT },
VOCA_CONTINUE { VOCA_ELSE, MOO_IOTOK_ELSE },
{ VOCA_WHILE, MOO_IOTOK_WHILE },
{ VOCA_UNTIL, MOO_IOTOK_UNTIL },
{ VOCA_DO, MOO_IOTOK_DO },
{ VOCA_BREAK, MOO_IOTOK_BREAK },
{ VOCA_CONTINUE, MOO_IOTOK_CONTINUE },
{ VOCA_GOTO, MOO_IOTOK_GOTO },
{ VOCA_AND, MOO_IOTOK_AND },
{ VOCA_OR, MOO_IOTOK_OR }
}; };
int i; int i;
for (i = 0; i < MOO_COUNTOF(rw); i++) for (i = 0; i < MOO_COUNTOF(rw); i++)
{ {
if (is_word(ucs, rw[i])) return 1; if (is_word(ucs, rw[i].voca_id))
{
if (token_type) *token_type = rw[i].token_type;
return 1;
}
} }
return 0; return 0;
@ -1297,6 +1311,8 @@ static int get_ident (moo_t* moo, moo_ooci_t char_read_ahead)
} }
else else
{ {
moo_iotok_type_t token_type;
if (c == '.') if (c == '.')
{ {
moo_iolxc_t period; moo_iolxc_t period;
@ -1334,86 +1350,10 @@ static int get_ident (moo_t* moo, moo_ooci_t char_read_ahead)
unget_char (moo, &moo->c->lxc); unget_char (moo, &moo->c->lxc);
} }
if (is_reserved_word(TOKEN_NAME(moo), &token_type))
{
/* handle reserved words */ /* handle reserved words */
if (is_token_word(moo, VOCA_SELF)) SET_TOKEN_TYPE (moo, token_type);
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_SELF);
}
else if (is_token_word(moo, VOCA_SUPER))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_SUPER);
}
else if (is_token_word(moo, VOCA_NIL))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_NIL);
}
else if (is_token_word(moo, VOCA_TRUE))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_TRUE);
}
else if (is_token_word(moo, VOCA_FALSE))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_FALSE);
}
else if (is_token_word(moo, VOCA_THIS_CONTEXT))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_THIS_CONTEXT);
}
else if (is_token_word(moo, VOCA_THIS_PROCESS))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_THIS_PROCESS);
}
else if (is_token_word(moo, VOCA_SELFNS))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_SELFNS);
}
else if (is_token_word(moo, VOCA_IF))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_IF);
}
else if (is_token_word(moo, VOCA_IFNOT))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_IFNOT);
}
else if (is_token_word(moo, VOCA_ELSE))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_ELSE);
}
else if (is_token_word(moo, VOCA_ELSIF))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_ELSIF);
}
else if (is_token_word(moo, VOCA_ELSIFNOT))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_ELSIFNOT);
}
else if (is_token_word(moo, VOCA_WHILE))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_WHILE);
}
else if (is_token_word(moo, VOCA_UNTIL))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_UNTIL);
}
else if (is_token_word(moo, VOCA_DO))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_DO);
}
else if (is_token_word(moo, VOCA_BREAK))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_BREAK);
}
else if (is_token_word(moo, VOCA_CONTINUE))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_CONTINUE);
}
else if (is_token_word(moo, VOCA_AND))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_AND);
}
else if (is_token_word(moo, VOCA_OR))
{
SET_TOKEN_TYPE (moo, MOO_IOTOK_OR);
} }
} }
@ -3551,7 +3491,7 @@ static int preprocess_dotted_name (moo_t* moo, int flags, moo_oop_nsdic_t topdic
seg.len = dot - ptr; seg.len = dot - ptr;
if (is_reserved_word(&seg)) goto wrong_name; if (is_reserved_word(&seg, MOO_NULL)) goto wrong_name;
ass = moo_lookupdic(moo, (moo_oop_dic_t)dic, &seg); ass = moo_lookupdic(moo, (moo_oop_dic_t)dic, &seg);
if (ass) if (ass)
@ -3621,7 +3561,7 @@ static int preprocess_dotted_name (moo_t* moo, int flags, moo_oop_nsdic_t topdic
/* this is the last segment. it should be a class name or an item name */ /* this is the last segment. it should be a class name or an item name */
seg.len = len; seg.len = len;
if (is_reserved_word(&seg)) goto wrong_name; if (is_reserved_word(&seg, MOO_NULL)) goto wrong_name;
*name = seg; *name = seg;
*ns_oop = dic; *ns_oop = dic;
@ -4508,7 +4448,7 @@ static MOO_INLINE int find_dotted_ident (moo_t* moo, const moo_oocs_t* name, con
last.ptr = name->ptr + pxlen + 1; last.ptr = name->ptr + pxlen + 1;
last.len = name->len - pxlen - 1; last.len = name->len - pxlen - 1;
if (is_reserved_word(&last)) if (is_reserved_word(&last, MOO_NULL))
{ {
/* self. is followed by a reserved word. /* self. is followed by a reserved word.
* a proper variable name is expected. */ * a proper variable name is expected. */
@ -6246,9 +6186,9 @@ static int compile_if_expression (moo_t* moo)
GET_TOKEN (moo); /* get the next token after } */ GET_TOKEN (moo); /* get the next token after } */
if (TOKEN_TYPE(moo) != MOO_IOTOK_ELSIF && TOKEN_TYPE(moo) != MOO_IOTOK_ELSIFNOT) break; if (TOKEN_TYPE(moo) != MOO_IOTOK_ELIF && TOKEN_TYPE(moo) != MOO_IOTOK_ELIFNOT) break;
if (TOKEN_TYPE(moo) == MOO_IOTOK_ELSIF) if (TOKEN_TYPE(moo) == MOO_IOTOK_ELIF)
{ {
push_true_inst = BCODE_PUSH_TRUE; push_true_inst = BCODE_PUSH_TRUE;
push_false_inst = BCODE_PUSH_FALSE; push_false_inst = BCODE_PUSH_FALSE;
@ -6549,7 +6489,7 @@ static int compile_method_expression (moo_t* moo, int pop)
/* /*
* method-expression := method-assignment-expression | basic-expression | if-expression | while-expression | do-while-expression * method-expression := method-assignment-expression | basic-expression | if-expression | while-expression | do-while-expression
* method-assignment-expression := identifier ":=" method-expression * method-assignment-expression := identifier ":=" method-expression
* if-expression := if ( ) { } elsif { } else { } * if-expression := if ( ) { } elif { } else { }
* while-expression := while () {} * while-expression := while () {}
* do-while-expression := do { } while () * do-while-expression := do { } while ()
*/ */

View File

@ -128,7 +128,7 @@ int moo_addfiletodbgi (moo_t* moo, const moo_ooch_t* file_name, moo_oow_t* start
if (!moo->dbgi) if (!moo->dbgi)
{ {
if (start_offset) *start_offset = MOO_NULL; if (start_offset) *start_offset = 0;
return 0; /* debug information is disabled*/ return 0; /* debug information is disabled*/
} }

View File

@ -2279,7 +2279,7 @@ static moo_pfrc_t pf_method_get_ip_source_line (moo_t* moo, moo_mod_t* mod, moo_
moo_oop_method_t rcv; moo_oop_method_t rcv;
moo_oop_t ip; moo_oop_t ip;
moo_dbgi_method_t* di; moo_dbgi_method_t* di;
moo_oow_t retv = MOO_SMOOI_TO_OOP(0); moo_oop_t retv = MOO_SMOOI_TO_OOP(0);
rcv = (moo_oop_method_t)MOO_STACK_GETRCV(moo, nargs); rcv = (moo_oop_method_t)MOO_STACK_GETRCV(moo, nargs);
MOO_PF_CHECK_RCV (moo, MOO_CLASSOF(moo, rcv) == moo->_method); MOO_PF_CHECK_RCV (moo, MOO_CLASSOF(moo, rcv) == moo->_method);
@ -2310,7 +2310,7 @@ static moo_pfrc_t pf_method_get_source_line (moo_t* moo, moo_mod_t* mod, moo_ooi
{ {
moo_oop_method_t rcv; moo_oop_method_t rcv;
moo_dbgi_method_t* di; moo_dbgi_method_t* di;
moo_oow_t retv = MOO_SMOOI_TO_OOP(0); moo_oop_t retv = MOO_SMOOI_TO_OOP(0);
rcv = (moo_oop_method_t)MOO_STACK_GETRCV(moo, nargs); rcv = (moo_oop_method_t)MOO_STACK_GETRCV(moo, nargs);
MOO_PF_CHECK_RCV (moo, MOO_CLASSOF(moo, rcv) == moo->_method); MOO_PF_CHECK_RCV (moo, MOO_CLASSOF(moo, rcv) == moo->_method);

View File

@ -300,14 +300,15 @@ enum moo_iotok_type_t
MOO_IOTOK_IF, MOO_IOTOK_IF,
MOO_IOTOK_IFNOT, MOO_IOTOK_IFNOT,
MOO_IOTOK_ELSE, MOO_IOTOK_ELSE,
MOO_IOTOK_ELSIF, MOO_IOTOK_ELIF,
MOO_IOTOK_ELSIFNOT, MOO_IOTOK_ELIFNOT,
MOO_IOTOK_WHILE, MOO_IOTOK_WHILE,
MOO_IOTOK_UNTIL, MOO_IOTOK_UNTIL,
MOO_IOTOK_DO, MOO_IOTOK_DO,
MOO_IOTOK_BREAK, MOO_IOTOK_BREAK,
MOO_IOTOK_CONTINUE, MOO_IOTOK_CONTINUE,
MOO_IOTOK_GOTO,
MOO_IOTOK_AND, MOO_IOTOK_AND,
MOO_IOTOK_OR, MOO_IOTOK_OR,