LiCode(Alpha26.5.26)
2026-05-26 21:22:40
发布于:香港
先把语法说一下(Alpha26.5.26)
#这是注释
#下面是定义变量
let print_message="Hello LiCode!"
#下面是输出
#解析:关闭缓冲区(使用std::cerr),开启缓冲区(使用std::cout),输出变量,刷新缓冲区
print stdout.buffer=close,stdout.buffer=open,print_message,stdout.flush
#变量可以为空(输出时输出`(nil)`)
let a
let b
#下面是输入
#解析:输入a,输入b
input a,b
#你也可以这样输入
let c=input
let d=input
#输出a,b,c,d
#println是print+换行+刷新缓冲区
println 'a: ',a
println 'b: ',b
println 'c: ',c
println 'd: ',d
#变量定义规则和C/C++一致
#除了'(string)'也是字符串之外,字面量规则也和C/C++差不多
源文件(C++11)
#define _LiCode "Alpha26.5.26"
#include<algorithm>
#include<cctype>
#include<cstdint>
#include<fstream>
#include<iostream>
#include<limits>
#include<sstream>
#include<string>
#include<vector>
static constexpr const char* key_words[]={
"let","input","print","Null","println",
"stdout.flush","stdout.buffer=open","stdout.buffer=close",
};
static constexpr size_t kw_cnt=sizeof(key_words)/sizeof(const char*);
bool ostream_need_buffer=true;
enum ctypes: char{Int,Float,String,Null,Error,KeyWord};
enum exec_flag: char{emptyln,goodres,vnameno,valueno,kwordno};
struct variable{
std::string name{};
std::string data{};
ctypes type=Null;
variable() noexcept=default;
variable(const std::string& _name,const std::string& _data,ctypes _type) noexcept:
name(_name),data(_data),type(_type){}
~variable() noexcept=default;
};
static std::vector<variable> memory;
//static std::vector<variable> temps(16,variable{{},{},Null});
std::string trim(const std::string& str) noexcept{
std::string::const_iterator start=str.cbegin();
std::string::const_iterator end=str.cend();
while(start!=end&&std::isspace(static_cast<int>(*start))) start++;
do{end--;}while(std::distance(start,end)>0&&std::isspace(static_cast<int>(*end)));
return std::string(start,end+1);
}
bool vname_check(const std::string& name) noexcept{
if(name.empty()) return false;
std::string::size_type len=name.size();
if(std::isdigit(static_cast<int>(name.front()))) return false;
for(std::string::size_type i=0;i<len;i++){
char chr=name[i];
if(std::isalnum(static_cast<int>(chr))||chr=='_') continue;
return false;
}
for(std::size_t i=0;i<kw_cnt;i++){
if(name==key_words[i]) return false;
}
std::vector<variable>::size_type size=memory.size();
for(std::vector<variable>::size_type i=0;i<size;i++){
if(name==memory[i].name) return false;
}
return true;
}
variable opt_sval(const std::string& str) noexcept{
if(str=="input") return variable{{},"input",KeyWord};
if(str=="Null") return variable{{},{},Null};
if(str.empty()) return variable{{},{},Null};
const std::string::size_type len=str.size();
if(len==1){
char chr=str.front();
if(chr=='.') return variable{{},"0.000000",Float};
if(std::isdigit(static_cast<int>(chr))) return variable{{},std::string(str),Int};
return variable{"","",Error};
}
if(len>=2){
char front=str.front(),back=str.back();
if((front=='\"'&&back=='\"')||(front=='\''&&back=='\'')){
std::string result{};
for(std::string::size_type i=1;i<len-1;i++){
char chr=str[i];
if(chr=='\''){
if(front=='\'') return variable{{},{},Error};
result.push_back('\'');
}
else if(chr=='\"'){
if(front=='\"') return variable{{},{},Error};
result.push_back('\"');
}
else if(chr=='\\'){
if(i==len-1) return variable{{},{},Error};
switch(str[++i]){
case 'a':
result.push_back('\a');
break;
case 'b':
result.push_back('\b');
break;
case 'f':
result.push_back('\f');
break;
case 'n':
result.push_back('\n');
break;
case 'r':
result.push_back('\r');
break;
case 't':
result.push_back('\t');
break;
case 'v':
result.push_back('\v');
break;
case '\\':
result.push_back('\\');
break;
case '\'':
result.push_back('\'');
break;
case '\"':
result.push_back('\"');
break;
case '0':
result.push_back('\0');
break;
default:
result.push_back(chr);
result.push_back(str[i]);
break;
}
}
else result.push_back(chr);
}
return variable{{},result,String};
}
else{
std::string::const_iterator cbegin=str.cbegin(),cend=str.cend();
bool isneg=false;
for(;cbegin!=cend;cbegin++){
if(*cbegin=='+') continue;
if(*cbegin=='-') isneg^=true;
else break;
}
if(cbegin==cend) return variable{{},{},Error};
variable result{{},isneg?"-":std::string{},Int};
std::string::size_type dotpos=str.find('.');
std::string::size_type len;
std::string intpart=std::string(trim(str.substr(cbegin-str.cbegin(),dotpos)));
len=intpart.size();
if(len==0) result.data.push_back('0');
else{
for(std::string::size_type i=0;i<len;i++){
char chr=intpart[i];
if(!std::isdigit(static_cast<int>(chr)))
return variable{{},{},Error};
result.data.push_back(chr);
}
}
if(dotpos!=std::string::npos){
result.type=Float;
result.data.push_back('.');
std::string floatpart=std::string(trim(str.substr(dotpos+1)));
len=floatpart.size();
if(len==0) result.data.append("000000");
for(std::string::size_type i=0;i<6;i++){
char chr=floatpart[i];
if(!std::isdigit(static_cast<int>(chr)))
return variable{{},{},Error};
result.data.push_back(chr);
}
if(len<6){
std::string::size_type pad=6-len;
result.data.append(pad,'0');
}
}
return result;
}
}
return variable{};
}
std::vector<variable>::size_type find_v(const std::string& name) noexcept{
std::vector<variable>::iterator it=
std::find_if(memory.begin(),memory.end(),[&name](const variable& var){return var.name==name;});
if(it!=memory.end()) return static_cast<std::vector<variable>::size_type>(std::distance(memory.begin(),it));
else return std::numeric_limits<std::vector<variable>::size_type>::max();
}
exec_flag exec_let(std::istringstream& stringin) noexcept{
std::string word;
std::getline(stringin,word);
std::string::size_type eq=word.find('=');
std::string name=trim(word.substr(0,eq));
if(!vname_check(name)) return vnameno;
if(eq!=std::string::npos){
std::string value=trim(word.substr(eq+1));
variable opt_value=opt_sval(value);
if(opt_value.type==Error) return valueno;
opt_value.name=name;
memory.push_back(opt_value);
if(opt_value.type==KeyWord){
memory.back().data.clear();
if(opt_value.data=="input"){
std::cin>>memory.back().data;
memory.back().type=String;
}
}
}
else memory.push_back(variable{{},{},Null});
return goodres;
}
exec_flag exec_input(std::istringstream& stringin) noexcept{
std::string word;
std::vector<variable>::size_type index=find_v(word);
while(std::getline(stringin,word,',')){
index=find_v(word);
if(index!=std::numeric_limits<std::vector<variable>::size_type>::max()){
std::cin>>memory.back().data;
memory[index].type=String;
}
else return vnameno;
}
if(!word.empty()){
index=find_v(word);
if(index!=std::numeric_limits<std::vector<variable>::size_type>::max()){
std::cin>>memory.back().data;
memory[index].type=String;
}
else return vnameno;
}
return goodres;
}
exec_flag exec_print(std::istringstream& stringin) noexcept{
std::string word;
while(std::getline(stringin,word,',')){
word=trim(word);
if(word=="stdout.flush") std::cout.flush();
else if(word=="stdout.buffer=open") ostream_need_buffer=true;
else if(word=="stdout.buffer=close") ostream_need_buffer=false;
else{
std::vector<variable>::size_type index=find_v(word);
if(index!=std::numeric_limits<std::vector<variable>::size_type>::max()){
if(ostream_need_buffer) std::cout<<memory[index].data;
else std::cerr<<memory[index].data;
}
else if(true){
variable temp=opt_sval(word);
if(temp.type==Error) return valueno;
else if(temp.type==KeyWord){
if(temp.data=="input"){
temp.data.clear();
std::cin>>temp.data;
std::cout<<temp.data;
}
}
else if(temp.type==Null) std::cout<<"(nil)";
else std::cout<<temp.data;
}
else return vnameno;
}
}
return goodres;
}
exec_flag exec_println(std::istringstream& stringin) noexcept{
exec_flag result=exec_print(stringin);
if(result==goodres){
std::cout.put('\n').flush();
return goodres;
}
return result;
}
exec_flag execln(const std::string& str) noexcept{
std::string line=trim(str);
if(line.empty()||line.front()=='#') return emptyln;
std::istringstream stringin(line);
std::string word;
stringin>>word;
if(word=="let") return exec_let(stringin);
else if(word=="input") return exec_input(stringin);
else if(word=="print") return exec_print(stringin);
else if(word=="println") return exec_println(stringin);
else return kwordno;
return goodres;
}
int main(){
std::ifstream fin("LiCode.txt");
if(!fin.is_open()){
std::cerr<<"Cannot open 'LiCode.txt!'";
return 404;
}
memory.push_back(variable{{},{},Null});
std::string line;
for(std::uint64_t cnt=0;std::getline(fin,line);cnt++){
exec_flag exec_result=execln(line);
switch(exec_result){
case emptyln:
continue;
case goodres:
continue;
case vnameno:
std::cerr<<"\nLiCode System Error: variable name is not good";
std::cerr<<"\nError line: "<<cnt;
return vnameno;
case valueno:
std::cerr<<"\nLiCode System Error: variable value is not good";
std::cerr<<"\nError line: "<<cnt;
return valueno;
case kwordno:
std::cerr<<"\nLiCode System Error: key word cannot find it";
std::cerr<<"\nError line: "<<cnt;
return kwordno;
}
}
fin.close();
}
希望大家可以支持一下
如果有Bug,请在评论区留言
全部评论 1
此处输入正文,2千字以内,可点击右上角【去预览】按钮查看markdown展示效果
5小时前 来自 香港
0















有帮助,赞一个