[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[no subject]



hello,

attached is my specifications file

I've got problems with the transformation from a cst to ast in
particular with 

equality_rule = [left]:concept_label equals [right]:concept_label
		 {-> New equality_rule([concept_label])}; 

when I run sablecc I always get the error message :

[126,31] concept_label must be one of the elements on the left side of
the arrow  or is already refered to in this alternative

Can someone help me please!!
thx in advance


Jan
/*
	Filename:	amo_specifications

	Author: 	Jan De Bo
	Creation:	29/01/2004
	Version:	0.0
*/
Package vub.starlab.amo.compiler;

Helpers

	cr  		= 13;	// carriage return	
	lf  		= 10; 	// line feed
	tab 		= 9;	// tab
	space 		= 32;	// blank space
	slash_star	= '/*';
	star_slash	= '*/';
	double_slash	= '//';
	double_quote 	= '"';
	slash		= '/';
	star		= '*';	

	digit			= ['0' .. '9'];
	all 			= [0 .. 255];
	char			= [all - [double_quote + [tab + [lf + cr]]]]; // spaces are allowed
	char_for_name		= [all - ['.' + [tab + [lf + [cr + space]]]]]; // spaces and dots are not allowed
	char_for_comment	= [all - [slash + cr]];
	char_for_comments	= [all - [star + slash]];

States

	normal, string, comment, comments;

Tokens

	{normal -> comments} comment_begin_slash_star 	= slash_star;
	{comments}           comment_body_slash_star	= char_for_comments*; // the compiler does not support nested comments
	{comments -> normal} comment_end_star_slash 	= star_slash;

	{normal -> comment} comment_begin_double_slash	= double_slash; 
	{comment}           comment_body_double_slash	= char_for_comment*;
	{comment -> normal} comment_end_double_slash 	= cr;

// Token for blank

	{normal} blank = (space | tab | cr | lf)+;

// Tokens for punctuation purposes

	{normal} comma 		= ',';
        {normal} dot 		= '.';
	{normal} equal 		= '=';
	{normal} l_par 		= '(';
	{normal} r_par 		= ')';

// Tokens for reserved keywords of the alignment and merging language

	{normal} add			= 'add';
	{normal} and			= 'and';
	{normal} alignment_rules	= 'alignment_rules';
	{normal} end			= 'end';
	{normal} equals			= 'equals';	 
	{normal} equivalent_to		= 'equivalent_to';
	{normal} generalize		= 'generalize';
	{normal} generalized_by		= 'generalized_by';	
	{normal} merge			= 'merge';
	{normal} merging_rules		= 'merging_rules';
	{normal} specialize		= 'specialize';
	{normal} subtype_of 		= 'subtype_of';
	{normal} with			= 'with';

/* we have to put a string between double quotes when we use a keyword as a string or when a string contains spaces 
   in all the other cases we use name */

	{normal -> string} string_start	= double_quote; 
	{string} string_value		= char (char | digit)*; // space are allowed, the first character cannot be a digit 
	{string -> normal} string_end	= double_quote;

	{normal} name			= char_for_name (char_for_name | digit)*; // space is not allowed and the first character cannot be a digit
	{normal} similarity_score	= digit ('.'|',') digit+ | '1'; 


Ignored Tokens

// These tokens will be ignored by the parser

	blank, 
	comment_begin_slash_star, comment_body_slash_star, comment_end_star_slash, comment_begin_double_slash, comment_body_double_slash, comment_end_double_slash;

Productions

	amo_definition			=   {only_alignment}        alignment_scope	
					    {-> New amo_definition.only_alignment(alignment_scope)} 
					  | {only_merging}          merging_scope	
					    {-> New amo_definition.only_merging(merging_scope)}
					  | {alignment_and_merging} alignment_scope merging_scope 
					    {-> New amo_definition.alignment_and_merging(alignment_scope,merging_scope)};
					   
	alignment_scope			= alignment_rules alignment_rule+ end {-> New alignment_scope([alignment_rule])};

	alignment_rule			=   {equivalence}         equivalence_rule 
					    {-> New alignment_rule.equivalence(equivalence_rule)}
					  | {equality}            equality_rule 
					    {-> New alignment_rule.equality(equality_rule)}
					  | {subtype}             subtype_rule 
					    {-> New alignment_rule.subtype(subtype_rule)}	
					  | {generalize}          generalize_rule 
					    {-> New alignment_rule.generalize(generalize_rule)}
					  | {conceptual_relation} conceptual_relation_rule
					    {-> New alignment_rule.conceptual_relation(conceptual_relation_rule)};

	merging_scope			= merging_rules merging_rule+ end {-> New merging_scope([merging_rule])};

	merging_rule			=   {merge}          merge_rule 
					    {-> New merging_rule.merge(merge_rule)}	
					  | {specialization} specialization_rule 
					    {-> New merging_rule.specialization(specialization_rule)}
					  | {generalization} generalization_rule 
					    {-> New merging_rule.generalization(generalization_rule)}
					  | {addition}       addition_rule
					    {-> New merging_rule.addition(addition_rule)};
		
// Alignment Rules	

	equality_rule 			= [left]:concept_label equals [right]:concept_label
					  {-> New equality_rule([concept_label])}; 

	equivalence_rule		= [left]:concept_label equivalent_to [right]:concept_label with similarity_score
					  {-> New equivalence_rule([concept_label],similarity_score)};

	subtype_rule			= [left]:concept_label subtype_of [right]:concept_label
					  {-> New subtype_rule([concept_label])};

	generalize_rule			= [left]:concept_label and [middle]:concept_label generalized_by [right]:concept_label
					  {-> New generalize_rule([concept_label])};

	conceptual_relation_rule	= [left]:concept_label role_label corole_label? [right]:concept_label
					  {-> New conceptual_relation_rule([concept_label],rolelabel,corole_label)};

// Merging Rules

	merge_rule			= merge concept_list equal concept_label
					  {-> New merge_rule([concept_list.concept_label],concept_label)};

	specialization_rule		= specialize concept_list
					  {-> New specialization_rule([concept_list.concept_label])};

	generalization_rule		= generalize concept_list equal concept_label
					  {-> New generalization_rule([concept_list.concept_label],concept_label)};

	addition_rule			= add l_par [left]:concept_label role_label corole_label? [right]:concept_label r_par 
					  {-> New addition_rule([concept_label],role_label,corole_label)};


// Definitions 

	concept_list{-> concept_label*} = l_par [left]:concept_label comma [right]:concept_label r_par
			  		  {-> [concept_label]};

	concept_label			= ontology_label [left]:dot context_label [right]:dot term_label
					  {-> New concept_label(ontology_label,context_label,term_label)};

	ontology_label 			=   {string} string_start string_value string_end 
					    {-> New ontology_label.string(string_value)}
					  | {name} name
					    {-> New ontology_label.name(name)};

	context_label			=   {string} string_start string_value string_end 
				    	    {-> New context_label.string(string_value)}
			  		  | {name}   name
					    {-> New context_label.name(name)};
					
	term_label			=   {string} string_start string_value string_end 
					    {-> New term_label.string(string_value)}
					  | {name} name
					    {-> New term_label.name(name)};

	role_label			=   {string} string_start string_value string_end 
					    {-> New role_label.string(string_value)}
					  | {name}   name
					    {-> New role_label.name(name)};

	corole_label		 	=   {string} string_start string_value string_end 
					    {-> New corole_label.string(string_value)}	
					|   {name}   name
					    {-> New corole_label.name(name)};	

Abstract Syntax Tree

	amo_definition			= {only_alignment}        alignment_scope | 
					  {only_merging}          merging_scope | 
					  {alignment_and_merging} alignment_scope merging_scope;

	alignment_scope			= alignment_rule*;

	alignment_rule			= {equivalence}         equivalence_rule |
					  {equality}            equality_rule |
					  {subtype}             subtype_rule |
					  {generalize}          generalize_rule |
					  {conceptual_relation} conceptual_relation_rule;

	merging_scope			= merging_rule*;

	merging_rule			= {merge}          merge_rule |
					  {specialization} specialization_rule |
					  {generalization} generalization_rule |
					  {addition}       addition_rule;
		
// Alignment Rules	

	equality_rule			= concept_label*; 

	equivalence_rule		= concept_label* similarity_score;

	subtype_rule			= concept_label*;

	generalize_rule			= concept_label*;

	conceptual_relation_rule	= concept_label* role_label corole_label?;

// Merging Rules

	merge_rule			= concept_label*;

	specialization_rule		= concept_label*;

	generalization_rule		= concept_label*;

	addition_rule			= concept_label* role_label corole_label?; 


// Definitions 

	concept_label	= ontology_label context_label term_label;

	ontology_label 	= {string} string_value | 
	  		  {name} name;

	context_label	= {string} string_value | 
			  {name}   name;
					
	term_label	= {string} string_value | 
			  {name} name;

	role_label	= {string} string_value | 
			  {name}   name;					

	corole_label 	= {string} string_value | 
			  {name}   name;