Note that there are some explanatory texts on larger screens.

plurals
  1. POantlr4 puppet-style declarative grammar issue
    primarykey
    data
    text
    <p>I'm trying to write a grammer for a puppet-styled declarative language. I have my basic grammar, and a JUnit test trying to implement a Listener approach to loading it. The JUnit test captures the first resource but not the second resource, its almost like the <code>resources</code> rule is never getting evaluated. I added logging statements to my Loader, and resources never gets entered/exited.</p> <pre><code> grammar Bosse; resources : resource+; resource : ID LBRACE STRING COLON attributes RBRACE ; attributes : keyvalue ( COMMA keyvalue )* COMMA? ; keyvalue : ID ASSIGN expr ; expr : STRING | INT | FLOAT ; ID : [a-z]+ ; STRING : SQUOTE (SQESC|.)*? SQUOTE; SQESC : '\\\'' | '\\\\' ; INT : DIGIT+ ; FLOAT : DIGIT+ '.' DIGIT* | '.' DIGIT+ ; ASSIGN : '=&gt;' ; LBRACE : '{' ; RBRACE : '}' ; fragment SQUOTE : '\'' ; COLON : ':' ; COMMA : ',' ; WS : (' '|'\n'|'\t'|'\r')+ -&gt; skip ; fragment DIGIT : [0-9] ; </code></pre> <p>My BaseListener implementation:</p> <pre><code> public class BosseLoader extends BosseBaseListener { private List&lt;Resource&gt; resources = new ArrayList&lt;Resource&gt;(); private String resourceType; private String resourceTitle; private Map&lt;String,Object&gt; attributes = new HashMap&lt;String,Object&gt;(); private String parseString(String str) { str = str.substring(1, str.length()-1); str.replaceAll("\\\\(.)", "\1"); return str; } public List&lt;Resource&gt; getResources() { return resources; } @Override public void enterResources(ResourcesContext ctx) { log.finest("entered "+ctx); } @Override public void exitResources(ResourcesContext ctx) { log.finest("entered "+ctx); } @Override public void enterResource(ResourceContext ctx) { log.finest("entered "+ctx); resourceType = ctx.ID().getText(); resourceTitle = parseString(ctx.STRING().getText()); } @Override public void exitResource(ResourceContext ctx) { log.finest("entered "+ctx); Resource r = new Resource() { public String getTitle() { return resourceTitle; } public String toString() { String type = resourceType.substring(0,1).toUpperCase()+resourceType.substring(1); return type+"["+resourceTitle+"]"; } }; resources.add(r); System.out.println(r); super.exitResource(ctx); } @Override public void enterAttributes(AttributesContext ctx) { log.finest("entered "+ctx); attributes = new HashMap&lt;String,Object&gt;(); } @Override public void exitKeyvalue(KeyvalueContext ctx) { log.finest("entered "+ctx); attributes.put(ctx.ID().getText(),ctx.expr().getText()); } } </code></pre> <p>My JUnit test</p> <pre><code> @Test public void testSyntaxDouble() { System.out.println("testSyntaxDouble()"); String data = "user { 'ruckc' : ensure =&gt; 'present' }\n"+ "user { 'cruck' : ensure =&gt; 'present' }\n"; BosseLoader loader = new BosseLoader(); BosseLexer lexer = new BosseLexer(new ANTLRInputStream(data)); CommonTokenStream tokens = new CommonTokenStream(lexer); BosseParser parser = new BosseParser(tokens); ParseTree tree = parser.resource(); ParseTreeWalker walker = new ParseTreeWalker(); walker.walk(loader, tree); assertEquals(2,loader.getResources().size()); Resource r = loader.getResources().get(0); assertEquals("ruckc", r.getTitle()); assertEquals("User[ruckc]", r.toString()); r = loader.getResources().get(1); assertEquals("cruck", r.getTitle()); assertEquals("User[cruck]", r.toString()); } </code></pre> <p>My test output:</p> <pre><code>testSyntaxDouble() FINEST: AM org.cruck.bosse.language.BosseLoader enterResource entered [] FINEST: AM org.cruck.bosse.language.BosseLoader enterAttributes entered [19] FINEST: AM org.cruck.bosse.language.BosseLoader exitKeyvalue entered [22 19] FINEST: AM org.cruck.bosse.language.BosseLoader exitResource entered [] User[ruckc] Failed tests: testSyntaxDouble(org.cruck.bosse.language.BosseLanguageTest): expected:&lt;2&gt; but was:&lt;1&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload