I've found that dynjs depends on ANTLR3. I have to learn ANTLR3 to read dynjs, so I'm trying to use it with Maven3.
pom.xml
To use ANTLR3, we have to write 1 dependency and 1 plugin in pom.xml. Sample is here.
<dependencies> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr-runtime</artifactId> <version>3.4</version> </dependency> ... </dependencies> <build> <plugins> <plugin> <groupId>org.antlr</groupId> <artifactId>antlr3-maven-plugin</artifactId> <version>3.4</version> <executions> <execution> <goals> <goal>antlr</goal> </goals> </execution> </executions> </plugin> ... </plugins> </build>
Create grammar file in src/main/antlr3
antlr3-maven-plugin will read grammar files in src/main/antlr3 directory. We have to create grammar file to generate our code.
What I created is here. It can parse "Tomcat runs" as a statement. I think basically we have to write @lexer::header and @parser::header because they specify package of our generated code.
grammar Statement;
options {
output = AST ;
}
@lexer::header {
package jp.skypencil.antlr;
}
@parser::header {
package jp.skypencil.antlr;
}
statement : S V;
S: 'Tomcat';
V: 'runs';
Test generated code
Finally you can generate your parser and lexer by `mvn clean verify` in target/generated-sources/antlr3 directory. Let's test them with JUnit4.
What I wrote is here. This test asserts that our parser can parse "Tomcat runs" without syntax error.
@Test
public void testTomcatRuns() throws RecognitionException {
CharStream input = new ANTLRStringStream("Tomcat runs");
StatementLexer lexer = new StatementLexer(input);
CommonTokenStream tokens = new CommonTokenStream();
tokens.setTokenSource(lexer);
StatementParser parser = new StatementParser(tokens);
parser.statement();
assertThat(parser.getNumberOfSyntaxErrors(), is(0));
}
We've succeeded to test our generated code, but it isn't useful because:
- We cannot use other words as input.
- We cannot access parsed words via generated class.
And writing flexible grammer and writing tree walker are good solutions for these problem. I'll write new articles about these approach.
Reference
- Building ANTLR Projects with Maven - ANTLR 3 - ANTLR Project
- sample codes which is created by `mvn archetype:generate`
- codes in dynjs repository