/*
* Copyright (C) 2010 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package lombok.ast.grammar;
import lombok.ast.Node;
import org.parboiled.BaseParser;
import org.parboiled.Rule;
public class StatementsParser extends BaseParser<Node> {
final ParserGroup group;
final StatementsActions actions;
public StatementsParser(ParserGroup group) {
this.actions = new StatementsActions(group.getSource());
this.group = group;
}
public Rule anyStatement() {
return Sequence(
TestNot(Ch('}')),
labelledStatement());
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.2">JLS section 14.2</a>
*/
public Rule blockStatement() {
return Sequence(
Ch('{'), group.basics.optWS(),
ZeroOrMore(anyStatement().label("statement")),
Ch('}'), group.basics.optWS(),
set(actions.createBlock(values("ZeroOrMore/statement"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.3">JLS section 14.3</a>
*/
public Rule localClassDeclaration() {
return group.structures.classOrInterfaceDeclaration();
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.4">JLS section 14.4</a>
*/
public Rule variableDefinition() {
return Sequence(
group.structures.variableDefinitionModifiers().label("modifiers"),
group.structures.variableDefinition(), set(), set(actions.posify(value())),
set(actions.addLocalVariableModifiers(value(), value("modifiers"))));
}
public Rule localVariableDeclaration() {
return Sequence(
variableDefinition().label("definition"),
Ch(';'), group.basics.optWS(),
set(actions.createVariableDeclaration(value("definition"))));
}
public Rule explicitAlternateConstructorInvocation() {
return Sequence(
group.types.typeArguments().label("typeArgs"),
String("this"), group.basics.testLexBreak(), group.basics.optWS(),
group.structures.methodArguments().label("arguments"),
Ch(';'), group.basics.optWS(),
set(actions.createAlternateConstructorInvocation(value("typeArgs"), value("arguments"))));
}
public Rule explicitSuperConstructorInvocation() {
return Sequence(
Optional(Sequence(group.expressions.allPrimaryExpressions(), Ch('.').label("dot"), group.basics.optWS())).label("qualifier"),
group.types.typeArguments().label("typeArgs"),
String("super"), group.basics.testLexBreak(), group.basics.optWS(),
group.structures.methodArguments().label("arguments"),
Ch(';'), group.basics.optWS(),
set(actions.createSuperConstructorInvocation(node("qualifier/Sequence/dot"), value("qualifier"), value("typeArgs"), value("arguments"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.6">JLS section 14.6</a>
*/
Rule emptyStatement() {
return Sequence(
Ch(';'),
group.basics.optWS(),
set(actions.createEmptyStatement()));
}
/**
* Labels aren't statements; instead they can prefix any statement. Something like {@code if (1 == 1) foo: a();} is legal.
* Multiple labels for the same statement is also legal.
*
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.7">JLS section 14.7</a>
*/
public Rule labelledStatement() {
return Sequence(
ZeroOrMore(Sequence(
group.basics.identifier().label("labelName"),
Ch(':'),
group.basics.optWS())),
FirstOf(
blockStatement(),
localClassDeclaration(),
localVariableDeclaration(),
emptyStatement(),
expressionStatement(),
ifStatement(),
assertStatement(),
switchStatement(),
caseStatement(),
defaultStatement(),
whileStatement(),
doWhileStatement(),
basicForStatement(),
enhancedForStatement(),
breakStatement(),
continueStatement(),
returnStatement(),
synchronizedStatement(),
throwStatement(),
tryStatement(),
explicitAlternateConstructorInvocation(),
explicitSuperConstructorInvocation()
).label("statement"),
set(actions.createLabelledStatement(values("ZeroOrMore/Sequence/labelName"), value("statement"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.8">JLS section 14.8</a>
*/
public Rule expressionStatement() {
return Sequence(
group.expressions.statementExpression().label("expression"),
Ch(';'), group.basics.optWS(),
set(actions.createExpressionStatement(value("expression"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.9">JLS section 14.9</a>
*/
public Rule ifStatement() {
return Sequence(
String("if"), group.basics.testLexBreak(), group.basics.optWS(),
Ch('('), group.basics.optWS(),
group.expressions.anyExpression().label("condition"),
Ch(')'), group.basics.optWS(),
anyStatement(), set(),
Optional(Sequence(
String("else"), group.basics.testLexBreak(), group.basics.optWS(),
anyStatement()).label("else")),
set(actions.createIfStatement(value("condition"), value(), value("Optional/else"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10">JLS section 14.10</a>
*/
public Rule assertStatement() {
return Sequence(
String("assert"), group.basics.testLexBreak(), group.basics.optWS(),
group.expressions.anyExpression(),
set(),
Optional(Sequence(
Ch(':'), group.basics.optWS(),
group.expressions.anyExpression(), set())),
Ch(';'), group.basics.optWS(),
set(actions.createAssertStatement(value(), value("Optional/Sequence"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.11">JLS section 14.11</a>
*/
public Rule switchStatement() {
return Sequence(
String("switch"), group.basics.testLexBreak(), group.basics.optWS(),
Ch('('), group.basics.optWS(),
group.expressions.anyExpression(), set(),
Ch(')'), group.basics.optWS(),
blockStatement(),
set(actions.createSwitchStatement(value(), lastValue())));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.11">JLS section 14.11</a>
*/
public Rule caseStatement() {
return Sequence(
String("case"), group.basics.testLexBreak(), group.basics.optWS(),
group.expressions.anyExpression(), set(),
Ch(':'), group.basics.optWS(),
set(actions.createCaseStatement(value())));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.11">JLS section 14.11</a>
*/
public Rule defaultStatement() {
return Sequence(
String("default").label("defaultKeyword"), group.basics.testLexBreak(), group.basics.optWS(),
Ch(':'), group.basics.optWS(),
set(actions.createDefaultStatement(node("defaultKeyword"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.12">JLS section 14.12</a>
*/
public Rule whileStatement() {
return Sequence(
String("while"), group.basics.testLexBreak(), group.basics.optWS(),
Ch('('), group.basics.optWS(),
group.expressions.anyExpression().label("condition"),
Ch(')'), group.basics.optWS(),
anyStatement(), set(),
set(actions.createWhileStatement(value("condition"), value())));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.13">JLS section 14.13</a>
*/
public Rule doWhileStatement() {
return Sequence(
String("do"), group.basics.testLexBreak(), group.basics.optWS(),
anyStatement(), set(),
String("while"), group.basics.testLexBreak(), group.basics.optWS(),
Ch('('), group.basics.optWS(),
group.expressions.anyExpression().label("condition"),
Ch(')'), group.basics.optWS(),
Ch(';'), group.basics.optWS(),
set(actions.createDoStatement(value("condition"), value())));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.14.1.1">JLS section 14.14.1.1</a>
*/
public Rule basicForStatement() {
return Sequence(
String("for"), group.basics.testLexBreak(), group.basics.optWS(),
Ch('('), group.basics.optWS(),
forInit().label("init"),
Ch(';'), group.basics.optWS(),
Optional(group.expressions.anyExpression()).label("condition"),
Ch(';'), group.basics.optWS(),
forUpdate().label("update"),
Ch(')'), group.basics.optWS(),
anyStatement().label("statement"),
set(actions.createBasicFor(value("init"), value("condition"), value("update"), value("statement"))));
}
Rule forInit() {
return Optional(FirstOf(
variableDefinition(),
statementExpressionList()));
}
Rule forUpdate() {
return Optional(statementExpressionList());
}
Rule statementExpressionList() {
return Sequence(
group.expressions.statementExpression().label("head"),
ZeroOrMore(Sequence(
Ch(','), group.basics.optWS(),
group.expressions.statementExpression()).label("tail")),
set(actions.createStatementExpressionList(value("head"), values("ZeroOrMore/tail"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.14.2">JLS section 14.14.2</a>
* @see <a href="http://bugs.sun.com/view_bug.do?bug_id=1699917">Bug 1699917</a>
*/
public Rule enhancedForStatement() {
return Sequence(
String("for"), group.basics.testLexBreak(), group.basics.optWS(),
Ch('('), group.basics.optWS(),
group.structures.variableDefinitionModifiers().label("modifiers"),
group.types.type().label("type"),
group.structures.variableDefinitionPartNoAssign().label("varDeclPart"),
Ch(':'), group.basics.optWS(),
group.expressions.anyExpression().label("iterable"),
Ch(')'), group.basics.optWS(),
anyStatement().label("statement"),
set(actions.createEnhancedFor(node("modifiers"), value("type"), node("varDeclPart"), value("iterable"), value("statement"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.15">JLS section 14.15</a>
*/
public Rule breakStatement() {
return Sequence(
String("break"), group.basics.testLexBreak(), group.basics.optWS(),
Optional(group.basics.identifier()).label("identifier"),
Ch(';'), group.basics.optWS(),
set(actions.createBreak(value("identifier"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.16">JLS section 14.16</a>
*/
public Rule continueStatement() {
return Sequence(
String("continue"), group.basics.testLexBreak(), group.basics.optWS(),
Optional(group.basics.identifier()).label("identifier"),
Ch(';'), group.basics.optWS(),
set(actions.createContinue(value("identifier"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.17">JLS section 14.17</a>
*/
public Rule returnStatement() {
return Sequence(
String("return"), group.basics.testLexBreak(), group.basics.optWS(),
Optional(group.expressions.anyExpression()).label("value"),
Ch(';'), group.basics.optWS(),
set(actions.createReturn(value("value"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.18">JLS section 14.18</a>
*/
public Rule throwStatement() {
return Sequence(
String("throw"), group.basics.testLexBreak(), group.basics.optWS(),
group.expressions.anyExpression().label("throwable"),
Ch(';'), group.basics.optWS(),
set(actions.createThrow(value("throwable"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.19">JLS section 14.19</a>
*/
public Rule synchronizedStatement() {
return Sequence(
String("synchronized"), group.basics.testLexBreak(), group.basics.optWS(),
Ch('('), group.basics.optWS(),
group.expressions.anyExpression().label("lock"),
Ch(')'), group.basics.optWS(),
blockStatement().label("body"),
set(actions.createSynchronizedStatement(value("lock"), value("body"))));
}
/**
* @see <a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20">JLS section 14.20</a>
*/
public Rule tryStatement() {
return Sequence(
String("try"), group.basics.testLexBreak(), group.basics.optWS(),
blockStatement().label("body"),
ZeroOrMore(catchBlock().label("catchBlock")),
Optional(Sequence(
String("finally"), group.basics.testLexBreak(), group.basics.optWS(),
blockStatement().label("finallyBody"))),
set(actions.createTryStatement(value("body"), values("ZeroOrMore/catchBlock"), value("Optional/Sequence/finallyBody"))));
}
Rule catchBlock() {
return Sequence(
String("catch"), group.basics.testLexBreak(), group.basics.optWS(),
Ch('('), group.basics.optWS(),
group.structures.variableDefinitionModifiers().label("modifiers"),
group.types.type().label("type"),
group.basics.identifier().label("varName"),
Ch(')'), group.basics.optWS(),
blockStatement().label("body"),
set(actions.createCatch(value("modifiers"), value("type"), value("varName"), value("body"))));
}
}