[jboss-svn-commits] JBL Code SVN: r20049 - labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/resources/org/drools/lang.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon May 19 13:44:50 EDT 2008
Author: porcelli
Date: 2008-05-19 13:44:50 -0400 (Mon, 19 May 2008)
New Revision: 20049
Added:
labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g
Log:
Tree walker, responsible to build all the descr data.
Added: labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g
===================================================================
--- labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g (rev 0)
+++ labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g 2008-05-19 17:44:50 UTC (rev 20049)
@@ -0,0 +1,361 @@
+tree grammar DescrBuilderTree;
+
+options{
+ tokenVocab=DRL;
+ ASTLabelType=DroolsTree;
+ TokenLabelType=DroolsToken;
+}
+
+ at header {
+ package org.drools.lang;
+
+ import java.util.HashMap;
+ import java.util.Map;
+ import java.util.LinkedList;
+ import org.drools.lang.descr.DescrFactory;
+ import org.drools.lang.descr.BaseDescr;
+ import org.drools.lang.descr.PackageDescr;
+ import org.drools.lang.descr.AttributeDescr;
+ import org.drools.lang.descr.ImportDescr;
+ import org.drools.lang.descr.FunctionImportDescr;
+ import org.drools.lang.descr.GlobalDescr;
+ import org.drools.lang.descr.FunctionDescr;
+ import org.drools.lang.descr.FactTemplateDescr;
+ import org.drools.lang.descr.FieldTemplateDescr;
+ import org.drools.lang.descr.AndDescr;
+ import org.drools.lang.descr.QueryDescr;
+ import org.drools.lang.descr.RuleDescr;
+ import org.drools.lang.descr.PatternSourceDescr;
+ import org.drools.lang.descr.AccumulateDescr;
+ import org.drools.lang.descr.AccessorDescr;
+ import org.drools.lang.descr.DeclarativeInvokerDescr;
+ import org.drools.lang.descr.FromDescr;
+ import org.drools.lang.descr.FieldConstraintDescr;
+}
+
+ at members {
+ DescrFactory factory = new DescrFactory();
+ PackageDescr packageDescr = null;
+
+ public PackageDescr getPackageDescr() {
+ return packageDescr;
+ }
+}
+
+compilation_unit
+ : ^(VT_COMPILATION_UNIT package_statement statement*)
+ ;
+
+package_statement returns [String packageName]
+ : ^(VK_PACKAGE packageId=package_id)
+ { this.packageDescr = factory.createPackage($packageId.idList);
+ $packageName = packageDescr.getName(); }
+ |
+ { this.packageDescr = factory.createPackage(null);
+ $packageName = ""; }
+ ;
+
+package_id returns [List idList]
+ : ^(VT_PACKAGE_ID tempList+=ID+)
+ { $idList = $tempList; }
+ ;
+
+statement
+ : a=rule_attribute
+ { this.packageDescr.addAttribute($a.attributeDescr); }
+ | fi=function_import_statement
+ { this.packageDescr.addFunctionImport($fi.functionImportDescr); }
+ | is=import_statement
+ { this.packageDescr.addImport($is.importDescr); }
+ | gl=global
+ { this.packageDescr.addGlobal($gl.globalDescr); }
+ | fn=function
+ { this.packageDescr.addFunction($fn.functionDescr); }
+ | tp=template
+ { this.packageDescr.addFactTemplate($tp.factTemplateDescr); }
+ | rl=rule
+ { this.packageDescr.addRule($rl.ruleDescr); }
+ | qr=query
+ { this.packageDescr.addRule($qr.queryDescr); }
+ ;
+
+import_statement returns [ImportDescr importDescr]
+ : ^(importStart=VK_IMPORT importId=import_name)
+ { $importDescr = factory.createImport($importStart, $importId.idList, $importId.dotStar); }
+ ;
+
+function_import_statement returns [FunctionImportDescr functionImportDescr]
+ : ^(importStart=VT_FUNCTION_IMPORT VK_FUNCTION importId=import_name)
+ { $functionImportDescr = factory.createFunctionImport($importStart, $importId.idList, $importId.dotStar); }
+ ;
+
+import_name returns[List idList, DroolsTree dotStar]
+ : ^(VT_IMPORT_ID tempList+=ID+ tempDotStar=DOT_STAR?)
+ { $idList = $tempList;
+ $dotStar = $tempDotStar; }
+ ;
+
+global returns [GlobalDescr globalDescr]
+ : ^(start=VK_GLOBAL dt=data_type globalId=VT_GLOBAL_ID)
+ { $globalDescr = factory.createGlobal($start,$dt.dataType, $globalId); }
+ ;
+
+function returns [FunctionDescr functionDescr]
+ : ^(start=VK_FUNCTION dt=data_type? functionId=VT_FUNCTION_ID params=parameters content=VT_CURLY_CHUNK)
+ { $functionDescr = factory.createFunction($start, $dt.dataType, $functionId, $params.paramList, $content); }
+ ;
+
+template returns [FactTemplateDescr factTemplateDescr]
+ at init{
+ List slotList = new LinkedList<FieldTemplateDescr>();
+} : ^(start=VK_TEMPLATE id=VT_TEMPLATE_ID
+ ( ts=template_slot {slotList.add($ts.fieldTemplateDescr);})+ end=END)
+ { $factTemplateDescr = factory.createFactTemplate($start, $id, slotList, $end); }
+ ;
+
+template_slot returns [FieldTemplateDescr fieldTemplateDescr]
+ : ^(VT_SLOT dt=data_type id=VT_SLOT_ID)
+ { $fieldTemplateDescr = factory.createFieldTemplate($dt.dataType, $id); }
+ ;
+
+query returns [QueryDescr queryDescr]
+ : ^(start=VK_QUERY id=VT_QUERY_ID params=parameters? lb=lhs_block end=END)
+ { $queryDescr = factory.createQuery($start, $id, $params.paramList, $lb.andDescr, $end); }
+ ;
+
+rule returns [RuleDescr ruleDescr]
+ : ^(start=VK_RULE id=VT_RULE_ID ra=rule_attributes? wn=when_part? content=VT_RHS_CHUNK)
+ { $ruleDescr = factory.createRule($start, $id, $ra.attrList, $wn.andDescr, $content); }
+ ;
+
+when_part returns [AndDescr andDescr]
+ : VK_WHEN lh=lhs_block
+ { $andDescr = $lh.andDescr; }
+ ;
+
+rule_attributes returns [List attrList]
+ at init{
+ $attrList = new LinkedList<AttributeDescr>();
+} : ^(VT_RULE_ATTRIBUTES VK_ATTRIBUTES? (rl=rule_attribute {attrList.add($rl.attributeDescr);})+)
+ ;
+
+parameters returns [List paramList]
+ at init{
+ $paramList = new LinkedList<Map<BaseDescr, BaseDescr>>();
+} : ^(VT_PARAM_LIST (p=param_definition {$paramList.add($p.param);})*)
+ ;
+
+param_definition returns [Map param]
+ : dt=data_type? a=argument
+ { $param = new HashMap<BaseDescr, BaseDescr>();
+ $param.put($a.arg, $dt.dataType); }
+ ;
+
+argument returns [BaseDescr arg]
+ : id=ID (LEFT_SQUARE rightList+=RIGHT_SQUARE)*
+ { $arg = factory.createArgument($id, $rightList); }
+ ;
+
+rule_attribute returns [AttributeDescr attributeDescr]
+ : (^(attrName=VK_SALIENCE (value=INT|value=VT_PAREN_CHUNK))
+ | ^(attrName=VK_NO_LOOP value=BOOL?)
+ | ^(attrName=VK_AGENDA_GROUP value=STRING)
+ | ^(attrName=VK_DURATION value=INT)
+ | ^(attrName=VK_ACTIVATION_GROUP value=STRING)
+ | ^(attrName=VK_AUTO_FOCUS value=BOOL?)
+ | ^(attrName=VK_DATE_EFFECTIVE value=STRING)
+ | ^(attrName=VK_DATE_EXPIRES value=STRING)
+ | ^(attrName=VK_ENABLED value=BOOL)
+ | ^(attrName=VK_RULEFLOW_GROUP value=STRING)
+ | ^(attrName=VK_LOCK_ON_ACTIVE value=BOOL?)
+ | ^(attrName=VK_DIALECT value=STRING))
+ { $attributeDescr = factory.createAttribute($attrName, $value); }
+ ;
+
+lhs_block returns [AndDescr andDescr]
+ at init{
+ $andDescr = new AndDescr();
+} : ^(VT_AND_IMPLICIT (dt=lhs {$andDescr.addDescr($dt.baseDescr);})*)
+ ;
+
+lhs returns [BaseDescr baseDescr]
+ at init{
+ List<BaseDescr> lhsList = new LinkedList<BaseDescr>();
+} : ^(start=VT_OR_PREFIX (dt=lhs { lhsList.add($dt.baseDescr); })+)
+ { $baseDescr = factory.createOr($start, lhsList); }
+ | ^(start=VT_OR_INFIX dt1=lhs dt2=lhs)
+ { lhsList.add($dt1.baseDescr);
+ lhsList.add($dt2.baseDescr);
+ $baseDescr = factory.createOr($start, lhsList); }
+ | ^(start=VT_AND_PREFIX (dt=lhs { lhsList.add($dt.baseDescr); })+)
+ { $baseDescr = factory.createAnd($start, lhsList); }
+ | ^(start=VT_AND_INFIX dt1=lhs dt2=lhs)
+ { lhsList.add($dt1.baseDescr);
+ lhsList.add($dt2.baseDescr);
+ $baseDescr = factory.createAnd($start, lhsList); }
+ | ^(start=VK_EXISTS dt=lhs)
+ { $baseDescr = factory.createExists($start, $dt.baseDescr); }
+ | ^(start=VK_NOT dt=lhs)
+ { $baseDescr = factory.createNot($start, $dt.baseDescr); }
+ | ^(start=VK_EVAL pc=VT_PAREN_CHUNK)
+ { $baseDescr = factory.createEval($start, $pc); }
+ | ^(start=VK_FORALL (dt=lhs { lhsList.add($dt.baseDescr); })+)
+ { $baseDescr = factory.createForAll($start, lhsList); }
+ | ^(VK_FROM pn=lhs_pattern fe=from_elements)
+ { $baseDescr = factory.setupFrom($pn.baseDescr, $fe.patternSourceDescr); }
+ | pn=lhs_pattern
+ { $baseDescr = $pn.baseDescr; }
+ ;
+
+from_elements returns [PatternSourceDescr patternSourceDescr]
+ : ^(start=VK_ACCUMULATE dt=lhs
+ { $patternSourceDescr = factory.createAccumulate($start, $dt.baseDescr); }
+ ret=accumulate_parts[$patternSourceDescr])
+ { $patternSourceDescr = $ret.accumulateDescr; }
+ | ^(start=VK_COLLECT dt=lhs)
+ { $patternSourceDescr = factory.createCollect($start, $dt.baseDescr); }
+ | ^(start=VK_ENTRY_POINT entryId=VT_ENTRYPOINT_ID)
+ { $patternSourceDescr = factory.createEntryPoint($start, $entryId); }
+ | fs=from_source_clause
+ { $patternSourceDescr = $fs.fromDescr; }
+ ;
+
+accumulate_parts[PatternSourceDescr patternSourceDescr] returns [AccumulateDescr accumulateDescr]
+ : ac1=accumulate_init_clause[$patternSourceDescr]
+ { $accumulateDescr = $ac1.accumulateDescr; }
+ | ac2=accumulate_id_clause[$patternSourceDescr]
+ { $accumulateDescr = $ac2.accumulateDescr; }
+ ;
+
+accumulate_init_clause [PatternSourceDescr accumulateParam] returns [AccumulateDescr accumulateDescr]
+ : ^(VT_ACCUMULATE_INIT_CLAUSE
+ ^(start=VK_INIT pc1=VT_PAREN_CHUNK)
+ ^(VK_ACTION pc2=VT_PAREN_CHUNK)
+ rev=accumulate_init_reverse_clause?
+ ^(VK_RESULT pc3=VT_PAREN_CHUNK))
+ { if (null == rev){
+ $accumulateDescr = factory.setupAccumulateInit($accumulateParam, $start, $pc1, $pc2, $pc3, null);
+ } else {
+ $accumulateDescr = factory.setupAccumulateInit($accumulateParam, $start, $pc1, $pc2, $pc3, $rev.vkReverseChunk);
+ } }
+ ;
+
+accumulate_init_reverse_clause returns [DroolsTree vkReverse, DroolsTree vkReverseChunk]
+ : ^(vk=VK_REVERSE pc=VT_PAREN_CHUNK)
+ { $vkReverse = $vk;
+ $vkReverseChunk = $pc; }
+ ;
+
+accumulate_id_clause [PatternSourceDescr accumulateParam] returns [AccumulateDescr accumulateDescr]
+ : ^(VT_ACCUMULATE_ID_CLAUSE id=ID pc=VT_PAREN_CHUNK)
+ { $accumulateDescr = factory.setupAccumulateId($accumulateParam, $id, $pc); }
+ ;
+
+from_source_clause returns [FromDescr fromDescr]
+scope{
+ AccessorDescr accessorDescr;
+} : ^(VT_FROM_SOURCE id=ID pc=VT_PAREN_CHUNK?
+ { $from_source_clause::accessorDescr = factory.createAccessor($id, $pc); }
+ expression_chain?)
+ { $fromDescr = factory.createFromSource(factory.setupAccessorOffset($from_source_clause::accessorDescr)); }
+ ;
+
+expression_chain
+ : ^(start=VT_EXPRESSION_CHAIN id=ID sc=VT_SQUARE_CHUNK? pc=VT_PAREN_CHUNK?
+ { DeclarativeInvokerDescr declarativeInvokerResult = factory.createExpressionChain($start, $id, $sc, $pc);
+ $from_source_clause::accessorDescr.addInvoker(declarativeInvokerResult); }
+ expression_chain?)
+ ;
+
+lhs_pattern returns [BaseDescr baseDescr]
+ : ^(VT_PATTERN fe=fact_expression)
+ { $baseDescr = $fe.descr; }
+ ;
+
+fact_expression returns [BaseDescr descr]
+ at init{
+ List<BaseDescr> exprList = new LinkedList<BaseDescr>();
+} : ^(VT_FACT dt=data_type (fe=fact_expression {exprList.add($fe.descr);})*)
+ { $descr = factory.createPattern($dt.dataType, exprList); }
+ | ^(VT_FACT_BINDING label=VT_LABEL fact=fact_expression)
+ { $descr = factory.setupPatternBiding($label, $fact.descr); }
+ | ^(start=VT_FACT_OR left=fact_expression right=fact_expression)
+ { $descr = factory.createFactOr($start, $left.descr, $right.descr); }
+
+ | ^(VT_FIELD field=field_element fe=fact_expression?)
+ { if (null != fe){
+ $descr = factory.setupFieldConstraint($field.element, $fe.descr);
+ } else {
+ $descr = factory.setupFieldConstraint($field.element, null);
+ } }
+ | ^(VT_BIND_FIELD label=VT_LABEL fe=fact_expression)
+ { $descr = factory.createFieldBinding($label, $fe.descr); }
+
+ | ^(VK_EVAL pc=VT_PAREN_CHUNK)
+ { $descr = factory.createPredicate($pc); }
+
+ | ^(op=EQUAL fe=fact_expression)
+ { $descr = factory.setupRestriction($op, null, $fe.descr); }
+ | ^(op=NOT_EQUAL fe=fact_expression)
+ { $descr = factory.setupRestriction($op, null, $fe.descr); }
+ | ^(op=GREATER fe=fact_expression)
+ { $descr = factory.setupRestriction($op, null, $fe.descr); }
+ | ^(op=GREATER_EQUAL fe=fact_expression)
+ { $descr = factory.setupRestriction($op, null, $fe.descr); }
+ | ^(op=LESS fe=fact_expression)
+ { $descr = factory.setupRestriction($op, null, $fe.descr); }
+ | ^(op=LESS_EQUAL fe=fact_expression)
+ { $descr = factory.setupRestriction($op, null, $fe.descr); }
+ | ^(op=VK_CONTAINS not=VK_NOT? fe=fact_expression)
+ { $descr = factory.setupRestriction($op, $not, $fe.descr); }
+ | ^(op=VK_EXCLUDES not=VK_NOT? fe=fact_expression)
+ { $descr = factory.setupRestriction($op, $not, $fe.descr); }
+ | ^(op=VK_MATCHES not=VK_NOT? fe=fact_expression)
+ { $descr = factory.setupRestriction($op, $not, $fe.descr); }
+ | ^(op=VK_SOUNDSLIKE not=VK_NOT? fe=fact_expression)
+ { $descr = factory.setupRestriction($op, $not, $fe.descr); }
+ | ^(op=VK_MEMBEROF not=VK_NOT? fe=fact_expression)
+ { $descr = factory.setupRestriction($op, $not, $fe.descr); }
+ | ^(op=ID not=VK_NOT? param=VT_SQUARE_CHUNK? fe=fact_expression)
+ { $descr = factory.setupRestriction($op, $not, $fe.descr, $param); }
+
+ | ^(VK_IN not=VK_NOT? (fe=fact_expression {exprList.add($fe.descr);})+)
+ { $descr = factory.createRestrictionConnective($not, exprList); }
+
+ | ^(DOUBLE_PIPE left=fact_expression right=fact_expression)
+ { $descr = factory.createOrRestrictionConnective($left.descr, $right.descr); }
+ | ^(DOUBLE_AMPER left=fact_expression right=fact_expression)
+ { $descr = factory.createAndRestrictionConnective($left.descr, $right.descr); }
+
+ | ^(VT_ACCESSOR_PATH (ae=accessor_element {exprList.add($ae.element);})+)
+ { $descr = factory.createAccessorPath(exprList); }
+ | s=STRING
+ { $descr = factory.createStringLiteralRestriction($s); }
+ | i=INT
+ { $descr = factory.createIntLiteralRestriction($i); }
+ | f=FLOAT
+ { $descr = factory.createFloatLiteralRestriction($f); }
+ | b=BOOL
+ { $descr = factory.createBoolLiteralRestriction($b); }
+ | n=NULL
+ { $descr = factory.createNullLiteralRestriction($n); }
+ | pc=VT_PAREN_CHUNK
+ { $descr = factory.createReturnValue($pc); }
+ ;
+
+field_element returns [FieldConstraintDescr element]
+ at init{
+ List<BaseDescr> aeList = new LinkedList<BaseDescr>();
+} : ^(VT_ACCESSOR_PATH (ae=accessor_element {aeList.add($ae.element);})+)
+ { $element = factory.createFieldConstraint(aeList); }
+ ;
+
+accessor_element returns [BaseDescr element]
+ : ^(VT_ACCESSOR_ELEMENT id=ID sc+=VT_SQUARE_CHUNK*)
+ { $element = factory.createAccessorElement($id, $sc); }
+ ;
+
+data_type returns [BaseDescr dataType]
+ : ^(VT_DATA_TYPE idList+=ID+ (LEFT_SQUARE rightList+=RIGHT_SQUARE)*)
+ { $dataType = factory.createDataType($idList, $rightList); }
+ ;
\ No newline at end of file
Property changes on: labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g
___________________________________________________________________
Name: svn:eol-style
+ native
More information about the jboss-svn-commits
mailing list