forked from xxq250/Nasal-Interpreter
390 lines
5.9 KiB
Markdown
390 lines
5.9 KiB
Markdown
# 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.
|