lexer changes
This commit is contained in:
parent
69449891e1
commit
f5b4d6c7ee
@ -30,22 +30,10 @@ Maybe _throw_wrongchar(SharedLexerData* sld){
|
|||||||
}
|
}
|
||||||
#define throw_wrongchar(freeMem) { freeMem; return _throw_wrongchar(sld); }
|
#define throw_wrongchar(freeMem) { freeMem; return _throw_wrongchar(sld); }
|
||||||
|
|
||||||
#define addTok(id) Autoarr_add(tokens, default_tokens[id])
|
|
||||||
|
|
||||||
void _addTok_ifnext(char next, TokenId yes, TokenId no, SharedLexerData* sld){
|
|
||||||
if(*(++source)==next){
|
|
||||||
addTok(yes);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
source--;
|
|
||||||
addTok(no);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#define addTok_ifnext(nextChar, yesTok, noTok) _addTok_ifnext(nextChar, yesTok, noTok, sld)
|
|
||||||
|
|
||||||
// adds <label> to <tokens> as tok_label or tok_number
|
// adds <label> to <tokens> as tok_label or tok_number
|
||||||
void _tryAddLabel(SharedLexerData* sld){
|
void _tryAddLabel(SharedLexerData* sld){
|
||||||
if(label.length==0) return;
|
if(label.length==0) return;
|
||||||
|
|
||||||
Unitype uni=ST_pullString(keywordsSearchTree, label);
|
Unitype uni=ST_pullString(keywordsSearchTree, label);
|
||||||
if(uni.VoidPtr!=NULL) // built-in keyword
|
if(uni.VoidPtr!=NULL) // built-in keyword
|
||||||
Autoarr_add(tokens, *(Token*)uni.VoidPtr);
|
Autoarr_add(tokens, *(Token*)uni.VoidPtr);
|
||||||
@ -68,6 +56,17 @@ void _tryAddLabel(SharedLexerData* sld){
|
|||||||
};
|
};
|
||||||
#define tryAddLabel() _tryAddLabel(sld)
|
#define tryAddLabel() _tryAddLabel(sld)
|
||||||
|
|
||||||
|
#define addDefTok(id) tryAddLabel(); Autoarr_add(tokens, default_tokens[id])
|
||||||
|
|
||||||
|
void _addDefTok_ifnext(char next, TokenId yes, TokenId no, SharedLexerData* sld){
|
||||||
|
if(*(source+1)==next){
|
||||||
|
source++;
|
||||||
|
addDefTok(yes);
|
||||||
|
}
|
||||||
|
else addDefTok(no);
|
||||||
|
}
|
||||||
|
#define addDefTok_ifnext(nextChar, yesTok, noTok) _addDefTok_ifnext(nextChar, yesTok, noTok, sld)
|
||||||
|
|
||||||
// returns text in quotes or error
|
// returns text in quotes or error
|
||||||
Maybe _readString(char quotChar, SharedLexerData* sld){
|
Maybe _readString(char quotChar, SharedLexerData* sld){
|
||||||
char c;
|
char c;
|
||||||
@ -94,35 +93,24 @@ Maybe _readString(char quotChar, SharedLexerData* sld){
|
|||||||
Maybe _lexan(SharedLexerData* sld){
|
Maybe _lexan(SharedLexerData* sld){
|
||||||
char c;
|
char c;
|
||||||
source--;
|
source--;
|
||||||
while ((c=*++source)) switch(c){
|
while ((c=*++source)) {
|
||||||
|
// tryAddLabel() resets label.length, but label.ptr still pointing to prev token beginning
|
||||||
|
if(label.length==0)
|
||||||
|
label.ptr=source;
|
||||||
|
|
||||||
|
switch(c){
|
||||||
case ' ': case '\t':
|
case ' ': case '\t':
|
||||||
case '\r': case '\n':
|
case '\r': case '\n':
|
||||||
tryAddLabel();
|
tryAddLabel();
|
||||||
break;
|
break;
|
||||||
case '(':
|
|
||||||
tryAddLabel();
|
case '(': addDefTok(tok_lbracket); break;
|
||||||
addTok(tok_lbracket);
|
case '{': addDefTok(tok_lbracket_fi); break;
|
||||||
break;
|
case '[': addDefTok(tok_lbracket_sq); break;
|
||||||
case '{':
|
case ')': addDefTok(tok_rbracket); break;
|
||||||
tryAddLabel();
|
case '}': addDefTok(tok_rbracket_fi); break;
|
||||||
addTok(tok_lbracket_fi);
|
case ']': addDefTok(tok_rbracket_sq); break;
|
||||||
break;
|
|
||||||
case '[':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_lbracket_sq);
|
|
||||||
break;
|
|
||||||
case ')':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_rbracket);
|
|
||||||
break;
|
|
||||||
case '}':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_rbracket_fi);
|
|
||||||
break;
|
|
||||||
case ']':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_rbracket_sq);
|
|
||||||
break;
|
|
||||||
case '\'':
|
case '\'':
|
||||||
tryAddLabel();
|
tryAddLabel();
|
||||||
try(readString('\''), maybeC, ;){
|
try(readString('\''), maybeC, ;){
|
||||||
@ -143,37 +131,26 @@ Maybe _lexan(SharedLexerData* sld){
|
|||||||
Autoarr_add(tokens, stok);
|
Autoarr_add(tokens, stok);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '<':
|
|
||||||
tryAddLabel();
|
case '<': addDefTok(tok_less); break;
|
||||||
addTok(tok_less);
|
case '>': addDefTok(tok_more); break;
|
||||||
break;
|
case '+': addDefTok(tok_plus); break;
|
||||||
case '>':
|
case '-': addDefTok(tok_minus); break;
|
||||||
tryAddLabel();
|
case '*': addDefTok(tok_asterisk); break;
|
||||||
addTok(tok_more);
|
|
||||||
break;
|
|
||||||
case '+':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_plus);
|
|
||||||
break;
|
|
||||||
case '-':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_minus);
|
|
||||||
break;
|
|
||||||
case '*':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_asterisk);
|
|
||||||
break;
|
|
||||||
case '/':
|
case '/':
|
||||||
tryAddLabel();
|
tryAddLabel();
|
||||||
string commentStr={source,0};
|
string commentStr={source, 1};
|
||||||
c=*++source;
|
c=*++source;
|
||||||
if(c=='/') { // single-line comment
|
if(c=='/') { // single-line comment
|
||||||
|
commentStr.length++;
|
||||||
while((c=*++source)){
|
while((c=*++source)){
|
||||||
if(c=='\n' || c=='\r') break;
|
if(c=='\n' || c=='\r') break;
|
||||||
else commentStr.length++;
|
else commentStr.length++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(c=='*') { // multi-line comment
|
else if(c=='*') { // multi-line comment
|
||||||
|
commentStr.length++;
|
||||||
while((c=*++source)){
|
while((c=*++source)){
|
||||||
commentStr.length++;
|
commentStr.length++;
|
||||||
if(c=='*' && *(++source)=='/') break;
|
if(c=='*' && *(++source)=='/') break;
|
||||||
@ -181,7 +158,7 @@ Maybe _lexan(SharedLexerData* sld){
|
|||||||
}
|
}
|
||||||
else { // not comment
|
else { // not comment
|
||||||
source--;
|
source--;
|
||||||
addTok(tok_slash);
|
addDefTok(tok_slash);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Token comTok={
|
Token comTok={
|
||||||
@ -190,71 +167,28 @@ Maybe _lexan(SharedLexerData* sld){
|
|||||||
};
|
};
|
||||||
Autoarr_add(tokens, comTok);
|
Autoarr_add(tokens, comTok);
|
||||||
break;
|
break;
|
||||||
case '=':
|
|
||||||
tryAddLabel();
|
case '=': addDefTok_ifnext('=', tok_equals, tok_assign); break;
|
||||||
addTok_ifnext('=',tok_equals,tok_assign);
|
case '!': addDefTok_ifnext('=', tok_not_equals, tok_not); break;
|
||||||
break;
|
case '&': addDefTok_ifnext('&', tok_and_d, tok_and); break;
|
||||||
case '!':
|
case '|': addDefTok_ifnext('|', tok_or_d, tok_or); break;
|
||||||
tryAddLabel();
|
case '?': addDefTok_ifnext('?', tok_question_d, tok_question);break;
|
||||||
addTok_ifnext('=',tok_not_equals,tok_not);
|
case ':': addDefTok(tok_colon); break;
|
||||||
break;
|
case ';': addDefTok(tok_semicolon); break;
|
||||||
case '&':
|
case '.': addDefTok(tok_point); break;
|
||||||
tryAddLabel();
|
case ',': addDefTok(tok_comma); break;
|
||||||
addTok_ifnext('&',tok_and_d,tok_and);
|
case '~': addDefTok(tok_tilda); break;
|
||||||
break;
|
case '\\': addDefTok(tok_backslash); break;
|
||||||
case '|':
|
case '%': addDefTok(tok_percent); break;
|
||||||
tryAddLabel();
|
case '^': addDefTok(tok_xor); break;
|
||||||
addTok_ifnext('|',tok_or_d,tok_or);
|
case '$': addDefTok(tok_dollar); break;
|
||||||
break;
|
case '@': addDefTok(tok_at); break;
|
||||||
case '?':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok_ifnext('?',tok_question_d,tok_question);
|
|
||||||
break;
|
|
||||||
case ':':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_colon);
|
|
||||||
break;
|
|
||||||
case ';':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_semicolon);
|
|
||||||
break;
|
|
||||||
case '.':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_point);
|
|
||||||
break;
|
|
||||||
case ',':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_comma);
|
|
||||||
break;
|
|
||||||
case '~':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_tilda);
|
|
||||||
break;
|
|
||||||
case '\\':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_backslash);
|
|
||||||
break;
|
|
||||||
case '%':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_percent);
|
|
||||||
break;
|
|
||||||
case '^':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_xor);
|
|
||||||
break;
|
|
||||||
case '$':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_dollar);
|
|
||||||
break;
|
|
||||||
case '@':
|
|
||||||
tryAddLabel();
|
|
||||||
addTok(tok_at);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
label.length++;
|
label.length++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return SUCCESS(UniHeapPtr(Autoarr(Token), tokens));
|
return SUCCESS(UniHeapPtr(Autoarr(Token), tokens));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user