[jboss-svn-commits] JBL Code SVN: r19461 - labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/dsl.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Apr 7 13:41:34 EDT 2008


Author: tirelli
Date: 2008-04-07 13:41:34 -0400 (Mon, 07 Apr 2008)
New Revision: 19461

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/dsl/DSLMap.g
Log:
Adding the new DSL AST grammar I implemented during the weekend. Maybe we end up using it in the future

Added: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/dsl/DSLMap.g
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/dsl/DSLMap.g	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/dsl/DSLMap.g	2008-04-07 17:41:34 UTC (rev 19461)
@@ -0,0 +1,221 @@
+grammar DSLMap;
+
+options { output = AST; backtrack = true; }
+
+tokens {
+       // imaginary tokens
+       VT_DSL_GRAMMAR;
+       VT_COMMENT;
+       VT_ENTRY;
+       
+       VT_SCOPE;
+       VT_CONDITION;
+       VT_CONSEQUENCE;
+       VT_KEYWORD;
+       VT_ANY;
+       
+       VT_META;
+       VT_ENTRY_KEY;
+       VT_ENTRY_VAL;
+       VT_VAR_DEF;
+       VT_VAR_REF;
+       VT_LITERAL;
+}
+
+ at parser::header {
+	package org.drools.lang.dsl;
+}
+
+ at lexer::header {
+	package org.drools.lang.dsl;
+}
+
+ at parser::members {
+	private boolean validateLT(int LTNumber, String text){
+		if (null == input) return false;
+		if (null == input.LT(LTNumber)) return false;
+		if (null == input.LT(LTNumber).getText()) return false;
+		
+		String text2Validate = input.LT(LTNumber).getText();
+		if (text2Validate.startsWith("[") && text2Validate.endsWith("]")){
+			text2Validate = text2Validate.substring(1, text2Validate.length() - 1); 
+		}
+
+		return text2Validate.equalsIgnoreCase(text);
+	}
+
+	private boolean validateIdentifierKey(String text){
+		return validateLT(1, text);
+	}
+}
+
+// PARSER RULES
+mapping_file
+	: statement* 
+	-> ^(VT_DSL_GRAMMAR statement*)
+	;
+
+statement
+	: entry
+	| comment
+	| EOL!	
+	;
+
+comment	: LINE_COMMENT
+	-> ^(VT_COMMENT[$LINE_COMMENT, "COMMENT"] LINE_COMMENT )
+	;	
+
+entry 	: scope_section meta_section key_section EQUALS value_section (EOL|EOF)
+	-> ^(VT_ENTRY scope_section meta_section key_section value_section)
+	;
+
+scope_section 
+	: LEFT_SQUARE
+	    ( value1=condition_key
+	    | value2=consequence_key
+	    | value3=keyword_key
+	    | value4=any_key         
+	    )
+	  RIGHT_SQUARE
+	-> ^(VT_SCOPE[$LEFT_SQUARE, "SCOPE SECTION"] $value1? $value2? $value3? $value4? )
+	;
+	
+meta_section
+	: LEFT_SQUARE LITERAL? RIGHT_SQUARE
+	-> ^(VT_META[$LEFT_SQUARE, "META SECTION"] LITERAL?)
+	;
+
+key_section
+	: key_sentence+
+	-> ^(VT_ENTRY_KEY key_sentence+ )
+	;
+ 
+key_sentence
+ at init {
+        String text = "";
+}	
+	: variable_definition
+	| cb=key_chunk { text = $cb.text; }
+	-> ^(VT_LITERAL[$cb.start, text] )
+	;		
+
+key_chunk
+	: literal+
+	;		
+	
+value_section
+	: value_sentence+
+	-> ^(VT_ENTRY_VAL value_sentence+ )
+	;
+	
+value_sentence 
+ at init {
+        String text = "";
+}	
+	: variable_reference
+	| vc=value_chunk { text = $vc.text; }
+	-> ^(VT_LITERAL[$vc.start, text] )
+	;	
+	
+value_chunk
+	: (literal|EQUALS)+
+	;	
+	
+literal 
+	: ( LITERAL | LEFT_SQUARE | RIGHT_SQUARE | COLLOM )
+	;	
+	
+variable_definition
+	: LEFT_CURLY name=LITERAL ( COLLOM pattern=LITERAL )? RIGHT_CURLY
+	-> ^(VT_VAR_DEF $name $pattern? )
+	;
+	
+variable_reference 
+	: LEFT_CURLY name=LITERAL RIGHT_CURLY
+	-> ^(VT_VAR_REF $name )
+	;	
+
+condition_key
+	:	{validateIdentifierKey("condition")||validateIdentifierKey("when")}?  value=LITERAL
+	-> VT_CONDITION[$value]
+	;
+
+consequence_key 
+	:	{validateIdentifierKey("consequence")||validateIdentifierKey("then")}?  value=LITERAL
+	-> VT_CONSEQUENCE[$value]
+	;
+
+keyword_key 
+	:	{validateIdentifierKey("keyword")}?  value=LITERAL
+	-> VT_KEYWORD[$value]
+	;
+
+any_key 
+	:	{validateIdentifierKey("*")}?  value=LITERAL
+	-> VT_ANY[$value]
+	;
+
+
+// LEXER RULES
+	
+WS      :       (	' '
+                |	'\t'
+                |	'\f'
+                )+
+                { $channel=HIDDEN; }
+        ;
+
+EOL 	:	     
+   		(       ( '\r\n' )=> '\r\n'  // Evil DOS
+                |       '\r'    // Macintosh
+                |       '\n'    // Unix (the right way)
+                )
+        ;  
+        
+fragment
+EscapeSequence
+    :   '\\' ('b'|'B'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\'|'.'|'o'|
+              'x'|'a'|'e'|'c'|'d'|'D'|'s'|'S'|'w'|'W'|'p'|'A'|
+              'G'|'Z'|'z'|'Q'|'E'|'*'|'['|']'|'('|')'|'$'|'^'|
+              '{'|'}'|'?'|'+'|'-'|'&'|'|'|'='|'u'|'0'|'#')
+    ;
+
+LEFT_SQUARE
+        :	'['
+        ;
+
+RIGHT_SQUARE
+        :	']'
+        ;        
+
+LEFT_CURLY
+        :	'{'
+        ;
+
+RIGHT_CURLY
+        :	'}'
+        ;
+        
+EQUALS	:	'='
+	;
+	
+POUND   :	'#'
+	;
+
+COLLOM	:	':'
+	;
+	
+LINE_COMMENT	
+	:	POUND ( options{greedy=false;} : .)* EOL /* ('\r')? '\n'  */
+	;
+
+LITERAL	
+	:	('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u00c0'..'\u00ff'|MISC|EscapeSequence)+
+	;
+
+fragment		
+MISC 	:
+		'!' | '@' | '$' | '%' | '^' | '*' | '-' | '+'  | '?' | '/' | '\'' | '"' | '|' | '&' | '(' | ')' | ';'
+	;
+
+




More information about the jboss-svn-commits mailing list