From: <jbo...@li...> - 2006-01-30 08:15:23
|
Author: mic...@jb... Date: 2006-01-30 03:15:07 -0500 (Mon, 30 Jan 2006) New Revision: 2227 Added: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/lang/DefaultGrammar_en.properties trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/application-data.drl trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/functions.drl Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/lang/Parser.java trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/ParserTest.java Log: functions and application data added Added: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/lang/DefaultGrammar_en.properties =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/lang/DefaultGrammar_en.properties 2006-01-30 05:23:05 UTC (rev 2226) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/lang/DefaultGrammar_en.properties 2006-01-30 08:15:07 UTC (rev 2227) @@ -0,0 +1,45 @@ +###################################################### +# # +# This is the basic English grammar resourcebundle # +# which uses If/then sentences to describe rules. # +# The file contains configurables such as noun, and # +# verb mapping. It also contains rule to natural # +# language grammar mapping. # +# # +###################################################### +if=If +then=Then +set=Set +set.verb=to +set.adverb= +object.has=has +object.equal=is +object.not.has=doesn\'t have +object.not.equal=is not equal +object.adj= +possessive=\'s +conjunction=and +conjunction.separator=, + + +###################################################### +# # +# Grammar mapping properties. These mappings allow # +# the RuleML parser to translate Rule grammar to # +# natural language. We do this by providing a # +# simple map which tests the Rule grammar. Each # +# type of sentence should map to one type of RuleML # +# grammar. The mappings can not be ambiguous and # +# must have a one to one relationship. # +# # +###################################################### +# the types of grammar mappings +grammar.types=constant,bind.var,bind.shadow + +# start the grammar mapping +constant.rule= +constant.nl= +bind.var.rule= +bind.var.nl= +bind.shadow.rule= +bind.shadow.nl= Property changes on: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/lang/DefaultGrammar_en.properties ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/lang/Parser.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/lang/Parser.java 2006-01-30 05:23:05 UTC (rev 2226) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/lang/Parser.java 2006-01-30 08:15:07 UTC (rev 2227) @@ -4,12 +4,15 @@ import java.io.IOException; import java.io.Reader; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.drools.rule.ApplicationData; import org.drools.rule.DuplicateRuleNameException; import org.drools.rule.Rule; import org.drools.rule.RuleConstructionException; @@ -24,26 +27,25 @@ private static Pattern PACKAGE_DECL = Pattern.compile( "\\s*package\\s*([^;]+);?\\s*" ); private static Pattern IMPORT_STATEMENT = Pattern.compile( "\\s*import\\s*([^;]+);?\\s*" ); + private static Pattern APP_DATA_STATEMENT = Pattern.compile( "\\s*application-data\\s*([^;]+)\\s([^;]+);?\\s*" ); private static Pattern RULE_DECL = Pattern.compile( "\\s*rule\\s*(.*[^\\s]+)\\s*" ); - + private static Pattern FUNCTION_DECL = Pattern.compile("\\s*functions?\\s*"); private static Pattern EXPANDER_STATEMENT = Pattern.compile("\\s*use\\s*expander\\s([^;]+);?\\s*"); - private static Pattern FACT_BINDING = Pattern.compile( "\\s*(\\w+)\\s*=>\\s*(.*)" ); private static Pattern FIELD_BINDING = Pattern.compile( "\\s*(\\w+):(\\w+)\\s*" ); + private static String COMMENT_1 = "#"; private static String COMMENT_2 = "//"; - private static String COMMENT_1 = "#"; - private BufferedReader reader; private String packageDeclaration; private List imports; private Expander expander; private List rules; - + private Map applicationData; + private String functions; - private int lineNumber; public Parser(Reader reader) { @@ -51,6 +53,7 @@ this.imports = new ArrayList(); this.rules = new ArrayList(); this.expander = null; + this.applicationData = new HashMap(); this.lineNumber = 0; } @@ -66,6 +69,10 @@ return rules; } + public String getFunctions() { + return functions; + } + Expander getExpander() { return expander; } @@ -73,13 +80,17 @@ public void parse() throws IOException, RuleConstructionException { prolog(); rules(); + } protected void prolog() throws IOException { packageDeclaration(); importStatements(); + applicationDataStatements(); expanderStatement(); - functions(); + functions(); + //BOB: do we want to allow flexible ordering of functions, etc? + //I think they should be at the end actually... } protected void packageDeclaration() throws IOException { @@ -101,6 +112,29 @@ } } + protected void applicationDataStatements() throws IOException { + while ( applicationDataStatement() ) { + //nike + } + } + + protected boolean applicationDataStatement() throws IOException { + String line = laDiscard(); + + if ( line == null ) { return false; } + + Matcher matcher = APP_DATA_STATEMENT.matcher( line ); + + if ( matcher.matches() ) { + consumeDiscard(); + + applicationData.put( matcher.group( 2 ).trim(), matcher.group( 1 ).trim() ); + return true; + } + + return false; + } + protected boolean importStatement() throws IOException { String line = laDiscard(); @@ -134,9 +168,45 @@ return false; } - protected void functions() { - - } + protected void functions() throws IOException { + String line = laDiscard(); + + if ( line == null ) { return; } + + Matcher matcher = FUNCTION_DECL.matcher( line ); + + if ( matcher.matches() ) { + consumeDiscard(); + //here we could put the semantic type declaration + } else { + return; //no functions, chopper... here, theres no functions. + } + + StringBuffer buffer = new StringBuffer(); + + while ( true ) { + line = laDiscard(); + if ( line == null ) { + throw new ParseException( "end of functions expected", lineNumber ); + } + String trimLine = line.trim(); + if ( trimLine.equals( "end" ) ) { + break; + } + consumeDiscard(); + line = maybeExpand( trimLine ); + buffer.append( line + "\n" ); + } + + if ( ! line.trim().equals( "end" ) ) { + throw new ParseException( "[end] of functions expected. But instead got: [" + line.trim() + "]", lineNumber); + } + + this.functions = buffer.toString(); + + consumeDiscard(); + } + protected void rules() throws IOException, RuleConstructionException { while ( rule() ) { @@ -170,7 +240,7 @@ line = laDiscard(); if ( ! line.trim().equals( "end" ) ) { - throw new ParseException( "[end] expected. But instead got: [" + line.trim() + "]", lineNumber); + throw new ParseException( "end of rule expected. But instead got: [" + line.trim() + "]", lineNumber); } consumeDiscard(); @@ -374,4 +444,11 @@ return line; } + /** + * @return A Map<<String>identifier, <String>Class> view of the app data + */ + public Map getApplicationData() { + return this.applicationData; + } + } Modified: trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/ParserTest.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/ParserTest.java 2006-01-30 05:23:05 UTC (rev 2226) +++ trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/ParserTest.java 2006-01-30 08:15:07 UTC (rev 2227) @@ -2,6 +2,8 @@ import java.io.InputStream; import java.io.InputStreamReader; +import java.util.List; +import java.util.Map; import junit.framework.TestCase; @@ -58,6 +60,23 @@ assertEquals("cheese_rules", ((Rule)parser.getRules().get(0)).getName() ); } + + public void test_with_appdata() throws Exception { + Parser parser = parser ( "application-data.drl" ); + parser.parse(); + Map appData = parser.getApplicationData(); + assertEquals(2, appData.size()); + assertEquals("MyObject", appData.get("me")); + assertEquals("YourObject", appData.get("you")); + } + + public void test_with_functions() throws Exception { + Parser parser = parser ( "functions.drl" ); + parser.parse(); + assertNotNull(parser.getFunctions()); + assertTrue(parser.getFunctions().indexOf("System.out.println(string);") > -1); + + } protected Parser parser(String name) { InputStream in = getClass().getResourceAsStream( name ); Added: trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/application-data.drl =================================================================== --- trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/application-data.drl 2006-01-30 05:23:05 UTC (rev 2226) +++ trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/application-data.drl 2006-01-30 08:15:07 UTC (rev 2227) @@ -0,0 +1,16 @@ +# showing application data + +import java.lang.String +import java.util.Random + +#setup application data here (optional semi colons, as always). +application-data MyObject me; +application-data YourObject you + +#app data should come after imports, before functions + + + + + + Property changes on: trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/application-data.drl ___________________________________________________________________ Name: svn:eol-style + native Added: trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/functions.drl =================================================================== --- trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/functions.drl 2006-01-30 05:23:05 UTC (rev 2226) +++ trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/functions.drl 2006-01-30 08:15:07 UTC (rev 2227) @@ -0,0 +1,29 @@ +# shows functions + +import java.lang.String + +functions + + public static void log(String string) { + System.out.println(string); + } + +end + + +rule something + when + #nothing + then + #nothing +end + +rule one more thing + when + #nothing + then + #nothing +end + + + Property changes on: trunk/labs/jbossrules/drools-core/src/test/java/org/drools/lang/functions.drl ___________________________________________________________________ Name: svn:eol-style + native |