contrib/jwrapper: big rewrite of the AST visitor
[nit.git] / contrib / jwrapper / grammar / javap.sablecc
index 87dfa12..dc46557 100644 (file)
@@ -1,61 +1,78 @@
 Grammar javap;
 
+// ---
 Lexer
 
-identifier = ('a'..'z'|'A'..'Z'|'_'|'$') ('a'..'z'|'A'..'Z'|'_'|'$'|'0'..'9')*;
+identifier = ('a'..'z'|'A'..'Z'|'_'|'$') ('a'..'z'|'A'..'Z'|'_'|'-'|'$'|'0'..'9')*;
 blank = (' '|'\n'|'\t'|'\r')+;
 separator = ('.'|'/');
+brackets = '[]';
+wildcard = '?';
+compiled_from = 'Compiled from "' (Any-'"')* '"';
+dots = '...';
 
+// ---
 Parser
 Ignored blank;
 
-multi_files = class_or_interface*;
+files = file+;
+file = compiled_from? class_declaration;
 
-class_or_interface = class_declaration | interface_declaration;
+class_declaration = modifier* class_or_interface full_class_name
+       extends_declaration? implements_declaration? throws_declaration?
+       '{' property_declaration* '}';
 
-class_declaration = class_header '{' property_declaration* '}';
+class_or_interface = 'class'|'interface';
 
-class_header = modifier* 'class' full_class_name extends_declaration?
-                          implements_declaration? throws_declaration?;
-interface_declaration = modifier* 'interface' full_class_name extends_interface_declaration?
-                                               '{' property_declaration* '}';
+modifier
+       = 'public'|'private'|'protected'|'static'|'final'|'native'|'synchronized'|'abstract'|'threadsafe'|'transient'|'volatile'|'strictfp';
 
-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 = base_type brackets*;
 
-type_ref = full_class_name | generic_identifier 'extends' full_class_name | '?';
-type_refs = {tail:} type_refs ',' type_ref | {head:} type_ref;
+base_type
+       = {primitive:} primitive_base_type
+       | {class:} full_class_name
+       | {extends:} generic_identifier 'extends' type_bound
+       | {super:} generic_identifier 'super' type_bound
+       | {wildcard:} wildcard
+       | {void:} 'void';
 
-generic_param = '<' generic_parameter_list '>';
-generic_parameter_list = {tail:} generic_parameter_list ',' parameter | {head:} parameter;
-generic_identifier = full_class_name | '?';
+primitive_base_type = 'boolean'|'byte'|'char'|'short'|'int'|'float'|'long'|'double';
 
-full_class_name = full_class_name separator class_name | class_name;
-class_name = identifier generic_param?;
+type_bound
+       = {tail:} type_bound '&' full_class_name
+       | {head:} full_class_name;
 
-interface_name = full_class_name;
-interface_list = {tail:} interface_list ',' interface_name | {head:} interface_name;
+generic_identifier
+       = full_class_name
+       | wildcard;
 
-parameter = type '...'?;
-parameter_list_comp = {tail:} parameter_list_comp ',' parameter | {head:} parameter;
-parameter_list = parameter_list_comp;
+full_class_name
+       = {tail:} full_class_name separator class_name
+       | {head:} class_name;
+class_name = identifier generic_parameters?;
 
-exception = type;
-exception_list = exception_list ',' exception | exception;
+generic_parameters = '<' parameters '>';
 
-statement = variable_declaration | statement_block | ';';
-statement_block = '{' statement* '}';
+parameter = type dots?;
+parameters
+       = {tail:} parameters ',' parameter
+       | {head:} parameter;
 
-variable_id = identifier '[]'*;
-method_id = identifier;
+property_declaration
+       = {method:} modifier* generic_parameters? type identifier '(' parameters? ')' throws_declaration? ';'
+       | {constructor:} modifier* generic_parameters? full_class_name '(' parameters? ')' throws_declaration? ';'
+       | {attribute:} modifier* type identifier brackets* throws_declaration? ';'
+       | {static:} modifier* '{' '}' ';'
+       | ';';
+
+implements_declaration = 'implements' interface_list;
+extends_declaration = 'extends' interface_list;
+interface_list
+       = {tail:} interface_list ',' full_class_name
+       | {head:} full_class_name;
 
-property_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?;
+exception_list
+       = {tail:} exception_list ',' type
+       | {head:} type;