[jboss-svn-commits] JBL Code SVN: r20732 - in labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools: clips and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Jun 24 10:13:11 EDT 2008
Author: mark.proctor at jboss.com
Date: 2008-06-24 10:13:11 -0400 (Tue, 24 Jun 2008)
New Revision: 20732
Added:
labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/
labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/Clips.g
labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/functions.conf
Removed:
labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/cips/
labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/Clips.g
labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/functions.conf
Log:
JBRULES-720 Clips Parser
-corrected misspelt folder
Copied: labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips (from rev 20711, labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/cips)
Deleted: labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/Clips.g
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/cips/Clips.g 2008-06-23 23:48:12 UTC (rev 20711)
+++ labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/Clips.g 2008-06-24 14:13:11 UTC (rev 20732)
@@ -1,906 +0,0 @@
-grammar Clips;
-
- at parser::header {
- package org.drools.clips;
-
- import org.drools.clips.*;
-
- import java.util.List;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.HashMap;
- import java.util.Set;
- import java.util.HashSet;
- import java.util.StringTokenizer;
- import org.drools.lang.descr.*;
- import org.drools.lang.Location;
-}
-
- at parser::members {
- private PackageDescr packageDescr;
- private List errors = new ArrayList();
- private String source = "unknown";
- private int lineOffset = 0;
- private DescrFactory factory = new DescrFactory();
- private boolean parserDebug = false;
- private Location location = new Location( Location.LOCATION_UNKNOWN );
-
- public void setParserDebug(boolean parserDebug) {
- this.parserDebug = parserDebug;
- }
-
- public void debug(String message) {
- if ( parserDebug )
- System.err.println( "drl parser: " + message );
- }
-
- public void setSource(String source) {
- this.source = source;
- }
- public DescrFactory getFactory() {
- return factory;
- }
-
- public String getSource() {
- return this.source;
- }
-
- public PackageDescr getPackageDescr() {
- return packageDescr;
- }
-
- private int offset(int line) {
- return line + lineOffset;
- }
-
- /**
- * This will set the offset to record when reparsing. Normally is zero of course
- */
- public void setLineOffset(int i) {
- this.lineOffset = i;
- }
-
- private String getString(Token token) {
- String orig = token.getText();
- return orig.substring( 1, orig.length() -1 );
- }
-
- public void reportError(RecognitionException ex) {
- // if we've already reported an error and have not matched a token
- // yet successfully, don't report any errors.
- if ( errorRecovery ) {
- return;
- }
- errorRecovery = true;
-
- ex.line = offset(ex.line); //add the offset if there is one
- errors.add( ex );
- }
-
- /** return the raw RecognitionException errors */
- public List getErrors() {
- return errors;
- }
-
- /** Return a list of pretty strings summarising the errors */
- public List getErrorMessages() {
- List messages = new ArrayList();
- for ( Iterator errorIter = errors.iterator() ; errorIter.hasNext() ; ) {
- messages.add( createErrorMessage( (RecognitionException) errorIter.next() ) );
- }
- return messages;
- }
-
- /** return true if any parser errors were accumulated */
- public boolean hasErrors() {
- return ! errors.isEmpty();
- }
-
- /** This will take a RecognitionException, and create a sensible error message out of it */
- public String createErrorMessage(RecognitionException e)
- {
- StringBuffer message = new StringBuffer();
- message.append( source + ":"+e.line+":"+e.charPositionInLine+" ");
- if ( e instanceof MismatchedTokenException ) {
- MismatchedTokenException mte = (MismatchedTokenException)e;
- message.append("mismatched token: "+
- e.token+
- "; expecting type "+
- tokenNames[mte.expecting]);
- }
- else if ( e instanceof MismatchedTreeNodeException ) {
- MismatchedTreeNodeException mtne = (MismatchedTreeNodeException)e;
- message.append("mismatched tree node: "+
- //mtne.foundNode+ FIXME
- "; expecting type "+
- tokenNames[mtne.expecting]);
- }
- else if ( e instanceof NoViableAltException ) {
- NoViableAltException nvae = (NoViableAltException)e;
- message.append( "Unexpected token '" + e.token.getText() + "'" );
- /*
- message.append("decision=<<"+nvae.grammarDecisionDescription+">>"+
- " state "+nvae.stateNumber+
- " (decision="+nvae.decisionNumber+
- ") no viable alt; token="+
- e.token);
- */
- }
- else if ( e instanceof EarlyExitException ) {
- EarlyExitException eee = (EarlyExitException)e;
- message.append("required (...)+ loop (decision="+
- eee.decisionNumber+
- ") did not match anything; token="+
- e.token);
- }
- else if ( e instanceof MismatchedSetException ) {
- MismatchedSetException mse = (MismatchedSetException)e;
- message.append("mismatched token '"+
- e.token+
- "' expecting set "+mse.expecting);
- }
- else if ( e instanceof MismatchedNotSetException ) {
- MismatchedNotSetException mse = (MismatchedNotSetException)e;
- message.append("mismatched token '"+
- e.token+
- "' expecting set "+mse.expecting);
- }
- else if ( e instanceof FailedPredicateException ) {
- FailedPredicateException fpe = (FailedPredicateException)e;
- message.append("rule "+fpe.ruleName+" failed predicate: {"+
- fpe.predicateText+"}?");
- } else if (e instanceof GeneralParseException) {
- message.append(" " + e.getMessage());
- }
- return message.toString();
- }
-
- void checkTrailingSemicolon(String text, int line) {
- if (text.trim().endsWith( ";" ) ) {
- this.errors.add( new GeneralParseException( "Trailing semi-colon not allowed", offset(line) ) );
- }
- }
-
-}
-
- at lexer::header {
- package org.drools.clips;
-}
-
-/*
-opt_semicolon
- : ';'?
- ;
-
-
-compilation_unit
- :
- ( statement )+
- ;
-*/
-/*
-statement
- :
- //later we add the other possible statements here
- ( //do something with the returned rule here )
- ;
-*/
-/* prolog
- @init {
- String packageName = "";
- }
- : ( n=package_statement { packageName = n; } )?
- {
- this.packageDescr = factory.createPackage( packageName );
- }
- ;
-
-statement
- :
- ( import_statement
- | function_import_statement
- | global
- | function
- | t=template {this.packageDescr.addFactTemplate( t ); }
- | r=rule { if( r != null ) this.packageDescr.addRule( r ); }
- | q=query { if( q != null ) this.packageDescr.addRule( q ); }
- )
- ;
-
-package_statement returns [String packageName]
- @init{
- packageName = null;
- }
- :
- PACKAGE n=dotted_name[null] opt_semicolon
- {
- packageName = n;
- }
- ;
-*/
-
-eval[ParserHandler handler]
- :
- ( i=importDescr{ handler.importHandler( i ); }
- | f=deffunction { handler.functionHandler( f ); }
- | t=deftemplate { handler.templateHandler( t ); }
- | r=defrule { handler.ruleHandler( r ); }
- | form=lisp_form { handler.lispFormHandler( form ); }
- )*
- ;
-
- /*
-eval_sExpressions[MVELClipsContext context] returns[List<SExpression> list]
- @init {
- list = new ArrayList<SExpression>();
- }
- :
- ( a=lisp_list { list.add( a ); }
- | a=deffunction { FunctionHandlers.dump(a, null, context); }
- )*
-// { sExpressions = ( SExpression[] ) list.toArray( new SExpression[ list.size () ] ); }
- ;
- */
-
-importDescr returns[ImportDescr importDescr]
- : LEFT_PAREN 'import' importName=NAME { importDescr = new ImportDescr( importName.getText() ); } RIGHT_PAREN
- ;
-/*
-
-execution_list returns[ExecutionEngine engine]
- @init {
- engine = new BlockExecutionEngine();
- BuildContext context = new ExecutionBuildContext( engine, functionRegistry );
- }
-
- :
- (fc=lisp_list[context, new LispForm(context) ] { context.addFunction( (FunctionCaller) fc ); })
- ;
-*/
-
-/*
-deffunction returns[Deffunction function]
- @init {
- BuildContext context = null;
- }
- : loc=LEFT_PAREN
- DEFFUNCTION
- ruleName=NAME {
- function = new Deffunction( ruleName.getText() );
- functionRegistry.addFunction( function );
- context = new ExecutionBuildContext( function, functionRegistry );
- }
- loc=LEFT_PAREN
- (v=VAR {
- context.addVariable( function.addParameter( v.getText() ) );
- })*
- RIGHT_PAREN
- (fc=lisp_list[context, new LispForm(context) ] { context.addFunction( (FunctionCaller) fc ); })*
- RIGHT_PAREN
- ;
-*/
-
-/*
-deffunction_params[BuildContext context]
- : loc=LEFT_PAREN
- (v=VAR {
- // this creates a parameter on the underlying function
- context.createLocalVariable( v.getText() );
- })*
- RIGHT_PAREN
- ;
-*/
-
-deftemplate returns[TypeDeclarationDescr typeDescr]
- :
- loc=LEFT_PAREN
- DEFTEMPLATE deftemplateName=NAME {
- debug( "start rule: " + deftemplateName.getText() );
- String templateStr = deftemplateName.getText();
-
- String mod = null;
- if ( templateStr.indexOf("::") >= 0 ) {
- mod = templateStr.substring(0, templateStr.indexOf("::"));
- templateStr = templateStr.substring(templateStr.indexOf("::")+2);
- }
-
- typeDescr = new TypeDeclarationDescr( templateStr );
- if( mod != null ) {
- typeDescr.setNamespace( mod );
- }
-
- typeDescr.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
- typeDescr.setStartCharacter( ((CommonToken)loc).getStartIndex() );
-
-
- }
- documentation=STRING {
- // do nothing here for now
- }
-
- deftemplate_slot[typeDescr]*
- RIGHT_PAREN
- ;
-
-deftemplate_slot[TypeDeclarationDescr typeDescr]
- @init {
- }
- :
- LEFT_PAREN
- SLOT slotName=NAME
- LEFT_PAREN
- TYPE slotType=NAME
- RIGHT_PAREN {
- typeDescr.addField( new TypeFieldDescr(slotName.getText(), new PatternDescr( slotType.getText() ) ) );
- }
- RIGHT_PAREN
- ;
-
-deffunction returns[FunctionDescr functionDescr]
- @init {
- List content = null;
- functionDescr = null;
- }
- : LEFT_PAREN
- t=DEFFUNCTION //{ list.add( new SymbolLispAtom( t.getText() ) ); } //deffunction
- name=lisp_atom //name
- params=lisp_form // params
- (form=lisp_form { if ( content == null ) content = new ArrayList(); content.add( form ); } )+
- RIGHT_PAREN
- { functionDescr = FunctionHandlers.createFunctionDescr( name, params, content ); }
- //{ sExpression = new LispForm( ( SExpression[] ) list.toArray( new SExpression[ list.size () ] ) ); }
- ;
-
-defrule returns [RuleDescr rule]
- @init {
- rule = null;
- AndDescr lhs = null;
- PatternDescr colum = null;
- Set declarations = null;
- }
- : loc=LEFT_PAREN
-
- DEFRULE ruleName=NAME
- {
- debug( "start rule: " + ruleName.getText() );
- String ruleStr = ruleName.getText();
- AttributeDescr module = null;
-
- if ( ruleStr.indexOf("::") >= 0 ) {
- String mod = ruleStr.substring(0, ruleStr.indexOf("::"));
- ruleStr = ruleStr.substring(ruleStr.indexOf("::")+2);
- module = new AttributeDescr( "agenda-group", mod );
- module.setLocation( offset(ruleName.getLine()), ruleName.getCharPositionInLine() );
- module.setStartCharacter( ((CommonToken)ruleName).getStartIndex() );
- module.setEndCharacter( ((CommonToken)ruleName).getStopIndex() );
- }
-
- rule = new RuleDescr( ruleStr, null );
- if( module != null ) {
- rule.setNamespace( module.getValue() );
- rule.addAttribute( module );
- }
-
- rule.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
- rule.setStartCharacter( ((CommonToken)loc).getStartIndex() );
-
- // not sure how you define where a LHS starts in clips, so just putting it here for now
- lhs = new AndDescr();
- rule.setLhs( lhs );
- lhs.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
- lhs.setStartCharacter( ((CommonToken)loc).getStartIndex() );
-
- rule.addAttribute( new AttributeDescr( "dialect", "clips") );
-
- declarations = new HashSet();
- }
- documentation=STRING {
- // do nothing here for now
- }
- ruleAttribute[rule]
-
- ce[lhs, declarations]*
-
- '=>'
-
- list=rule_consequence{ rule.setConsequence( list ); }
-
- RIGHT_PAREN
- ;
-
-rule_consequence returns[List list]
- @init {
- list = null;
- }
- :
- (l=lisp_form { if ( list == null ) list = new ArrayList(); list.add( l ); })*
- ;
-
-ruleAttribute[RuleDescr rule]
- :
- ( LEFT_PAREN 'declare'
- ( LEFT_PAREN d=salience { rule.addAttribute( d ); } RIGHT_PAREN )?
- RIGHT_PAREN )?
- ;
-
-salience returns [AttributeDescr d ]
- @init {
- d = null;
- }
- :
- loc=SALIENCE i=INT
- {
- d = new AttributeDescr( "salience", i.getText() );
- d.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
- d.setStartCharacter( ((CommonToken)loc).getStartIndex() );
- d.setEndCharacter( ((CommonToken)i).getStopIndex() );
- }
- ;
-
-
-ce[ConditionalElementDescr in_ce, Set declarations]
- : ( and_ce[in_ce, declarations]
- | or_ce[in_ce, declarations]
- | not_ce[in_ce, declarations]
- | exists_ce[in_ce, declarations]
- | eval_ce[in_ce, declarations]
- | normal_pattern[in_ce, declarations]
- | bound_pattern[in_ce, declarations]
- )
- ;
-
-and_ce[ConditionalElementDescr in_ce, Set declarations]
- @init {
- AndDescr andDescr= null;
- }
- : LEFT_PAREN
- AND {
- andDescr = new AndDescr();
- in_ce.addDescr( andDescr );
- }
- ce[andDescr, declarations]+
- RIGHT_PAREN
- ;
-
-or_ce[ConditionalElementDescr in_ce, Set declarations]
- @init {
- OrDescr orDescr= null;
- }
- : LEFT_PAREN
- OR {
- orDescr = new OrDescr();
- in_ce.addDescr( orDescr );
- }
- ce[orDescr, declarations]+
- RIGHT_PAREN
- ;
-
-not_ce[ConditionalElementDescr in_ce, Set declarations]
- @init {
- NotDescr notDescr= null;
- }
- : LEFT_PAREN
- NOT {
- notDescr = new NotDescr();
- in_ce.addDescr( notDescr );
- }
- ce[notDescr, declarations]
- RIGHT_PAREN
- ;
-
-exists_ce[ConditionalElementDescr in_ce, Set declarations]
- @init {
- ExistsDescr existsDescr= null;
- }
- : LEFT_PAREN
- EXISTS {
- existsDescr = new ExistsDescr();
- in_ce.addDescr( existsDescr );
- }
- ce[existsDescr, declarations]
- RIGHT_PAREN
- ;
-
-eval_ce[ConditionalElementDescr in_ce, Set declarations]
- : LEFT_PAREN
- TEST
- t=lisp_form { EvalDescr evalDescr = new EvalDescr(); evalDescr.setContent( t ); in_ce.addDescr( evalDescr ); }
- RIGHT_PAREN
- ;
-
-normal_pattern[ConditionalElementDescr in_ce, Set declarations]
- @init {
- PatternDescr pattern = null;
- ConditionalElementDescr top = null;
- }
- : LEFT_PAREN
- name=NAME {
- pattern = new PatternDescr(name.getText());
- in_ce.addDescr( pattern );
- top = pattern.getConstraint();
-
- }
- field_constriant[top, declarations]*
- RIGHT_PAREN
- ;
-
-
-
-bound_pattern[ConditionalElementDescr in_ce, Set declarations]
- @init {
- PatternDescr pattern = null;
- String identifier = null;
- ConditionalElementDescr top = null;
- }
- : var=VAR {
- identifier = var.getText();
- }
- ASSIGN_OP LEFT_PAREN name=NAME
- {
- pattern = new PatternDescr(name.getText());
- pattern.setIdentifier( identifier.replace( '?', '$') );
- in_ce.addDescr( pattern );
- top = pattern.getConstraint();
- }
- field_constriant[top, declarations]*
- RIGHT_PAREN
- ;
-
-field_constriant[ConditionalElementDescr base, Set declarations]
- @init {
- List list = new ArrayList();
- FieldBindingDescr fbd = null;
- FieldConstraintDescr fc = null;
- RestrictionConnectiveDescr top = null;
- String op = "==";
- }
- :
- LEFT_PAREN f=NAME
- {
- fc = new FieldConstraintDescr(f.getText());
- fc.setLocation( offset(f.getLine()), f.getCharPositionInLine() );
- fc.setStartCharacter( ((CommonToken)f).getStartIndex() );
- //base.addDescr( fc );
- top = fc.getRestriction();
- }
-
- or_restr_connective[top, base, fc, declarations]
- { if ( top.getRestrictions().size() != 0 ) base.addDescr( fc ); }
- RIGHT_PAREN
- ;
-/*
-connected_constraint[RestrictionConnectiveDescr rc, ConditionalElementDescr base]
- :
- restriction[rc, base]
- (
- AMPERSAND { rc.addRestriction(new RestrictionConnectiveDescr(RestrictionConnectiveDescr.AND)); }
- connected_constraint[rc, base]
- |
- PIPE {rc.addRestriction(new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR)); }
- connected_constraint[rc, base]
- )?
- ;
-*/
-
-
-or_restr_connective[ RestrictionConnectiveDescr rcBase, ConditionalElementDescr ceBase, FieldConstraintDescr fcBase, Set declarations ]
- options {
- backtrack=true;
- }
- @init {
- RestrictionConnectiveDescr or = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR);
- }
- :
- and_restr_connective[or, ceBase, fcBase, declarations]
- (
- options {backtrack=true;}
- : PIPE
- {
- location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
- }
- and_restr_connective[or, ceBase, fcBase, declarations]
- )*
- ;
- finally {
- if( or.getRestrictions().size() == 1 ) {
- $rcBase.addOrMerge( (RestrictionDescr) or.getRestrictions().get( 0 ) );
- } else if ( or.getRestrictions().size() > 1 ) {
- $rcBase.addRestriction( or );
- }
- }
-
-and_restr_connective[ RestrictionConnectiveDescr rcBase, ConditionalElementDescr ceBase, FieldConstraintDescr fcBase, Set declarations ]
- @init {
- RestrictionConnectiveDescr and = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.AND);
- }
- :
- restriction[and, ceBase, fcBase, declarations]
- ( AMPERSAND restriction[and, ceBase, fcBase, declarations] )*
- /*
- ( options {backtrack=true;}
- : t=AMPERSAND
- {
- location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
- }
- restriction[and, ceBase]
- )*
- */
- ;
- finally {
- if( and.getRestrictions().size() == 1) {
- $rcBase.addOrMerge( (RestrictionDescr) and.getRestrictions().get( 0 ) );
- } else if ( and.getRestrictions().size() > 1 ) {
- $rcBase.addRestriction( and );
- }
- }
-
-restriction[RestrictionConnectiveDescr rc, ConditionalElementDescr base, FieldConstraintDescr fcBase, Set declarations ]
- @init {
- String op = "==";
- }
- : (TILDE{op = "!=";})?
- ( predicate_constraint[rc, op, base]
- | return_value_restriction[op, rc]
- | variable_restriction[op, rc, base, fcBase, declarations]
- | lc=literal_restriction {
- rc.addRestriction( new LiteralRestrictionDescr(op, lc) );
- op = "==";
- }
- )
- ;
-
-predicate_constraint[RestrictionConnectiveDescr rc, String op, ConditionalElementDescr base]
- : COLON
- t=lisp_form { $rc.addRestriction( new PredicateDescr( t ) ); }
-
- ;
-
-
-return_value_restriction[String op, RestrictionConnectiveDescr rc]
- : EQUALS
- t=lisp_form {rc.addRestriction( new ReturnValueRestrictionDescr (op, t ) ); }
- ;
-
-//will add a declaration field binding, if this is the first time the name is used
-variable_restriction[String op, RestrictionConnectiveDescr rc, ConditionalElementDescr ceBase, FieldConstraintDescr fcBase, Set declarations ]
- @init { String identifier = null;}
- : VAR {
- identifier = $VAR.text.replace( '?', '$');
- if ( declarations.contains( identifier) ) {
- rc.addRestriction( new VariableRestrictionDescr(op, identifier ) );
- } else {
- FieldBindingDescr fbd = new FieldBindingDescr();
- fbd.setIdentifier( identifier );
- fbd.setFieldName( fcBase.getFieldName() );
- ceBase.insertBeforeLast( FieldConstraintDescr.class, fbd );
- declarations.add( identifier );
- }
- }
- ;
-
-
-literal_restriction returns [String text]
- @init {
- text = null;
- }
- :
- t=literal {
- text = t;
- }
- ;
-
-/*
-eval_sExpressions[MVELClipsContext context] returns[List<SExpression> list]
- @init {
- list = new ArrayList<SExpression>();
- }
- :
- ( a=lisp_list { list.add( a ); }
- | a=deffunction { FunctionHandlers.dump(a, null, context); }
- )*
-// { sExpressions = ( SExpression[] ) list.toArray( new SExpression[ list.size () ] ); }
- ;
-*/
-lisp_form returns[LispForm lispForm]
- @init {
- List list = new ArrayList();
- lispForm = null;
- }
- : LEFT_PAREN
-
- (
- t=NAME { list.add( new SymbolLispAtom( t.getText() ) ); }
- |
- t=VAR { list.add( new VariableLispAtom( t.getText() ) ); }
- )
- ( a=lisp_atom { list.add( a ); }
- | l=lisp_form { list.add( l ); }
- )*
- RIGHT_PAREN
- { lispForm = new LispForm( ( SExpression[] ) list.toArray( new SExpression[ list.size () ] ) ); }
- ;
-
-lisp_atom returns[SExpression sExpression]
- @init {
- sExpression = null;
- }
- :
- (
- t=VAR { sExpression = new VariableLispAtom( t.getText() ); }
- | t=STRING { sExpression = new StringLispAtom( getString( t ) ); }
- | t=FLOAT { sExpression = new FloatLispAtom( t.getText() ); }
- | t=INT { sExpression = new IntLispAtom( t.getText() ); }
- | t=BOOL { sExpression = new BoolLispAtom( t.getText() ); }
- | t=NULL { sExpression = new NullLispAtom( null ); }
- | t=NAME { sExpression = new SymbolLispAtom( "\"" +t.getText() + "\""); }
-
- )
- ;
-
-literal returns [String text]
- @init {
- text = null;
- }
- : ( t=STRING { text = getString( t ); }
- | t=NAME { text = t.getText(); }
- | t=INT { text = t.getText(); }
- | t=FLOAT { text = t.getText(); }
- | t=BOOL { text = t.getText(); }
- | t=NULL { text = null; }
- )
- ;
-
-WS : ( ' '
- | '\t'
- | '\f'
- | EOL
- )
- { $channel=HIDDEN; }
- ;
-
-DEFTEMPLATE : 'deftemplate';
-SLOT : 'slot';
-TYPE : 'type';
-DEFRULE : 'defrule';
-DEFFUNCTION : 'deffunction';
-OR : 'or';
-AND : 'and';
-NOT : 'not';
-EXISTS : 'exists';
-TEST : 'test';
-
-NULL : 'null';
-
-DECLARE : 'declare';
-
-SALIENCE : 'salience';
-
-//MODIFY : 'modify';
-
-fragment
-EOL :
- ( ( '\r\n' )=> '\r\n' // Evil DOS
- | '\r' // Macintosh
- | '\n' // Unix (the right way)
- )
- ;
-
-INT
- : ('-')?('0'..'9')+
- ;
-
-FLOAT
- : ('-')?('0'..'9')+ '.' ('0'..'9')+
- ;
-
-STRING
- : ('"' ( EscapeSequence | ~('\\'|'"') )* '"')
- | ('\'' ( EscapeSequence | ~('\\'|'\'') )* '\'')
- ;
-
-fragment
-HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
-
-fragment
-EscapeSequence
- : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
- | UnicodeEscape
- | OctalEscape
- ;
-
-fragment
-OctalEscape
- : '\\' ('0'..'3') ('0'..'7') ('0'..'7')
- | '\\' ('0'..'7') ('0'..'7')
- | '\\' ('0'..'7')
- ;
-
-fragment
-UnicodeEscape
- : '\\' 'u' HexDigit HexDigit HexDigit HexDigit
- ;
-
-BOOL
- : ('true'|'false')
- ;
-
-VAR : '?' SYMBOL_CHAR+
- ;
-
-SH_STYLE_SINGLE_LINE_COMMENT
- : '#' ( options{greedy=false;} : .)* EOL /* ('\r')? '\n' */
- { $channel=HIDDEN; }
- ;
-
-
-C_STYLE_SINGLE_LINE_COMMENT
- : '//' ( options{greedy=false;} : .)* EOL // ('\r')? '\n'
- { $channel=HIDDEN; }
- ;
-
-
-LEFT_PAREN
- : '('
- ;
-
-RIGHT_PAREN
- : ')'
- ;
-
-LEFT_SQUARE
- : '['
- ;
-
-RIGHT_SQUARE
- : ']'
- ;
-
-LEFT_CURLY
- : '{'
- ;
-
-RIGHT_CURLY
- : '}'
- ;
-
-TILDE : '~'
- ;
-
-AMPERSAND
- : '&'
- ;
-
-PIPE
- : '|'
- ;
-
-ASSIGN_OP
- : '<-'
- ;
-
-COLON : ':';
-
-EQUALS : '=';
-
-MULTI_LINE_COMMENT
- : '/*' (options{greedy=false;} : .)* '*/'
- { $channel=HIDDEN; }
- ;
-
-NAME : SYMBOL ;
-
-fragment
-SYMBOL : FIRST_SYMBOL_CHAR SYMBOL_CHAR* ;
-
-// allowed <
-// not allowed ?
-fragment
-FIRST_SYMBOL_CHAR : ('a'..'z'|'A'..'Z'|'0'..'9'|'!'|'$'|'%'|'^'|'*'|'_'|'-'|'+'|'='|'\\'|'/'|'@'|'#'|':'|'>'|'<'|','|'.'|'['|']'|'{'|'}');
-
-// allowed ?
-// not allowed <
-fragment
-SYMBOL_CHAR : ('a'..'z'|'A'..'Z'|'0'..'9'|'!'|'$'|'%'|'^'|'*'|'_'|'-'|'+'|'='|'\\'|'/'|'@'|'#'|':'|'>'|','|'.'|'['|']'|'{'|'}'|'?');
-
-
-
Copied: labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/Clips.g (from rev 20731, labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/cips/Clips.g)
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/Clips.g (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/Clips.g 2008-06-24 14:13:11 UTC (rev 20732)
@@ -0,0 +1,947 @@
+grammar Clips;
+
+ at parser::header {
+ package org.drools.clips;
+
+ import org.drools.clips.*;
+
+ import java.util.List;
+ import java.util.ArrayList;
+ import java.util.Iterator;
+ import java.util.HashMap;
+ import java.util.Set;
+ import java.util.HashSet;
+ import java.util.StringTokenizer;
+ import org.drools.lang.descr.*;
+ import org.drools.lang.Location;
+}
+
+ at parser::members {
+ private PackageDescr packageDescr;
+ private List errors = new ArrayList();
+ private String source = "unknown";
+ private int lineOffset = 0;
+ private DescrFactory factory = new DescrFactory();
+ private boolean parserDebug = false;
+ private Location location = new Location( Location.LOCATION_UNKNOWN );
+
+ public void setParserDebug(boolean parserDebug) {
+ this.parserDebug = parserDebug;
+ }
+
+ public void debug(String message) {
+ if ( parserDebug )
+ System.err.println( "drl parser: " + message );
+ }
+
+ public void setSource(String source) {
+ this.source = source;
+ }
+ public DescrFactory getFactory() {
+ return factory;
+ }
+
+ public String getSource() {
+ return this.source;
+ }
+
+ public PackageDescr getPackageDescr() {
+ return packageDescr;
+ }
+
+ private int offset(int line) {
+ return line + lineOffset;
+ }
+
+ /**
+ * This will set the offset to record when reparsing. Normally is zero of course
+ */
+ public void setLineOffset(int i) {
+ this.lineOffset = i;
+ }
+
+ private String getString(Token token) {
+ String orig = token.getText();
+ return orig.substring( 1, orig.length() -1 );
+ }
+
+ public void reportError(RecognitionException ex) {
+ // if we've already reported an error and have not matched a token
+ // yet successfully, don't report any errors.
+ if ( errorRecovery ) {
+ return;
+ }
+ errorRecovery = true;
+
+ ex.line = offset(ex.line); //add the offset if there is one
+ errors.add( ex );
+ }
+
+ /** return the raw RecognitionException errors */
+ public List getErrors() {
+ return errors;
+ }
+
+ /** Return a list of pretty strings summarising the errors */
+ public List getErrorMessages() {
+ List messages = new ArrayList();
+ for ( Iterator errorIter = errors.iterator() ; errorIter.hasNext() ; ) {
+ messages.add( createErrorMessage( (RecognitionException) errorIter.next() ) );
+ }
+ return messages;
+ }
+
+ /** return true if any parser errors were accumulated */
+ public boolean hasErrors() {
+ return ! errors.isEmpty();
+ }
+
+ /** This will take a RecognitionException, and create a sensible error message out of it */
+ public String createErrorMessage(RecognitionException e)
+ {
+ StringBuffer message = new StringBuffer();
+ message.append( source + ":"+e.line+":"+e.charPositionInLine+" ");
+ if ( e instanceof MismatchedTokenException ) {
+ MismatchedTokenException mte = (MismatchedTokenException)e;
+ message.append("mismatched token: "+
+ e.token+
+ "; expecting type "+
+ tokenNames[mte.expecting]);
+ }
+ else if ( e instanceof MismatchedTreeNodeException ) {
+ MismatchedTreeNodeException mtne = (MismatchedTreeNodeException)e;
+ message.append("mismatched tree node: "+
+ //mtne.foundNode+ FIXME
+ "; expecting type "+
+ tokenNames[mtne.expecting]);
+ }
+ else if ( e instanceof NoViableAltException ) {
+ NoViableAltException nvae = (NoViableAltException)e;
+ message.append( "Unexpected token '" + e.token.getText() + "'" );
+ /*
+ message.append("decision=<<"+nvae.grammarDecisionDescription+">>"+
+ " state "+nvae.stateNumber+
+ " (decision="+nvae.decisionNumber+
+ ") no viable alt; token="+
+ e.token);
+ */
+ }
+ else if ( e instanceof EarlyExitException ) {
+ EarlyExitException eee = (EarlyExitException)e;
+ message.append("required (...)+ loop (decision="+
+ eee.decisionNumber+
+ ") did not match anything; token="+
+ e.token);
+ }
+ else if ( e instanceof MismatchedSetException ) {
+ MismatchedSetException mse = (MismatchedSetException)e;
+ message.append("mismatched token '"+
+ e.token+
+ "' expecting set "+mse.expecting);
+ }
+ else if ( e instanceof MismatchedNotSetException ) {
+ MismatchedNotSetException mse = (MismatchedNotSetException)e;
+ message.append("mismatched token '"+
+ e.token+
+ "' expecting set "+mse.expecting);
+ }
+ else if ( e instanceof FailedPredicateException ) {
+ FailedPredicateException fpe = (FailedPredicateException)e;
+ message.append("rule "+fpe.ruleName+" failed predicate: {"+
+ fpe.predicateText+"}?");
+ } else if (e instanceof GeneralParseException) {
+ message.append(" " + e.getMessage());
+ }
+ return message.toString();
+ }
+
+ void checkTrailingSemicolon(String text, int line) {
+ if (text.trim().endsWith( ";" ) ) {
+ this.errors.add( new GeneralParseException( "Trailing semi-colon not allowed", offset(line) ) );
+ }
+ }
+
+ void addTypeFieldDescr(LispForm lispForm, TypeDeclarationDescr typeDescr) {
+ if ( !(lispForm.getSExpressions()[0] instanceof SymbolLispAtom) ) {
+ throw new RuntimeException("should specify a slot");
+ }
+
+ SymbolLispAtom slot = (SymbolLispAtom) lispForm.getSExpressions()[0];
+ if ( !"slot".equals( slot.getValue().trim() )) {
+ throw new RuntimeException("should specify a slot");
+ }
+
+ if ( !(lispForm.getSExpressions()[1] instanceof SymbolLispAtom) ) {
+ throw new RuntimeException("should specify a slot name");
+ }
+ SymbolLispAtom slotName = (SymbolLispAtom) lispForm.getSExpressions()[1];
+
+ if ( !(lispForm.getSExpressions()[2] instanceof LispForm) ) {
+ throw new RuntimeException("should specify a type");
+ }
+
+ LispForm typeForm = (LispForm) lispForm.getSExpressions()[2];
+ if ( !(typeForm.getSExpressions()[0] instanceof SymbolLispAtom) ) {
+ throw new RuntimeException("should specify a type");
+ }
+ SymbolLispAtom type = (SymbolLispAtom) typeForm.getSExpressions()[0];
+ if ( !"type".equals( type.getValue().trim() )) {
+ throw new RuntimeException("should specify a type");
+ }
+
+ if ( !(typeForm.getSExpressions()[1] instanceof SymbolLispAtom) ) {
+ throw new RuntimeException("should specify a slot name");
+ }
+ SymbolLispAtom typeName = (SymbolLispAtom) typeForm.getSExpressions()[1];
+
+ TypeFieldDescr fieldDescr = new TypeFieldDescr(removeQuotes(slotName.getValue()), new PatternDescr(removeQuotes(typeName.getValue())));
+ typeDescr.addField( fieldDescr );
+ }
+
+ String removeQuotes(String string) {
+ return string.substring( 1, string.length() -1 );
+ }
+
+}
+
+ at lexer::header {
+ package org.drools.clips;
+}
+
+/*
+opt_semicolon
+ : ';'?
+ ;
+
+
+compilation_unit
+ :
+ ( statement )+
+ ;
+*/
+/*
+statement
+ :
+ //later we add the other possible statements here
+ ( //do something with the returned rule here )
+ ;
+*/
+/* prolog
+ @init {
+ String packageName = "";
+ }
+ : ( n=package_statement { packageName = n; } )?
+ {
+ this.packageDescr = factory.createPackage( packageName );
+ }
+ ;
+
+statement
+ :
+ ( import_statement
+ | function_import_statement
+ | global
+ | function
+ | t=template {this.packageDescr.addFactTemplate( t ); }
+ | r=rule { if( r != null ) this.packageDescr.addRule( r ); }
+ | q=query { if( q != null ) this.packageDescr.addRule( q ); }
+ )
+ ;
+
+package_statement returns [String packageName]
+ @init{
+ packageName = null;
+ }
+ :
+ PACKAGE n=dotted_name[null] opt_semicolon
+ {
+ packageName = n;
+ }
+ ;
+*/
+
+eval[ParserHandler handler]
+ :
+ ( i=importDescr{ handler.importHandler( i ); }
+ | f=deffunction { handler.functionHandler( f ); }
+ | t=deftemplate { handler.templateHandler( t ); }
+ | r=defrule { handler.ruleHandler( r ); }
+ | form=lisp_form { handler.lispFormHandler( form ); }
+ )*
+ ;
+
+ /*
+eval_sExpressions[MVELClipsContext context] returns[List<SExpression> list]
+ @init {
+ list = new ArrayList<SExpression>();
+ }
+ :
+ ( a=lisp_list { list.add( a ); }
+ | a=deffunction { FunctionHandlers.dump(a, null, context); }
+ )*
+// { sExpressions = ( SExpression[] ) list.toArray( new SExpression[ list.size () ] ); }
+ ;
+ */
+
+importDescr returns[ImportDescr importDescr]
+ : LEFT_PAREN 'import' importName=NAME { importDescr = new ImportDescr( importName.getText() ); } RIGHT_PAREN
+ ;
+/*
+
+
+execution_list returns[ExecutionEngine engine]
+ @init {
+ engine = new BlockExecutionEngine();
+ BuildContext context = new ExecutionBuildContext( engine, functionRegistry );
+ }
+
+ :
+ (fc=lisp_list[context, new LispForm(context) ] { context.addFunction( (FunctionCaller) fc ); })
+ ;
+*/
+
+/*
+deffunction returns[Deffunction function]
+ @init {
+ BuildContext context = null;
+ }
+ : loc=LEFT_PAREN
+ DEFFUNCTION
+ ruleName=NAME {
+ function = new Deffunction( ruleName.getText() );
+ functionRegistry.addFunction( function );
+ context = new ExecutionBuildContext( function, functionRegistry );
+ }
+ loc=LEFT_PAREN
+ (v=VAR {
+ context.addVariable( function.addParameter( v.getText() ) );
+ })*
+ RIGHT_PAREN
+ (fc=lisp_list[context, new LispForm(context) ] { context.addFunction( (FunctionCaller) fc ); })*
+ RIGHT_PAREN
+ ;
+*/
+
+/*
+deffunction_params[BuildContext context]
+ : loc=LEFT_PAREN
+ (v=VAR {
+ // this creates a parameter on the underlying function
+ context.createLocalVariable( v.getText() );
+ })*
+ RIGHT_PAREN
+ ;
+*/
+
+deffunction returns[FunctionDescr functionDescr]
+ @init {
+ List content = null;
+ functionDescr = null;
+ }
+ : LEFT_PAREN
+ t=DEFFUNCTION //{ list.add( new SymbolLispAtom( t.getText() ) ); } //deffunction
+ name=lisp_atom //name
+ params=lisp_form // params
+ (form=lisp_form { if ( content == null ) content = new ArrayList(); content.add( form ); } )+
+ RIGHT_PAREN
+ { functionDescr = FunctionHandlers.createFunctionDescr( name, params, content ); }
+ //{ sExpression = new LispForm( ( SExpression[] ) list.toArray( new SExpression[ list.size () ] ) ); }
+ ;
+
+defrule returns [RuleDescr rule]
+ @init {
+ rule = null;
+ AndDescr lhs = null;
+ PatternDescr colum = null;
+ Set declarations = null;
+ }
+ : loc=LEFT_PAREN
+
+ DEFRULE ruleName=NAME
+ {
+ debug( "start rule: " + ruleName.getText() );
+ String ruleStr = ruleName.getText();
+ AttributeDescr module = null;
+
+ if ( ruleStr.indexOf("::") >= 0 ) {
+ String mod = ruleStr.substring(0, ruleStr.indexOf("::"));
+ ruleStr = ruleStr.substring(ruleStr.indexOf("::")+2);
+ module = new AttributeDescr( "agenda-group", mod );
+ module.setLocation( offset(ruleName.getLine()), ruleName.getCharPositionInLine() );
+ module.setStartCharacter( ((CommonToken)ruleName).getStartIndex() );
+ module.setEndCharacter( ((CommonToken)ruleName).getStopIndex() );
+ }
+
+ rule = new RuleDescr( ruleStr, null );
+ if( module != null ) {
+ rule.setNamespace( module.getValue() );
+ rule.addAttribute( module );
+ }
+
+ rule.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
+ rule.setStartCharacter( ((CommonToken)loc).getStartIndex() );
+
+ // not sure how you define where a LHS starts in clips, so just putting it here for now
+ lhs = new AndDescr();
+ rule.setLhs( lhs );
+ lhs.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
+ lhs.setStartCharacter( ((CommonToken)loc).getStartIndex() );
+
+ rule.addAttribute( new AttributeDescr( "dialect", "clips") );
+
+ declarations = new HashSet();
+ }
+ documentation=STRING {
+ // do nothing here for now
+ }
+ ruleAttribute[rule]
+
+ ce[lhs, declarations]*
+
+ '=>'
+
+ list=rule_consequence{ rule.setConsequence( list ); }
+
+ RIGHT_PAREN
+ ;
+
+rule_consequence returns[List list]
+ @init {
+ list = null;
+ }
+ :
+ (l=lisp_form { if ( list == null ) list = new ArrayList(); list.add( l ); })*
+ ;
+
+ruleAttribute[RuleDescr rule]
+ :
+ ( LEFT_PAREN 'declare'
+ ( LEFT_PAREN d=salience { rule.addAttribute( d ); } RIGHT_PAREN )?
+ RIGHT_PAREN )?
+ ;
+
+salience returns [AttributeDescr d ]
+ @init {
+ d = null;
+ }
+ :
+ loc=SALIENCE i=INT
+ {
+ d = new AttributeDescr( "salience", i.getText() );
+ d.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
+ d.setStartCharacter( ((CommonToken)loc).getStartIndex() );
+ d.setEndCharacter( ((CommonToken)i).getStopIndex() );
+ }
+ ;
+
+
+ce[ConditionalElementDescr in_ce, Set declarations]
+ : ( and_ce[in_ce, declarations]
+ | or_ce[in_ce, declarations]
+ | not_ce[in_ce, declarations]
+ | exists_ce[in_ce, declarations]
+ | eval_ce[in_ce, declarations]
+ | normal_pattern[in_ce, declarations]
+ | bound_pattern[in_ce, declarations]
+ )
+ ;
+
+and_ce[ConditionalElementDescr in_ce, Set declarations]
+ @init {
+ AndDescr andDescr= null;
+ }
+ : LEFT_PAREN
+ AND {
+ andDescr = new AndDescr();
+ in_ce.addDescr( andDescr );
+ }
+ ce[andDescr, declarations]+
+ RIGHT_PAREN
+ ;
+
+or_ce[ConditionalElementDescr in_ce, Set declarations]
+ @init {
+ OrDescr orDescr= null;
+ }
+ : LEFT_PAREN
+ OR {
+ orDescr = new OrDescr();
+ in_ce.addDescr( orDescr );
+ }
+ ce[orDescr, declarations]+
+ RIGHT_PAREN
+ ;
+
+not_ce[ConditionalElementDescr in_ce, Set declarations]
+ @init {
+ NotDescr notDescr= null;
+ }
+ : LEFT_PAREN
+ NOT {
+ notDescr = new NotDescr();
+ in_ce.addDescr( notDescr );
+ }
+ ce[notDescr, declarations]
+ RIGHT_PAREN
+ ;
+
+exists_ce[ConditionalElementDescr in_ce, Set declarations]
+ @init {
+ ExistsDescr existsDescr= null;
+ }
+ : LEFT_PAREN
+ EXISTS {
+ existsDescr = new ExistsDescr();
+ in_ce.addDescr( existsDescr );
+ }
+ ce[existsDescr, declarations]
+ RIGHT_PAREN
+ ;
+
+eval_ce[ConditionalElementDescr in_ce, Set declarations]
+ : LEFT_PAREN
+ TEST
+ t=lisp_form { EvalDescr evalDescr = new EvalDescr(); evalDescr.setContent( t ); in_ce.addDescr( evalDescr ); }
+ RIGHT_PAREN
+ ;
+
+normal_pattern[ConditionalElementDescr in_ce, Set declarations]
+ @init {
+ PatternDescr pattern = null;
+ ConditionalElementDescr top = null;
+ }
+ : LEFT_PAREN
+ name=NAME {
+ pattern = new PatternDescr(name.getText());
+ in_ce.addDescr( pattern );
+ top = pattern.getConstraint();
+
+ }
+ field_constriant[top, declarations]*
+ RIGHT_PAREN
+ ;
+
+
+
+bound_pattern[ConditionalElementDescr in_ce, Set declarations]
+ @init {
+ PatternDescr pattern = null;
+ String identifier = null;
+ ConditionalElementDescr top = null;
+ }
+ : var=VAR {
+ identifier = var.getText();
+ }
+ ASSIGN_OP LEFT_PAREN name=NAME
+ {
+ pattern = new PatternDescr(name.getText());
+ pattern.setIdentifier( identifier.replace( '?', '$') );
+ in_ce.addDescr( pattern );
+ top = pattern.getConstraint();
+ }
+ field_constriant[top, declarations]*
+ RIGHT_PAREN
+ ;
+
+field_constriant[ConditionalElementDescr base, Set declarations]
+ @init {
+ List list = new ArrayList();
+ FieldBindingDescr fbd = null;
+ FieldConstraintDescr fc = null;
+ RestrictionConnectiveDescr top = null;
+ String op = "==";
+ }
+ :
+ LEFT_PAREN f=NAME
+ {
+ fc = new FieldConstraintDescr(f.getText());
+ fc.setLocation( offset(f.getLine()), f.getCharPositionInLine() );
+ fc.setStartCharacter( ((CommonToken)f).getStartIndex() );
+ //base.addDescr( fc );
+ top = fc.getRestriction();
+ }
+
+ or_restr_connective[top, base, fc, declarations]
+ { if ( top.getRestrictions().size() != 0 ) base.addDescr( fc ); }
+ RIGHT_PAREN
+ ;
+/*
+connected_constraint[RestrictionConnectiveDescr rc, ConditionalElementDescr base]
+ :
+ restriction[rc, base]
+ (
+ AMPERSAND { rc.addRestriction(new RestrictionConnectiveDescr(RestrictionConnectiveDescr.AND)); }
+ connected_constraint[rc, base]
+ |
+ PIPE {rc.addRestriction(new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR)); }
+ connected_constraint[rc, base]
+ )?
+ ;
+*/
+
+
+or_restr_connective[ RestrictionConnectiveDescr rcBase, ConditionalElementDescr ceBase, FieldConstraintDescr fcBase, Set declarations ]
+ options {
+ backtrack=true;
+ }
+ @init {
+ RestrictionConnectiveDescr or = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR);
+ }
+ :
+ and_restr_connective[or, ceBase, fcBase, declarations]
+ (
+ options {backtrack=true;}
+ : PIPE
+ {
+ location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
+ }
+ and_restr_connective[or, ceBase, fcBase, declarations]
+ )*
+ ;
+ finally {
+ if( or.getRestrictions().size() == 1 ) {
+ $rcBase.addOrMerge( (RestrictionDescr) or.getRestrictions().get( 0 ) );
+ } else if ( or.getRestrictions().size() > 1 ) {
+ $rcBase.addRestriction( or );
+ }
+ }
+
+and_restr_connective[ RestrictionConnectiveDescr rcBase, ConditionalElementDescr ceBase, FieldConstraintDescr fcBase, Set declarations ]
+ @init {
+ RestrictionConnectiveDescr and = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.AND);
+ }
+ :
+ restriction[and, ceBase, fcBase, declarations]
+ ( AMPERSAND restriction[and, ceBase, fcBase, declarations] )*
+ /*
+ ( options {backtrack=true;}
+ : t=AMPERSAND
+ {
+ location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
+ }
+ restriction[and, ceBase]
+ )*
+ */
+ ;
+ finally {
+ if( and.getRestrictions().size() == 1) {
+ $rcBase.addOrMerge( (RestrictionDescr) and.getRestrictions().get( 0 ) );
+ } else if ( and.getRestrictions().size() > 1 ) {
+ $rcBase.addRestriction( and );
+ }
+ }
+
+restriction[RestrictionConnectiveDescr rc, ConditionalElementDescr base, FieldConstraintDescr fcBase, Set declarations ]
+ @init {
+ String op = "==";
+ }
+ : (TILDE{op = "!=";})?
+ ( predicate_constraint[rc, op, base]
+ | return_value_restriction[op, rc]
+ | variable_restriction[op, rc, base, fcBase, declarations]
+ | lc=literal_restriction {
+ rc.addRestriction( new LiteralRestrictionDescr(op, lc) );
+ op = "==";
+ }
+ )
+ ;
+
+predicate_constraint[RestrictionConnectiveDescr rc, String op, ConditionalElementDescr base]
+ : COLON
+ t=lisp_form { $rc.addRestriction( new PredicateDescr( t ) ); }
+
+ ;
+
+
+return_value_restriction[String op, RestrictionConnectiveDescr rc]
+ : EQUALS
+ t=lisp_form {rc.addRestriction( new ReturnValueRestrictionDescr (op, t ) ); }
+ ;
+
+//will add a declaration field binding, if this is the first time the name is used
+variable_restriction[String op, RestrictionConnectiveDescr rc, ConditionalElementDescr ceBase, FieldConstraintDescr fcBase, Set declarations ]
+ @init { String identifier = null;}
+ : VAR {
+ identifier = $VAR.text.replace( '?', '$');
+ if ( declarations.contains( identifier) ) {
+ rc.addRestriction( new VariableRestrictionDescr(op, identifier ) );
+ } else {
+ FieldBindingDescr fbd = new FieldBindingDescr();
+ fbd.setIdentifier( identifier );
+ fbd.setFieldName( fcBase.getFieldName() );
+ ceBase.insertBeforeLast( FieldConstraintDescr.class, fbd );
+ declarations.add( identifier );
+ }
+ }
+ ;
+
+
+literal_restriction returns [String text]
+ @init {
+ text = null;
+ }
+ :
+ t=literal {
+ text = t;
+ }
+ ;
+
+/*
+eval_sExpressions[MVELClipsContext context] returns[List<SExpression> list]
+ @init {
+ list = new ArrayList<SExpression>();
+ }
+ :
+ ( a=lisp_list { list.add( a ); }
+ | a=deffunction { FunctionHandlers.dump(a, null, context); }
+ )*
+// { sExpressions = ( SExpression[] ) list.toArray( new SExpression[ list.size () ] ); }
+ ;
+*/
+lisp_form returns[LispForm lispForm]
+ @init {
+ List list = new ArrayList();
+ lispForm = null;
+ }
+ : LEFT_PAREN
+
+ (
+ t=NAME { list.add( new SymbolLispAtom( t.getText() ) ); }
+ |
+ t=VAR { list.add( new VariableLispAtom( t.getText() ) ); }
+ )
+ ( a=lisp_atom { list.add( a ); }
+ | l=lisp_form { list.add( l ); }
+ )*
+ RIGHT_PAREN
+ { lispForm = new LispForm( ( SExpression[] ) list.toArray( new SExpression[ list.size () ] ) ); }
+ ;
+
+lisp_atom returns[SExpression sExpression]
+ @init {
+ sExpression = null;
+ }
+ :
+ (
+ t=VAR { sExpression = new VariableLispAtom( t.getText() ); }
+ | t=STRING { sExpression = new StringLispAtom( getString( t ) ); }
+ | t=FLOAT { sExpression = new FloatLispAtom( t.getText() ); }
+ | t=INT { sExpression = new IntLispAtom( t.getText() ); }
+ | t=BOOL { sExpression = new BoolLispAtom( t.getText() ); }
+ | t=NULL { sExpression = new NullLispAtom( null ); }
+ | t=NAME { sExpression = new SymbolLispAtom( "\"" +t.getText() + "\""); }
+
+ )
+ ;
+
+
+deftemplate returns[TypeDeclarationDescr typeDescr]
+ :
+ loc=LEFT_PAREN
+ DEFTEMPLATE deftemplateName=NAME {
+ debug( "start rule: " + deftemplateName.getText() );
+ String templateStr = deftemplateName.getText();
+
+ String mod = null;
+ if ( templateStr.indexOf("::") >= 0 ) {
+ mod = templateStr.substring(0, templateStr.indexOf("::"));
+ templateStr = templateStr.substring(templateStr.indexOf("::")+2);
+ }
+
+ typeDescr = new TypeDeclarationDescr( templateStr );
+ if( mod != null ) {
+ typeDescr.setNamespace( mod );
+ }
+
+ typeDescr.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
+ typeDescr.setStartCharacter( ((CommonToken)loc).getStartIndex() );
+
+
+ }
+
+ documentation=STRING {
+ // do nothing here for now
+ }
+
+ /*
+ // can't get this to work, so process manually as a lisp_form
+ (LEFT_PAREN
+ 'slot' slotName=NAME
+ LEFT_PAREN
+ 'type' slotType=NAME {
+ typeDescr.addField( new TypeFieldDescr(slotName.getText(), new PatternDescr( slotType.getText() ) ) );
+ }
+ RIGHT_PAREN
+ RIGHT_PAREN)*
+ */
+
+ (list=lisp_form { addTypeFieldDescr(list, typeDescr); })*
+
+ RIGHT_PAREN
+ ;
+
+
+literal returns [String text]
+ @init {
+ text = null;
+ }
+ : ( t=STRING { text = getString( t ); }
+ | t=NAME { text = t.getText(); }
+ | t=INT { text = t.getText(); }
+ | t=FLOAT { text = t.getText(); }
+ | t=BOOL { text = t.getText(); }
+ | t=NULL { text = null; }
+ )
+ ;
+
+WS : ( ' '
+ | '\t'
+ | '\f'
+ | EOL
+ )
+ { $channel=HIDDEN; }
+ ;
+
+
+DEFTEMPLATE : 'deftemplate';
+
+//SLOT : 'slot';
+DEFRULE : 'defrule';
+DEFFUNCTION : 'deffunction';
+OR : 'or';
+AND : 'and';
+NOT : 'not';
+EXISTS : 'exists';
+TEST : 'test';
+NULL : 'null';
+
+DECLARE : 'declare';
+
+SALIENCE : 'salience';
+
+//MODIFY : 'modify';
+
+fragment
+EOL :
+ ( ( '\r\n' )=> '\r\n' // Evil DOS
+ | '\r' // Macintosh
+ | '\n' // Unix (the right way)
+ )
+ ;
+
+INT
+ : ('-')?('0'..'9')+
+ ;
+
+FLOAT
+ : ('-')?('0'..'9')+ '.' ('0'..'9')+
+ ;
+
+STRING
+ : ('"' ( EscapeSequence | ~('\\'|'"') )* '"')
+ | ('\'' ( EscapeSequence | ~('\\'|'\'') )* '\'')
+ ;
+
+fragment
+HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
+
+fragment
+EscapeSequence
+ : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
+ | UnicodeEscape
+ | OctalEscape
+ ;
+
+fragment
+OctalEscape
+ : '\\' ('0'..'3') ('0'..'7') ('0'..'7')
+ | '\\' ('0'..'7') ('0'..'7')
+ | '\\' ('0'..'7')
+ ;
+
+fragment
+UnicodeEscape
+ : '\\' 'u' HexDigit HexDigit HexDigit HexDigit
+ ;
+
+BOOL
+ : ('true'|'false')
+ ;
+
+VAR : '?' SYMBOL_CHAR+
+ ;
+
+SH_STYLE_SINGLE_LINE_COMMENT
+ : '#' ( options{greedy=false;} : .)* EOL /* ('\r')? '\n' */
+ { $channel=HIDDEN; }
+ ;
+
+
+C_STYLE_SINGLE_LINE_COMMENT
+ : '//' ( options{greedy=false;} : .)* EOL // ('\r')? '\n'
+ { $channel=HIDDEN; }
+ ;
+
+
+LEFT_PAREN
+ : '('
+ ;
+
+RIGHT_PAREN
+ : ')'
+ ;
+
+LEFT_SQUARE
+ : '['
+ ;
+
+RIGHT_SQUARE
+ : ']'
+ ;
+
+LEFT_CURLY
+ : '{'
+ ;
+
+RIGHT_CURLY
+ : '}'
+ ;
+
+TILDE : '~'
+ ;
+
+AMPERSAND
+ : '&'
+ ;
+
+PIPE
+ : '|'
+ ;
+
+ASSIGN_OP
+ : '<-'
+ ;
+
+COLON : ':';
+
+EQUALS : '=';
+
+MULTI_LINE_COMMENT
+ : '/*' (options{greedy=false;} : .)* '*/'
+ { $channel=HIDDEN; }
+ ;
+
+NAME : SYMBOL ;
+
+fragment
+SYMBOL : FIRST_SYMBOL_CHAR SYMBOL_CHAR* ;
+
+// allowed <
+// not allowed ?
+fragment
+FIRST_SYMBOL_CHAR : ('a'..'z'|'A'..'Z'|'0'..'9'|'!'|'$'|'%'|'^'|'*'|'_'|'-'|'+'|'='|'\\'|'/'|'@'|'#'|':'|'>'|'<'|','|'.'|'['|']'|'{'|'}');
+
+// allowed ?
+// not allowed <
+fragment
+SYMBOL_CHAR : ('a'..'z'|'A'..'Z'|'0'..'9'|'!'|'$'|'%'|'^'|'*'|'_'|'-'|'+'|'='|'\\'|'/'|'@'|'#'|':'|'>'|','|'.'|'['|']'|'{'|'}'|'?');
Deleted: labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/functions.conf
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/cips/functions.conf 2008-06-23 23:48:12 UTC (rev 20711)
+++ labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/functions.conf 2008-06-24 14:13:11 UTC (rev 20732)
@@ -1,28 +0,0 @@
-#working with vars
-org.drools.clp.functions.BindFunction
-org.drools.clp.functions.ModifyFunction
-org.drools.clp.functions.CreateListFunction
-
-#flow control
-org.drools.clp.functions.IfFunction
-org.drools.clp.functions.BreakFunction
-org.drools.clp.functions.SwitchFunction
-org.drools.clp.functions.SwitchCaseFunction
-org.drools.clp.functions.SwitchDefaultFunction
-org.drools.clp.functions.WhileFunction
-org.drools.clp.functions.ForeachFunction
-org.drools.clp.functions.PrognFunction
-
-#math comparators
-org.drools.clp.functions.LessThanFunction
-org.drools.clp.functions.GreaterThanOrEqualFunction
-org.drools.clp.functions.EqFunction
-
-#math operators
-org.drools.clp.functions.PlusFunction
-org.drools.clp.functions.MinusFunction
-org.drools.clp.functions.DivideFunction
-org.drools.clp.functions.MultiplyFunction
-
-#io
-org.drools.clp.functions.PrintoutFunction
Copied: labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/functions.conf (from rev 20731, labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/cips/functions.conf)
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/functions.conf (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clips/functions.conf 2008-06-24 14:13:11 UTC (rev 20732)
@@ -0,0 +1,28 @@
+#working with vars
+org.drools.clp.functions.BindFunction
+org.drools.clp.functions.ModifyFunction
+org.drools.clp.functions.CreateListFunction
+
+#flow control
+org.drools.clp.functions.IfFunction
+org.drools.clp.functions.BreakFunction
+org.drools.clp.functions.SwitchFunction
+org.drools.clp.functions.SwitchCaseFunction
+org.drools.clp.functions.SwitchDefaultFunction
+org.drools.clp.functions.WhileFunction
+org.drools.clp.functions.ForeachFunction
+org.drools.clp.functions.PrognFunction
+
+#math comparators
+org.drools.clp.functions.LessThanFunction
+org.drools.clp.functions.GreaterThanOrEqualFunction
+org.drools.clp.functions.EqFunction
+
+#math operators
+org.drools.clp.functions.PlusFunction
+org.drools.clp.functions.MinusFunction
+org.drools.clp.functions.DivideFunction
+org.drools.clp.functions.MultiplyFunction
+
+#io
+org.drools.clp.functions.PrintoutFunction
More information about the jboss-svn-commits
mailing list