From b39a4db4b5809614b000bbba5d13da09f163dbf9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Vachon?= Date: Sun, 13 Jul 2014 17:08:24 -0400 Subject: [PATCH] contrib/jwrapper: Definition of a grammar to parse javap output MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Frédéric Vachon --- contrib/jwrapper/Makefile | 14 ++++++++ contrib/jwrapper/grammar/javap.sablecc | 61 ++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 contrib/jwrapper/Makefile create mode 100644 contrib/jwrapper/grammar/javap.sablecc diff --git a/contrib/jwrapper/Makefile b/contrib/jwrapper/Makefile new file mode 100644 index 0000000..b9d9b00 --- /dev/null +++ b/contrib/jwrapper/Makefile @@ -0,0 +1,14 @@ +default: + mkdir -p bin + make -C ../nitcc + cp ../nitcc/src/nitcc bin/ + ./bin/nitcc ./grammar/javap.sablecc + ../../bin/nitg ./src/javap_visitor.nit -o ./bin/jwrapper + mv *.nit ./src/ + mkdir -p gen + mv javap* ./gen/ + +clean: + rm -f bin/javap_test_parser bin/jwrapper + rm -f gen/* + rm -rf .nit_compile/ diff --git a/contrib/jwrapper/grammar/javap.sablecc b/contrib/jwrapper/grammar/javap.sablecc new file mode 100644 index 0000000..4e9165a --- /dev/null +++ b/contrib/jwrapper/grammar/javap.sablecc @@ -0,0 +1,61 @@ +Grammar javap; + +Lexer + +identifier = ('a'..'z'|'A'..'Z'|'_'|'$') ('a'..'z'|'A'..'Z'|'_'|'$'|'0'..'9')*; +blank = (' '|'\n'|'\t'|'\r')+; +separator = ('.'|'/'); + +Parser +Ignored blank; + +multi_files = class_or_interface*; + +class_or_interface = class_declaration | interface_declaration; + +class_declaration = class_header '{' field_declaration* '}'; + +class_header = modifier* 'class' full_class_name extends_declaration? + implements_declaration? throws_declaration?; +interface_declaration = modifier* 'interface' full_class_name extends_interface_declaration? + '{' field_declaration* '}'; + +modifier = 'public'|'private'|'protected'|'static'|'final'|'native'|'synchronized'|'abstract'|'threadsafe'|'transient'|'volatile'; +type = type_specifier '[]'*; +type_specifier = 'boolean'|'byte'|'char'|'short'|'int'|'float'|'long'|'double' | type_ref; + +type_ref = full_class_name | generic_identifier 'extends' full_class_name | '?'; +type_refs = {tail:} type_refs ',' type_ref | {head:} type_ref; + +generic_param = '<' generic_parameter_list '>'; +generic_parameter_list = {tail:} generic_parameter_list ',' parameter | {head:} parameter; +generic_identifier = full_class_name | '?'; + +full_class_name = full_class_name separator class_name | class_name; +class_name = identifier generic_param?; + +interface_name = full_class_name; +interface_list = {tail:} interface_list ',' interface_name | {head:} interface_name; + +parameter = type '...'?; +parameter_list_comp = {tail:} parameter_list_comp ',' parameter | {head:} parameter; +parameter_list = parameter_list_comp; + +exception = type; +exception_list = exception_list ',' exception | exception; + +statement = variable_declaration | statement_block | ';'; +statement_block = '{' statement* '}'; + +variable_id = identifier '[]'*; +method_id = identifier; + +field_declaration = method_declaration | constructor_declaration | variable_declaration | static_declaration | ';'; +variable_declaration = modifier* type variable_id throws_declaration? ';'; +method_declaration = modifier* generic_param? type method_id '(' parameter_list? ')' throws_declaration? ';'; +constructor_declaration = modifier* full_class_name '(' parameter_list? ')' throws_declaration? ';'; +implements_declaration = 'implements' interface_list*; +extends_interface_declaration = 'extends' interface_list*; +extends_declaration = 'extends' type; +static_declaration = modifier* '{' '}' ';'; +throws_declaration = 'throws' exception_list?; -- 1.7.9.5