pnode: allow global asm,ext, lex: LSCOLON

This commit is contained in:
corey 2024-01-17 14:35:13 -06:00
parent aa8fce2ca1
commit 07bc6a1461
6 changed files with 16 additions and 13 deletions

5
lex.c
View File

@ -12,8 +12,8 @@
const char*lextype_names[]={"LNONE","LIDENTIFIER","LINTEGER","LFLOAT","LSTRING","LOPERATOR","LKEYWORD","LCOMMENT","LMINUS","LFAKE",NULL};
const char*lextype_colors[]={"\033[0m","\033[0m","\033[36m","\033[35m","\033[32m","\033[0m","\033[33m","\033[34m"};
const char*lexsubtype_names[]={"LENDSTATEMENT","LASSIGN","LLPAREN","LRPAREN","LLCBRACE","LRCBRACE","LSMINUS","LADD","LSMUL","LSDIV","LSNOT",NULL};
static const char*operator_chars="-+*/=;(),.{}<>\\!";
const char*lexsubtype_names[]={"LENDSTATEMENT","LASSIGN","LLPAREN","LRPAREN","LLCBRACE","LRCBRACE","LSMINUS","LADD","LSMUL","LSDIV","LSNOT","LSCOLON",NULL};
static const char*operator_chars="-+*/=;(),.{}<>\\!:";
static const char*keywords[]={"do","false","fn","for","if","let","ret","true","while","call","asm","ext",};
/* static char*operators[]={";","=","+=","-=","*=","/=","+","-","/","*","(",")","{","}"}; */
@ -171,6 +171,7 @@ void lex_string(Lexer*lex,char*input_string)
case '*':opmatch(LSMUL,false);break;
case '/':opmatch(LSDIV,false);break;
case '!':opmatch(LSNOT,false);break;
case ':':opmatch(LSCOLON,false);break;
case '=':
{
opmatch(LASSIGN,false);

2
lex.h
View File

@ -13,7 +13,7 @@
#define vec_pushl(v,l) do{Tok x=l;vec_push(v,&x);}while(0)
enum LEXTYPE {LNONE=0, LIDENTIFIER, LINTEGER, LFLOAT, LSTRING, LOPERATOR, LKEYWORD, LCOMMENT, LMINUS, LFAKE, };
enum LEXSUBTYPE {LENDSTATEMENT=55, LASSIGN, LLPAREN, LRPAREN, LLCBRACE, LRCBRACE, LSMINUS, LADD, LSMUL, LSDIV, LSNOT };
enum LEXSUBTYPE {LENDSTATEMENT=55, LASSIGN, LLPAREN, LRPAREN, LLCBRACE, LRCBRACE, LSMINUS, LADD, LSMUL, LSDIV, LSNOT, LSCOLON, };
extern const char*lextype_names[];
extern const char*lexsubtype_names[];
extern const char*lextype_colors[];

View File

@ -212,8 +212,8 @@ void parser_parse(Parser*pnode,Vec*tokens)
else if(strcmp("while",cur_tok->str.buffer)==0){globalcode();++i;descend(PWHILE);}
else if(strcmp("let",cur_tok->str.buffer)==0){globalcode();++i;descend(PVARDECL);}
else if(strcmp("fn",cur_tok->str.buffer)==0){++i;descend(PFUNDECL);}
else if(strcmp("asm",cur_tok->str.buffer)==0){globalcode();++i;descend(PASM);}
else if(strcmp("ext",cur_tok->str.buffer)==0){globalcode();++i;descend(PEXTERN);}
else if(strcmp("asm",cur_tok->str.buffer)==0){++i;descend(PASM);}
else if(strcmp("ext",cur_tok->str.buffer)==0){++i;descend(PEXTERN);}
break;
case LOPERATOR:

View File

@ -1,8 +1,9 @@
ext puts();
asm"msg:\n.asciz \"hi\"";
fn main()
{
ext puts();
asm"pushl $msg";
puts();
ret 0;
asm"msg:\n.asciz \"hi\"";
}

View File

@ -1,5 +1,9 @@
#:31
# Coerce floating point values into integers
ext printf();
asm"fmt:\n.asciz \"%d\\n\"";
fn pi(m)
{
let x=355.0;
@ -10,8 +14,6 @@ fn pi(m)
fn main()
{
ext printf();
# printf("%d\n",pi(100000));
asm"movl $100000,%edi";
pi();
@ -23,6 +25,4 @@ fn main()
# ret pi(10);
asm"mov $10,%edi";
ret pi();
asm"fmt:\n.asciz \"%d\\n\"";
}

View File

@ -1,8 +1,9 @@
ext puts();
asm"msg:\n.asciz \"hi\"";
fn main()
{
ext puts();
asm"movq $msg,%rdi";
puts();
ret 0;
asm"msg:\n.asciz \"hi\"";
}