Files
Nasal-Interpreter/README.md
Valk Richard Li c0dced7843 Update README.md
2019-08-31 00:45:32 +08:00

390 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Nasal-- Interpreter
# 我想起高兴的事情
我LR语法分析器写完了就差推导式了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
# Nasal
Nasal is a script language that used in FlightGear.
There is a Nasal console in FlightGear but sometimes it is not so easy for every developer to use.
So this is an interpreter for Nasal written by C++.
The interpreter is still in development.Anyone who interested in this could also join us!
# Issue in nasal console in flightgear
When calling a function without a ';' ,the console does not find the error.But in nasal's grammar this seems really wrong.
So in my interpreter,if you call the function only without a ';' behind it,you will get a piece of error information!
# Now complete all types
var: int float double std::string char long long int
NasalList: array in nasal []
append
setsize
subvec
pop
sort
NasalHash: Hash in nasal {}
append
delete
contains
keys
# Now complete Lexical Analysis!
What it looks like?
( Identifier | engineTimer )
( Operator | . )
( Identifier | start )
( Operator | ( )
( Operator | ) )
( Operator | ; )
( ReserveWord | print )
( Operator | ( )
( String | "Engine started" )
( Operator | ) )
( Operator | ; )
( Operator | } )
( ReserveWord | var )
( Identifier | stopEngine )
( Operator | = )
( ReserveWord | func )
( Operator | ( )
( Operator | ) )
( Operator | { )
( Identifier | props )
( Operator | . )
( Identifier | getNode )
( Operator | ( )
( String | "/" )
( Operator | , )
( Number | 1 )
( Operator | ) )
( Operator | . )
( Identifier | setValue )
( Operator | ( )
( String | "/controls/engines/engine/started" )
( Operator | , )
( Number | 0 )
( Operator | ) )
( Operator | ; )
( Identifier | props )
( Operator | . )
( Identifier | getNode )
( Operator | ( )
( String | "/" )
( Operator | , )
( Number | 1 )
( Operator | ) )
( Operator | . )
( Identifier | setValue )
( Operator | ( )
( String | "/fdm/jsbsim/external_reactions/engine/magnitude" )
( Operator | , )
( Number | 0 )
( Operator | ) )
( Operator | ; )
( Identifier | props )
( Operator | . )
( Identifier | getNode )
( Operator | ( )
( String | "/" )
( Operator | , )
( Number | 1 )
( Operator | ) )
( Operator | . )
( Identifier | setValue )
( Operator | ( )
( String | "/systems/electrical/e-tron/switch/bat-fwd-eng" )
( Operator | , )
( Number | 0 )
( Operator | ) )
( Operator | ; )
( Identifier | props )
( Operator | . )
( Identifier | getNode )
( Operator | ( )
( String | "/" )
( Operator | , )
( Number | 1 )
( Operator | ) )
( Operator | . )
( Identifier | setValue )
( Operator | ( )
( String | "/systems/electrical/e-tron/switch/bat-bwd-eng" )
( Operator | , )
( Number | 0 )
( Operator | ) )
( Operator | ; )
( Identifier | engineTimer )
( Operator | . )
( Identifier | stop )
( Operator | ( )
( Operator | ) )
( Operator | ; )
( ReserveWord | print )
( Operator | ( )
( String | "Engine stopped" )
( Operator | ) )
( Operator | ; )
( Operator | } )
This is what it outputs.
# Now with var_stack and function_stack
By printing the two stacks you can see how vars and functions change!
[long long int]a:1
[double]b:3.14
[string]c:"hello world!"
function:swap
function:__main
function:hello
# Now the parser can...
recognize all these things...
print("a",e);
var e=1;
var e="str";
var e=[];
var e={};
var e=e[0];
var e=e.e;
var e=e(0);
var e=e();
var e=e[e()];
var e=[1,e,1,e,1];
var e=[e,e,e,e];
var e={e:1,e:2,e:3};
var e=e[e.e];
e=1;
e="str";
e=[];
e={};
e=e[0];
e=e.e;
e=e(0);
e=e();
e=e[e()];
e=[1,e,1,e,1];
e=[e,e,e,e];
e={e:1,e:2,e:3};
e=e[e.e];
e=e.e();
var e={
e:1,
e:func(){},
e:func(e,e){},
e:func(){
e;
e;
},
e:func(e,e){
e;
e;
}
};
var e=func(){}
var e=func(e,e){}
var e=func(){e;e;}
var e=func(e,e){e;e;}
var e=func(e,e,e,e,e){
e=1;
e=e[0];
e=e(e,e,e);
return e;
}
e+=e;
e-=e;
e*=e;
e/=e;
e~=e;
e+=(e-e)*(e+(e/e));
e=e-e*(!2);
var e=e[0]~e[1]~e[2];
var e={
e:[],
e:{}
};
return {};
return [];
return {parent:[e]};
var e=0o7103;#Oct
var e=0x55aa;#Hex
var e=e/e;
var e=e[e/e];
var e=-e;
var e=-1;
var e=func(e){e;}
var e={e:e/e,e:1};
e= e.e(e,1).e()+e*e.e(e.e*e/180);
if(!e.e)e;
var e=e.e("str",1).e()*e.e("str",1).e*0.001;
e.e("str",1).e("str",e-e);
e.e(e("str",e.e()/2880)~"str");
var e=func(){e;};
# The structure of basical elements is...
class var;
class nasal_hash;//forward declaration
struct nasal_list_unit;
class nasal_list;
struct nasal_hash_unit;
class nasal_hash;
struct token_unit;
struct parameter;
class func;
class var_stack;
var_stack nasal_var_stack;
class func_stack;
func_stack nasal_func_stack;
class token_list;
token_list nasal_lexer;
class parse;
parse nasal_parser;
#include "nasal_lexer.h"
main();
# Push down automata
After many times of failure,i finally try to use PDA to do the parse work.