initial
This commit is contained in:
commit
3d0f5ffee7
8 changed files with 90 additions and 0 deletions
3
.editorconfig
Normal file
3
.editorconfig
Normal file
|
@ -0,0 +1,3 @@
|
|||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
1
.envrc
Normal file
1
.envrc
Normal file
|
@ -0,0 +1 @@
|
|||
export PATH="$HOME/Projects/silver/support/bin:$PATH"
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
ablebash.jar
|
||||
build.xml
|
6
Makefile
Normal file
6
Makefile
Normal file
|
@ -0,0 +1,6 @@
|
|||
SOURCES := $(shell find . -name "*.sv")
|
||||
|
||||
all: ablebash.jar
|
||||
|
||||
ablebash.jar: $(SOURCES)
|
||||
silver -I src ablebash ablebash
|
4
src/ablebash/AbstractSyntax.sv
Normal file
4
src/ablebash/AbstractSyntax.sv
Normal file
|
@ -0,0 +1,4 @@
|
|||
grammar ablebash;
|
||||
|
||||
nonterminal Item;
|
||||
synthesized attribute n :: Integer occurs on Item_c;
|
28
src/ablebash/ConcreteSyntax.sv
Normal file
28
src/ablebash/ConcreteSyntax.sv
Normal file
|
@ -0,0 +1,28 @@
|
|||
grammar ablebash;
|
||||
|
||||
import silver:langutil;
|
||||
|
||||
nonterminal Root;
|
||||
synthesized attribute items :: [Item] occurs on Root;
|
||||
|
||||
nonterminal Item_c with ast<Item>;
|
||||
|
||||
-------------- Root --------------
|
||||
|
||||
concrete production root_cons r::Root ::= i::Item_c s::ItemSep_t j::Root {
|
||||
r.items = i.ast :: j.items;
|
||||
}
|
||||
|
||||
concrete production root_one r::Root ::= i::Item_c {
|
||||
r.items = i.ast :: [];
|
||||
}
|
||||
|
||||
concrete production root_nil r::Root ::= {
|
||||
r.items = [];
|
||||
}
|
||||
|
||||
-------------- Item --------------
|
||||
|
||||
concrete production item_c i::Item_c ::= n::IntLit_t {
|
||||
i.n = toInteger(n.lexeme);
|
||||
}
|
39
src/ablebash/Main.sv
Normal file
39
src/ablebash/Main.sv
Normal file
|
@ -0,0 +1,39 @@
|
|||
grammar ablebash;
|
||||
|
||||
parser parse::Root { ablebash; }
|
||||
|
||||
function main IO<Integer> ::= largs::[String] {
|
||||
local attribute args :: String;
|
||||
args = implode(" ", largs);
|
||||
|
||||
local attribute result :: ParseResult<Root>;
|
||||
result = parse(args, "<<args>>");
|
||||
|
||||
-- local attribute r_cst :: Root_c ;
|
||||
-- r_cst = result.parseTree ;
|
||||
|
||||
-- local attribute r_ast :: Root ;
|
||||
-- r_ast = r_cst.ast_Root ;
|
||||
|
||||
local attribute print_success :: IO<Unit>;
|
||||
print_success =
|
||||
print( "Command line expression: " ++ args ++
|
||||
-- "\n\n" ++
|
||||
-- "CST pretty print: " ++ r_cst.pp ++
|
||||
-- "\n\n" ++
|
||||
-- "AST pretty print: " ++ r_ast.pp ++
|
||||
-- "\n\n" ++
|
||||
-- "AST better pretty print: " ++ r_ast.bpp ++
|
||||
-- "\n\n" ++
|
||||
-- "Value: " ++ toString(r_ast.value) ++
|
||||
"\n\n");
|
||||
|
||||
local attribute print_failure :: IO<Unit>;
|
||||
print_failure =
|
||||
print("Encountered a parse error:\n" ++ result.parseErrors ++ "\n");
|
||||
|
||||
return do {
|
||||
new(if result.parseSuccess then print_success else print_failure);
|
||||
return 0;
|
||||
};
|
||||
}
|
7
src/ablebash/Terminals.sv
Normal file
7
src/ablebash/Terminals.sv
Normal file
|
@ -0,0 +1,7 @@
|
|||
grammar ablebash;
|
||||
|
||||
terminal IntLit_t /[0-9]+/;
|
||||
|
||||
terminal ItemSep_t /(;|\r?\n)/;
|
||||
|
||||
ignore terminal WhiteSpace_t /[ ]+/ ;
|
Loading…
Reference in a new issue