Nasal-Interpreter/nasal.h

138 lines
3.1 KiB
C
Raw Normal View History

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)
#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