// Path: Kaiper-AST/src/main/java/xyz/avarel/kaiper/ast/flow/ReturnExpr.java
// public class ReturnExpr extends Single {
//     private final Single expr;
// 
//     public ReturnExpr(Position position, Single expr) {
//         super(position);
//         this.expr = expr;
//     }
// 
//     public Single getExpr() {
//         return expr;
//     }
// 
//     @Override
//     public <R, C> R accept(ExprVisitor<R, C> visitor, C scope) {
//         return visitor.visit(this, scope);
//     }
// 
//     @Override
//     public void ast(StringBuilder builder, String indent, boolean isTail) {
//         expr.ast("return", builder, indent, true);
//     }
// }
// 
// Path: Kaiper-AST/src/main/java/xyz/avarel/kaiper/ast/value/NullNode.java
// public class NullNode extends Single {
//     public static final NullNode VALUE = new NullNode();
// 
//     private NullNode() {
//         super(null);
//     }
// 
//     @Override
//     public <R, C> R accept(ExprVisitor<R, C> visitor, C scope) {
//         return visitor.visit(this, scope);
//     }
// }
// 
// Path: Kaiper-AST/src/main/java/xyz/avarel/kaiper/lexer/TokenType.java
// public enum TokenType {
//     // PAIRS
//     LEFT_PAREN,
//     RIGHT_PAREN,
// 
//     LEFT_BRACKET,
//     RIGHT_BRACKET,
// 
//     LEFT_BRACE,
//     RIGHT_BRACE,
// 
//     OPTIONAL_ASSIGN,
//     ELVIS,
// 
//     // ASSIGNMENT
//     ASSIGN,
// 
//     // TYPES
//     INT,
//     NUMBER,
//     BOOLEAN,
//     FUNCTION,
//     STRING,
//     ATOM,
// 
//     // ARITHMETIC
//     PLUS,
//     MINUS,
//     ASTERISK,
//     SLASH,
//     BACKSLASH,
//     CARET,
//     PERCENT,
// 
//     // RELATIONAL
//     EQUALS,
//     NOT_EQUAL,
//     GT,
//     GTE,
//     LT,
//     LTE,
//     OR,
//     AND,
// 
//     // BOOLEAN
//     AMPERSAND,
//     VERTICAL_BAR,
// 
//     // MISC
//     REST,
//     RANGE_TO,
//     PIPE_FORWARD,
//     PIPE_BACKWARD,
//     SHIFT_RIGHT,
//     SHIFT_LEFT,
//     ARROW,
//     TILDE,
//     BANG,
//     QUESTION,
//     COLON,
//     COMMA,
//     DOT,
// 
//     UNDERSCORE,
// 
//     // SCRIPT
//     MODULE,
//     TYPE,
//     IDENTIFIER,
//     NULL,
//     LET,
//     RETURN,
//     IF,
//     ELSE,
//     FOR,
// 
//     LINE,
//     EOF,
// }


