contrib/jwrapper: Definition of a grammar to parse javap output
authorFrédéric Vachon <fredvac@gmail.com>
Sun, 13 Jul 2014 21:08:24 +0000 (17:08 -0400)
committerFrédéric Vachon <fredvac@gmail.com>
Mon, 21 Jul 2014 15:50:28 +0000 (11:50 -0400)
Signed-off-by: Frédéric Vachon <fredvac@gmail.com>

contrib/jwrapper/Makefile [new file with mode: 0644]
contrib/jwrapper/grammar/javap.sablecc [new file with mode: 0644]

diff --git a/contrib/jwrapper/Makefile b/contrib/jwrapper/Makefile
new file mode 100644 (file)
index 0000000..b9d9b00
--- /dev/null
@@ -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 (file)
index 0000000..4e9165a
--- /dev/null
@@ -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?;