# gramatica del element description hecha con <rule order> ...
 #separar el codigo en tres gramaticas:

1 parser) divide los comentarios, texto y codigo

2 parser) toma el codigo y lo divide en modules, section y lineas

identifica a que seccion pertenece y llama al parcer de esa seccion particular

3 parser era de element description tomaba el nombre del elemento el igual y dsp
una lista de las ecuaciones

es decir un hash con tres entradas: primera el nombre del elemento, segunda el numero, tercero: lista de ecuaciones

my $Grammar=<<'EOF';

program : <rulevar: local $WithinComment=0>
program : <rulevar: local $Comments = ""> /this shouldn't be here :-/
program : <reject>
program : <reject> /with prejudice/
program : <rulevar: local $Code = "">
program : <rulevar: local $Include = "">
program : <rulevar: local @Strings>
program	: <skip:''> part(s) include(0..1)
		{ 
                  #print "PROGRAM SOLO PARTES \n";
                  $Code.=';';
                  $Code=~s/\s+;/;/g;
                  $Code=~s/;\s+/;/g;
                  $Code=~s/;+/;/g;

                  { txt=>$Code, comments=>$Comments, strings=>[@Strings], include=>$Include}
                }
#                | part(s) include
#                  { 
#                      print "PROGRAM  PARTES INCLUDE \n";
#                    { txt=>$Code, comments=>$Comments, strings=>[@Strings], include=>$Include}
#                  } 


FIN: "\#eofile"

part	: comment
        | C_code
        | string
        | vacio
  

C_code  : m{(			
	      [^\$"\#/]+		# one or more non-delimiters
	      (			# then (optionally)...
	       /		# a potential comment delimiter
	       [^*/]		# which is not an actual delimiter
	      )?		# 
	    )+			# all repeated once or more
	   }x
		{ my $KKK = $item[1] ;
                  $KKK=~s/\\\n//;    
                  $KKK=~s/\n/;/g;          
                  $Code .= $KKK ;              
                  #print "CCODE $Code \n"
                   }

comment	: m{\s*			# optional whitespace
	    (//|\#)			# comment delimiter
	    [^\n]*		# anything except a newline
	    \n			# then a newline
	   }x
		{ $Code .= "\n"; $Comments .= $item[1] }
	| m{\s*			# optional whitespace
	    /\*			# comment opener
	    (?:[^*]+|\*(?!/))*	# anything except */
	    \*/		        # comment closer
            ([ \t]*)?           # trailing blanks or tabs
	   }x	
		{ $Code .= " "; $Comments .= $item[1] ;
                  #print "  $Comments \n";
                    }

include :  m{\s*		# optional whitespace
	    \$			# include delimiter
	    [^\n]*		# anything except a newline
	    \n			# then a newline
	   }x
		{ $Include = $item[1]; chomp $Include;
                #    print "INCLUDE $Include\n";
                    }

string	: m{"			# a leading delimiter
	    ((			# zero or more...
	      \\.		# escaped anything
	      |			# or
	      [^"]		# anything but a delimiter
	     )*
	    )
	    "}x
		{  my $KKK = $item[1] ;
                  $KKK=~s/\\\n//;                                    
                   $Code .= $KKK ; push @Strings, $KKK }

vacio : /\s*/

EOF


(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)




    $parser= qr{

     <Block>

     <rule: Block> <[Comments]>

     <rule: Comments> (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*) | (#.*)

    }xms;
