2020-10-23 14:53:04 +08:00
|
|
|
#ifndef __NASAL_H__
|
|
|
|
#define __NASAL_H__
|
|
|
|
|
2020-12-14 23:43:00 +08:00
|
|
|
#pragma GCC optimize(2)
|
|
|
|
|
2021-05-31 19:10:59 +08:00
|
|
|
#include <stdint.h>
|
2020-10-23 14:53:04 +08:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <iostream>
|
|
|
|
#include <fstream>
|
2020-12-14 23:43:00 +08:00
|
|
|
#include <sstream>
|
2020-10-23 14:53:04 +08:00
|
|
|
#include <algorithm>
|
|
|
|
#include <cstring>
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <ctime>
|
|
|
|
#include <cmath>
|
|
|
|
#include <list>
|
|
|
|
#include <stack>
|
|
|
|
#include <queue>
|
|
|
|
#include <vector>
|
2021-03-01 15:54:58 +08:00
|
|
|
#include <unordered_map>
|
2020-10-23 14:53:04 +08:00
|
|
|
|
2020-12-14 23:43:00 +08:00
|
|
|
/*
|
2021-08-09 21:30:18 +08:00
|
|
|
check if a string can be converted to a number
|
|
|
|
if this string cannot be converted to a number,it will return nan
|
2020-12-14 23:43:00 +08:00
|
|
|
*/
|
2021-06-05 20:42:58 +08:00
|
|
|
inline double hex_to_double(const char* str)
|
2020-12-14 23:43:00 +08:00
|
|
|
{
|
2021-08-09 21:30:18 +08:00
|
|
|
double ret=0;
|
|
|
|
for(;*str;++str)
|
|
|
|
{
|
|
|
|
ret*=16;
|
|
|
|
if('0'<=*str && *str<='9')
|
|
|
|
ret+=(*str-'0');
|
|
|
|
else if('a'<=*str && *str<='f')
|
|
|
|
ret+=(*str-'a'+10);
|
|
|
|
else if('A'<=*str && *str<='F')
|
|
|
|
ret+=(*str-'A'+10);
|
|
|
|
else
|
|
|
|
return nan("");
|
|
|
|
}
|
|
|
|
return ret;
|
2020-12-14 23:43:00 +08:00
|
|
|
}
|
2021-06-05 20:42:58 +08:00
|
|
|
inline double oct_to_double(const char* str)
|
2020-12-14 23:43:00 +08:00
|
|
|
{
|
2021-08-09 21:30:18 +08:00
|
|
|
double ret=0;
|
|
|
|
for(;*str;++str)
|
|
|
|
{
|
|
|
|
ret*=8;
|
|
|
|
if('0'<=*str && *str<'8')
|
|
|
|
ret+=(*str-'0');
|
|
|
|
else
|
|
|
|
return nan("");
|
|
|
|
}
|
|
|
|
return ret;
|
2020-12-14 23:43:00 +08:00
|
|
|
}
|
2021-06-05 20:42:58 +08:00
|
|
|
inline double dec_to_double(const char* str)
|
2020-12-14 23:43:00 +08:00
|
|
|
{
|
2021-08-09 21:30:18 +08:00
|
|
|
double ret=0,negative=1,num_pow=0;
|
|
|
|
while('0'<=*str && *str<='9')
|
|
|
|
ret=ret*10+(*str++-'0');
|
|
|
|
if(!*str) return ret;
|
|
|
|
if(*str=='.')
|
|
|
|
{
|
|
|
|
if(!*++str) return nan("");
|
|
|
|
num_pow=0.1;
|
|
|
|
while('0'<=*str && *str<='9')
|
|
|
|
{
|
|
|
|
ret+=num_pow*(*str++-'0');
|
|
|
|
num_pow*=0.1;
|
|
|
|
}
|
|
|
|
if(!*str) return ret;
|
|
|
|
}
|
|
|
|
if(*str!='e' && *str!='E')
|
|
|
|
return nan("");
|
|
|
|
if(!*++str) return nan("");
|
|
|
|
if(*str=='-' || *str=='+')
|
|
|
|
negative=(*str++=='-'? -1:1);
|
|
|
|
if(!*str) return nan("");
|
|
|
|
num_pow=0;
|
|
|
|
for(;*str;++str)
|
|
|
|
{
|
|
|
|
if('0'<=*str && *str<='9')
|
|
|
|
num_pow=num_pow*10+(*str-'0');
|
|
|
|
else
|
|
|
|
return nan("");
|
|
|
|
}
|
|
|
|
return ret*std::pow(10,negative*num_pow);
|
2020-12-14 23:43:00 +08:00
|
|
|
}
|
2021-06-05 20:42:58 +08:00
|
|
|
double str2num(const char* str)
|
2020-12-14 23:43:00 +08:00
|
|
|
{
|
2021-08-09 21:30:18 +08:00
|
|
|
bool is_negative=false;
|
|
|
|
double ret_num=0;
|
|
|
|
if(*str=='-' || *str=='+')
|
|
|
|
is_negative=(*str++=='-');
|
|
|
|
if(!*str)
|
|
|
|
return nan("");
|
|
|
|
if(str[0]=='0' && str[1]=='x')
|
|
|
|
ret_num=hex_to_double(str+2);
|
|
|
|
else if(str[0]=='0' && str[1]=='o')
|
|
|
|
ret_num=oct_to_double(str+2);
|
|
|
|
else
|
|
|
|
ret_num=dec_to_double(str);
|
|
|
|
return is_negative?-ret_num:ret_num;
|
2020-12-14 23:43:00 +08:00
|
|
|
}
|
|
|
|
|
2021-07-21 00:20:25 +08:00
|
|
|
/*
|
2021-08-09 21:30:18 +08:00
|
|
|
show raw string
|
2021-07-21 00:20:25 +08:00
|
|
|
*/
|
2021-09-13 19:55:03 +08:00
|
|
|
void raw_string(const std::string& str)
|
2021-07-21 00:20:25 +08:00
|
|
|
{
|
2021-08-09 21:30:18 +08:00
|
|
|
for(auto i:str)
|
|
|
|
switch(i)
|
|
|
|
{
|
|
|
|
case '\a': std::cout<<"\\a";break;
|
|
|
|
case '\b': std::cout<<"\\b";break;
|
|
|
|
case '\f': std::cout<<"\\f";break;
|
|
|
|
case '\n': std::cout<<"\\n";break;
|
|
|
|
case '\r': std::cout<<"\\r";break;
|
|
|
|
case '\t': std::cout<<"\\t";break;
|
|
|
|
case '\v': std::cout<<"\\v";break;
|
|
|
|
case '\0': std::cout<<"\\0";break;
|
|
|
|
default: std::cout<<i; break;
|
|
|
|
}
|
|
|
|
return;
|
2021-07-21 00:20:25 +08:00
|
|
|
}
|
2020-10-23 14:53:04 +08:00
|
|
|
#include "nasal_lexer.h"
|
|
|
|
#include "nasal_ast.h"
|
|
|
|
#include "nasal_parse.h"
|
|
|
|
#include "nasal_import.h"
|
|
|
|
#include "nasal_gc.h"
|
|
|
|
#include "nasal_builtin.h"
|
2020-12-06 21:07:40 +08:00
|
|
|
#include "nasal_codegen.h"
|
2021-02-10 00:12:22 +08:00
|
|
|
#include "nasal_vm.h"
|
2020-10-23 14:53:04 +08:00
|
|
|
|
|
|
|
#endif
|