import xyz.avarel.kaiper.ast.Expr;
import xyz.avarel.kaiper.ast.Single;
import xyz.avarel.kaiper.ast.flow.ReturnExpr;
import xyz.avarel.kaiper.ast.value.NullNode;
import xyz.avarel.kaiper.exceptions.SyntaxException;
import xyz.avarel.kaiper.lexer.Token;
import xyz.avarel.kaiper.lexer.TokenType;
import xyz.avarel.kaiper.parser.KaiperParser;
import xyz.avarel.kaiper.parser.PrefixParser;
/*
 * Licensed under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package xyz.avarel.kaiper.parser.parslets.flow;


public class ReturnParser implements PrefixParser {
    @Override
    public Expr parse(KaiperParser parser, Token token) {
        if (!parser.getParserFlags().allowControlFlows()) {
            throw new SyntaxException("Control flows are disabled");
        }

        Single expr;
// Path: Kaiper-AST/src/main/java/xyz/avarel/kaiper/ast/flow/ReturnExpr.java
// public class ReturnExpr extends Single {
//     private final Single expr;
// 
//     public ReturnExpr(Position position, Single expr) {
//         super(position);
//         this.expr = expr;
//     }
// 
//     public Single getExpr() {
//         return expr;
//     }
// 
//     @Override
//     public <R, C> R accept(ExprVisitor<R, C> visitor, C scope) {
//         return visitor.visit(this, scope);
//     }
// 
//     @Override
//     public void ast(StringBuilder builder, String indent, boolean isTail) {
//         expr.ast("return", builder, indent, true);
//     }
// }
// 
// Path: Kaiper-AST/src/main/java/xyz/avarel/kaiper/ast/value/NullNode.java
// public class NullNode extends Single {
//     public static final NullNode VALUE = new NullNode();
// 
//     private NullNode() {
//         super(null);
//     }
// 
//     @Override
//     public <R, C> R accept(ExprVisitor<R, C> visitor, C scope) {
//         return visitor.visit(this, scope);
//     }
// }
// 
// Path: Kaiper-AST/src/main/java/xyz/avarel/kaiper/lexer/TokenType.java
// public enum TokenType {
//     // PAIRS
//     LEFT_PAREN,
//     RIGHT_PAREN,
// 
//     LEFT_BRACKET,
//     RIGHT_BRACKET,
// 
//     LEFT_BRACE,
//     RIGHT_BRACE,
// 
//     OPTIONAL_ASSIGN,
//     ELVIS,
// 
//     // ASSIGNMENT
//     ASSIGN,
// 
//     // TYPES
//     INT,
//     NUMBER,
//     BOOLEAN,
//     FUNCTION,
//     STRING,
//     ATOM,
// 
//     // ARITHMETIC
//     PLUS,
//     MINUS,
//     ASTERISK,
//     SLASH,
//     BACKSLASH,
//     CARET,
//     PERCENT,
// 
//     // RELATIONAL
//     EQUALS,
//     NOT_EQUAL,
//     GT,
//     GTE,
//     LT,
//     LTE,
//     OR,
//     AND,
// 
//     // BOOLEAN
//     AMPERSAND,
//     VERTICAL_BAR,
// 
//     // MISC
//     REST,
//     RANGE_TO,
//     PIPE_FORWARD,
//     PIPE_BACKWARD,
//     SHIFT_RIGHT,
//     SHIFT_LEFT,
//     ARROW,
//     TILDE,
//     BANG,
//     QUESTION,
//     COLON,
//     COMMA,
//     DOT,
// 
//     UNDERSCORE,
// 
//     // SCRIPT
//     MODULE,
//     TYPE,
//     IDENTIFIER,
//     NULL,
//     LET,
//     RETURN,
//     IF,
//     ELSE,
//     FOR,
// 
//     LINE,
//     EOF,
// }


// Path: Kaiper-AST/src/main/java/xyz/avarel/kaiper/parser/parslets/flow/ReturnParser.java
import xyz.avarel.kaiper.ast.Expr;
import xyz.avarel.kaiper.ast.Single;
import xyz.avarel.kaiper.ast.flow.ReturnExpr;
import xyz.avarel.kaiper.ast.value.NullNode;
import xyz.avarel.kaiper.exceptions.SyntaxException;
import xyz.avarel.kaiper.lexer.Token;
import xyz.avarel.kaiper.lexer.TokenType;
import xyz.avarel.kaiper.parser.KaiperParser;
import xyz.avarel.kaiper.parser.PrefixParser;

/*
 * Licensed under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package xyz.avarel.kaiper.parser.parslets.flow;


public class ReturnParser implements PrefixParser {
    @Override
    public Expr parse(KaiperParser parser, Token token) {
        if (!parser.getParserFlags().allowControlFlows()) {
            throw new SyntaxException("Control flows are disabled");
        }

        Single expr;
        if (parser.nextIsAny(TokenType.LINE, TokenType.RIGHT_BRACE)) {