summaryrefslogtreecommitdiff
path: root/JPratt/src/examples/java
diff options
context:
space:
mode:
Diffstat (limited to 'JPratt/src/examples/java')
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/AssignCommand.java11
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/BlockEnter.java12
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/BlockExit.java2
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/PrattParserTest.java144
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/SwitchCommand.java8
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/TestContext.java2
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/Tokenizer.java43
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/VarCommand.java10
8 files changed, 128 insertions, 104 deletions
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/AssignCommand.java b/JPratt/src/examples/java/bjc/pratt/examples/AssignCommand.java
index 45aac1a..f3cc003 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/AssignCommand.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/AssignCommand.java
@@ -9,14 +9,15 @@ import bjc.utils.data.Tree;
import bjc.utils.parserutils.ParserException;
class AssignCommand extends NonBinaryCommand<String, String, TestContext> {
- public AssignCommand(int prec) {
+ public AssignCommand(final int prec) {
super(prec);
}
@Override
- public ITree<Token<String, String>> denote(ITree<Token<String, String>> operand, Token<String, String> operator,
- ParserContext<String, String, TestContext> ctx) throws ParserException {
- Token<String, String> name = operand.getHead();
+ public ITree<Token<String, String>> denote(final ITree<Token<String, String>> operand,
+ final Token<String, String> operator, final ParserContext<String, String, TestContext> ctx)
+ throws ParserException {
+ final Token<String, String> name = operand.getHead();
switch (name.getKey()) {
case "(literal)":
@@ -26,7 +27,7 @@ class AssignCommand extends NonBinaryCommand<String, String, TestContext> {
throw new ParserException("Variable name must be simple");
}
- ITree<Token<String, String>> body = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
+ final ITree<Token<String, String>> body = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
ctx.state.scopes.top().putKey(name.getValue(), body);
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/BlockEnter.java b/JPratt/src/examples/java/bjc/pratt/examples/BlockEnter.java
index 67e560c..092c6b2 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/BlockEnter.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/BlockEnter.java
@@ -1,19 +1,19 @@
package bjc.pratt.examples;
+import java.util.function.UnaryOperator;
+
import bjc.pratt.Token;
import bjc.utils.data.ITree;
import bjc.utils.esodata.Directory;
import bjc.utils.esodata.Stack;
-import java.util.function.UnaryOperator;
-
final class BlockEnter implements UnaryOperator<TestContext> {
@Override
- public TestContext apply(TestContext state) {
- Directory<String, ITree<Token<String, String>>> enclosing = state.scopes.top();
- Stack<Integer> blockCount = state.blockCount;
+ public TestContext apply(final TestContext state) {
+ final Directory<String, ITree<Token<String, String>>> enclosing = state.scopes.top();
+ final Stack<Integer> blockCount = state.blockCount;
- int currBlockNumber = blockCount.pop();
+ final int currBlockNumber = blockCount.pop();
state.scopes.push(enclosing.newSubdirectory("block" + currBlockNumber));
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/BlockExit.java b/JPratt/src/examples/java/bjc/pratt/examples/BlockExit.java
index 1cca6d5..ea9526d 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/BlockExit.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/BlockExit.java
@@ -4,7 +4,7 @@ import java.util.function.UnaryOperator;
final class BlockExit implements UnaryOperator<TestContext> {
@Override
- public TestContext apply(TestContext state) {
+ public TestContext apply(final TestContext state) {
state.scopes.pop();
state.blockCount.pop();
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/PrattParserTest.java b/JPratt/src/examples/java/bjc/pratt/examples/PrattParserTest.java
index b7d31eb..e504048 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/PrattParserTest.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/PrattParserTest.java
@@ -1,5 +1,30 @@
package bjc.pratt.examples;
+import static bjc.pratt.commands.InitialCommands.delimited;
+import static bjc.pratt.commands.InitialCommands.grouping;
+import static bjc.pratt.commands.InitialCommands.leaf;
+import static bjc.pratt.commands.InitialCommands.preTernary;
+import static bjc.pratt.commands.InitialCommands.unary;
+import static bjc.pratt.commands.NonInitialCommands.chain;
+import static bjc.pratt.commands.NonInitialCommands.infixLeft;
+import static bjc.pratt.commands.NonInitialCommands.infixNon;
+import static bjc.pratt.commands.NonInitialCommands.infixRight;
+import static bjc.pratt.commands.NonInitialCommands.postCircumfix;
+import static bjc.pratt.commands.NonInitialCommands.postfix;
+import static bjc.pratt.commands.NonInitialCommands.ternary;
+import static bjc.pratt.tokens.StringToken.litToken;
+import static bjc.utils.functypes.ID.id;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Scanner;
+import java.util.Set;
+import java.util.function.UnaryOperator;
+
import bjc.pratt.InitialCommand;
import bjc.pratt.NonInitialCommand;
import bjc.pratt.PrattParser;
@@ -14,39 +39,24 @@ import bjc.utils.parserutils.splitterv2.ConfigurableTokenSplitter;
import bjc.utils.parserutils.splitterv2.ExcludingTokenSplitter;
import bjc.utils.parserutils.splitterv2.TokenSplitter;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Scanner;
-import java.util.Set;
-import java.util.function.UnaryOperator;
-
-import static bjc.pratt.commands.InitialCommands.*;
-import static bjc.pratt.commands.NonInitialCommands.*;
-import static bjc.pratt.tokens.StringToken.litToken;
-import static bjc.utils.functypes.ID.id;
-
/**
* Simple test for Pratt parser.
- *
+ *
* @author EVE
*
*/
public class PrattParserTest {
/**
* Main method.
- *
+ *
* @param args
* Unused CLI arguments.
*/
- public static void main(String[] args) {
+ public static void main(final String[] args) {
/*
* Use a linked hash set to preserve insertion order.
*/
- Set<String> ops = new LinkedHashSet<>();
+ final Set<String> ops = new LinkedHashSet<>();
ops.add("!!!");
@@ -55,7 +65,7 @@ public class PrattParserTest {
ops.addAll(Arrays.asList("||", "&&"));
ops.addAll(Arrays.asList("<=", ">="));
- ops.addAll(Arrays.asList("±"));
+ ops.addAll(Arrays.asList("�"));
ops.addAll(Arrays.asList(".", ",", ";", ":"));
ops.addAll(Arrays.asList("=", "<", ">"));
ops.addAll(Arrays.asList("+", "-", "*", "/"));
@@ -67,7 +77,7 @@ public class PrattParserTest {
/*
* Reserved words that represent themselves, not literals.
*/
- Set<String> reserved = new LinkedHashSet<>();
+ final Set<String> reserved = new LinkedHashSet<>();
reserved.addAll(Arrays.asList("if", "then", "else"));
reserved.addAll(Arrays.asList("and", "or"));
reserved.addAll(Arrays.asList("begin", "end"));
@@ -75,17 +85,17 @@ public class PrattParserTest {
reserved.addAll(Arrays.asList("sqrt", "cbrt", "root"));
reserved.add("var");
- ChainTokenSplitter nsplit = new ChainTokenSplitter();
+ final ChainTokenSplitter nsplit = new ChainTokenSplitter();
- ConfigurableTokenSplitter hi = new ConfigurableTokenSplitter(true);
- ConfigurableTokenSplitter lo = new ConfigurableTokenSplitter(true);
+ final ConfigurableTokenSplitter hi = new ConfigurableTokenSplitter(true);
+ final ConfigurableTokenSplitter lo = new ConfigurableTokenSplitter(true);
hi.addSimpleDelimiters("->");
hi.addSimpleDelimiters(":=");
hi.addSimpleDelimiters("||", "&&");
hi.addSimpleDelimiters("<=", ">=");
- lo.addSimpleDelimiters("±");
+ lo.addSimpleDelimiters("�");
lo.addSimpleDelimiters(".", ",", ";", ":");
lo.addSimpleDelimiters("=", "<", ">");
lo.addSimpleDelimiters("+", "-", "*", "/");
@@ -101,38 +111,40 @@ public class PrattParserTest {
nsplit.appendSplitters(hi, lo);
- ExcludingTokenSplitter excluder = new ExcludingTokenSplitter(nsplit);
+ final ExcludingTokenSplitter excluder = new ExcludingTokenSplitter(nsplit);
excluder.addLiteralExclusions(reserved.toArray(new String[0]));
- PrattParser<String, String, TestContext> parser = createParser();
+ final PrattParser<String, String, TestContext> parser = createParser();
- TestContext ctx = new TestContext();
+ final TestContext ctx = new TestContext();
- Scanner scn = new Scanner(System.in);
+ final Scanner scn = new Scanner(System.in);
System.out.print("Enter a command (blank line to exit): ");
String ln = scn.nextLine();
while (!ln.trim().equals("")) {
- Iterator<Token<String, String>> tokens = preprocessInput(ops, excluder, ln, reserved, ctx);
+ final Iterator<Token<String, String>> tokens = preprocessInput(ops, excluder, ln, reserved,
+ ctx);
try {
- StringTokenStream tokenStream = new StringTokenStream(tokens);
+ final StringTokenStream tokenStream = new StringTokenStream(tokens);
/*
* Prime stream.
*/
tokenStream.next();
- ITree<Token<String, String>> tree = parser.parseExpression(0, tokenStream, ctx, true);
+ final ITree<Token<String, String>> tree = parser.parseExpression(0, tokenStream, ctx,
+ true);
if (!tokenStream.headIs("(end)")) {
System.out.println("\nMultiple expressions on line");
}
System.out.println("\nParsed expression:\n" + tree);
- } catch (ParserException pex) {
+ } catch (final ParserException pex) {
pex.printStackTrace();
}
@@ -146,16 +158,16 @@ public class PrattParserTest {
scn.close();
}
- private static Iterator<Token<String, String>> preprocessInput(Set<String> ops, TokenSplitter split, String ln,
- Set<String> reserved, TestContext ctx) {
- String[] rawTokens = ln.split("\\s+");
+ private static Iterator<Token<String, String>> preprocessInput(final Set<String> ops, final TokenSplitter split,
+ final String ln, final Set<String> reserved, final TestContext ctx) {
+ final String[] rawTokens = ln.split("\\s+");
- List<String> splitTokens = new LinkedList<>();
+ final List<String> splitTokens = new LinkedList<>();
- for (String raw : rawTokens) {
+ for (final String raw : rawTokens) {
boolean doSplit = false;
- for (String op : ops) {
+ for (final String op : ops) {
if (raw.contains(op)) {
doSplit = true;
break;
@@ -163,7 +175,7 @@ public class PrattParserTest {
}
if (doSplit) {
- String[] strangs = split.split(raw).toArray(new String[0]);
+ final String[] strangs = split.split(raw).toArray(new String[0]);
splitTokens.addAll(Arrays.asList(strangs));
} else {
@@ -173,11 +185,11 @@ public class PrattParserTest {
System.out.println("\nSplit string: " + splitTokens);
- Iterator<String> source = splitTokens.iterator();
+ final Iterator<String> source = splitTokens.iterator();
- Tokenizer tokenzer = new Tokenizer(ops, reserved, ctx);
+ final Tokenizer tokenzer = new Tokenizer(ops, reserved, ctx);
- Iterator<Token<String, String>> tokens = new TransformIterator<>(source, tokenzer);
+ final Iterator<Token<String, String>> tokens = new TransformIterator<>(source, tokenzer);
return tokens;
}
@@ -186,86 +198,88 @@ public class PrattParserTest {
/*
* Set of which relational operators chain with each other.
*/
- HashSet<String> relChain = new HashSet<>();
+ final HashSet<String> relChain = new HashSet<>();
relChain.addAll(Arrays.asList("=", "<", ">", "<=", ">="));
/*
* Token for marking chains.
*/
- StringToken chainToken = litToken("and");
+ final StringToken chainToken = litToken("and");
/*
* ID function.
*/
- UnaryOperator<TestContext> idfun = id();
+ final UnaryOperator<TestContext> idfun = id();
- PrattParser<String, String, TestContext> parser = new PrattParser<>();
+ final PrattParser<String, String, TestContext> parser = new PrattParser<>();
parser.addNonInitialCommand("!!!", postfix(0));
parser.addNonInitialCommand(":", infixNon(3));
- NonInitialCommand<String, String, TestContext> ifElse = ternary(5, 0, "else", litToken("cond"), false);
+ final NonInitialCommand<String, String, TestContext> ifElse = ternary(5, 0, "else", litToken("cond"),
+ false);
parser.addNonInitialCommand("if", ifElse);
parser.addNonInitialCommand(":=", new AssignCommand(10));
parser.addNonInitialCommand("->", infixRight(11));
- NonInitialCommand<String, String, TestContext> nonSSRelJoin = infixLeft(13);
+ final NonInitialCommand<String, String, TestContext> nonSSRelJoin = infixLeft(13);
parser.addNonInitialCommand("and", nonSSRelJoin);
parser.addNonInitialCommand("or", nonSSRelJoin);
- NonInitialCommand<String, String, TestContext> chainRelOp = chain(15, relChain, chainToken);
+ final NonInitialCommand<String, String, TestContext> chainRelOp = chain(15, relChain, chainToken);
parser.addNonInitialCommand("=", chainRelOp);
parser.addNonInitialCommand("<", chainRelOp);
parser.addNonInitialCommand(">", chainRelOp);
parser.addNonInitialCommand("<=", chainRelOp);
parser.addNonInitialCommand(">=", chainRelOp);
- NonInitialCommand<String, String, TestContext> ssRelJoin = infixRight(17);
+ final NonInitialCommand<String, String, TestContext> ssRelJoin = infixRight(17);
parser.addNonInitialCommand("&&", ssRelJoin);
parser.addNonInitialCommand("||", ssRelJoin);
- NonInitialCommand<String, String, TestContext> addSub = infixLeft(20);
+ final NonInitialCommand<String, String, TestContext> addSub = infixLeft(20);
parser.addNonInitialCommand("+", addSub);
parser.addNonInitialCommand("-", addSub);
- parser.addNonInitialCommand("±", addSub);
+ parser.addNonInitialCommand("�", addSub);
- NonInitialCommand<String, String, TestContext> mulDiv = infixLeft(30);
+ final NonInitialCommand<String, String, TestContext> mulDiv = infixLeft(30);
parser.addNonInitialCommand("*", mulDiv);
parser.addNonInitialCommand("/", mulDiv);
parser.addNonInitialCommand("!", postfix(40));
- NonInitialCommand<String, String, TestContext> expon = infixRight(50);
+ final NonInitialCommand<String, String, TestContext> expon = infixRight(50);
parser.addNonInitialCommand("^", expon);
parser.addNonInitialCommand("root", expon);
- NonInitialCommand<String, String, TestContext> superexpon = postfix(50);
+ final NonInitialCommand<String, String, TestContext> superexpon = postfix(50);
parser.addNonInitialCommand("(superexp)", superexpon);
parser.addNonInitialCommand(".", infixLeft(60));
- NonInitialCommand<String, String, TestContext> arrayIdx = postCircumfix(60, 0, "]", litToken("idx"));
+ final NonInitialCommand<String, String, TestContext> arrayIdx = postCircumfix(60, 0, "]",
+ litToken("idx"));
parser.addNonInitialCommand("[", arrayIdx);
- InitialCommand<String, String, TestContext> ifThenElse = preTernary(0, 0, 0, "then", "else",
+ final InitialCommand<String, String, TestContext> ifThenElse = preTernary(0, 0, 0, "then", "else",
litToken("ifelse"));
parser.addInitialCommand("if", ifThenElse);
- InitialCommand<String, String, TestContext> parens = grouping(0, ")", litToken("parens"));
+ final InitialCommand<String, String, TestContext> parens = grouping(0, ")", litToken("parens"));
parser.addInitialCommand("(", parens);
- InitialCommand<String, String, TestContext> scoper = delimited(0, ";", "end", litToken("block"),
+ final InitialCommand<String, String, TestContext> scoper = delimited(0, ";", "end", litToken("block"),
new BlockEnter(), idfun, new BlockExit(), true);
parser.addInitialCommand("begin", scoper);
- InitialCommand<String, String, TestContext> arrayLiteral = delimited(0, ",", "]", litToken("array"),
- idfun, idfun, idfun, false);
+ final InitialCommand<String, String, TestContext> arrayLiteral = delimited(0, ",", "]",
+ litToken("array"), idfun, idfun, idfun, false);
parser.addInitialCommand("[", arrayLiteral);
- InitialCommand<String, String, TestContext> jsonLiteral = delimited(0, ",", "}", litToken("json"),
+ final InitialCommand<String, String, TestContext> jsonLiteral = delimited(0, ",", "}", litToken("json"),
idfun, idfun, idfun, false);
parser.addInitialCommand("{", jsonLiteral);
@@ -273,11 +287,11 @@ public class PrattParserTest {
parser.addInitialCommand("-", unary(30));
- InitialCommand<String, String, TestContext> root = unary(50);
+ final InitialCommand<String, String, TestContext> root = unary(50);
parser.addInitialCommand("sqrt", root);
parser.addInitialCommand("cbrt", root);
- InitialCommand<String, String, TestContext> leaf = leaf();
+ final InitialCommand<String, String, TestContext> leaf = leaf();
parser.addInitialCommand("(literal)", leaf);
parser.addInitialCommand("(vref)", leaf);
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/SwitchCommand.java b/JPratt/src/examples/java/bjc/pratt/examples/SwitchCommand.java
index 4a5bd22..6c4e2b6 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/SwitchCommand.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/SwitchCommand.java
@@ -10,11 +10,11 @@ import bjc.utils.parserutils.ParserException;
class SwitchCommand implements InitialCommand<String, String, TestContext> {
@Override
- public ITree<Token<String, String>> denote(Token<String, String> operator,
- ParserContext<String, String, TestContext> ctx) throws ParserException {
- ITree<Token<String, String>> object = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
+ public ITree<Token<String, String>> denote(final Token<String, String> operator,
+ final ParserContext<String, String, TestContext> ctx) throws ParserException {
+ final ITree<Token<String, String>> object = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
- ITree<Token<String, String>> body = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
+ final ITree<Token<String, String>> body = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
return new Tree<>(new StringToken("switch", "switch"), object, body);
}
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/TestContext.java b/JPratt/src/examples/java/bjc/pratt/examples/TestContext.java
index b5e8448..e5583b4 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/TestContext.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/TestContext.java
@@ -9,7 +9,7 @@ import bjc.utils.esodata.Stack;
/**
* Simple context for the parser.
- *
+ *
* @author EVE
*
*/
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/Tokenizer.java b/JPratt/src/examples/java/bjc/pratt/examples/Tokenizer.java
index 0fccc60..9b3fa74 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/Tokenizer.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/Tokenizer.java
@@ -1,37 +1,46 @@
package bjc.pratt.examples;
-import bjc.pratt.Token;
-import bjc.pratt.tokens.StringToken;
+import static bjc.pratt.tokens.StringToken.litToken;
import java.util.Set;
import java.util.function.Function;
-import static bjc.pratt.tokens.StringToken.litToken;
+import bjc.pratt.Token;
+import bjc.pratt.tokens.StringToken;
final class Tokenizer implements Function<String, Token<String, String>> {
- private Set<String> ops;
- private Set<String> reserved;
- private TestContext ctx;
+ private final Set<String> ops;
+ private final Set<String> reserved;
+ private final TestContext ctx;
- public Tokenizer(Set<String> operators, Set<String> reservedWords, TestContext context) {
+ public Tokenizer(final Set<String> operators, final Set<String> reservedWords, final TestContext context) {
ops = operators;
reserved = reservedWords;
ctx = context;
}
@Override
- public Token<String, String> apply(String strang) {
- if (ops.contains(strang) || reserved.contains(strang)) {
+ public Token<String, String> apply(final String strang) {
+ if (ops.contains(strang) || reserved.contains(strang))
return litToken(strang);
- } else if (ctx.scopes.top().containsKey(strang)) {
+ else if (ctx.scopes.top().containsKey(strang))
return new StringToken("(vref)", strang);
- } else if(strang.matches("(?:[\\u00B2\\u00B3\\u00B9\\u2070]|[\\u2074-\\u2079])+")) {
- /*
- * This regular expression matches series of unicode super-scripts 1-9.
- */
+ else if (strang.matches("(?:[\\u00B2\\u00B3\\u00B9\\u2070]|[\\u2074-\\u2079])+")) /*
+ * This
+ * regular
+ * expression
+ * matches
+ * series
+ * of
+ * unicode
+ * super
+ * -
+ * scripts
+ * 1
+ * -
+ * 9.
+ */
return new StringToken("(superexp)", strang);
- } else {
- return new StringToken("(literal)", strang);
- }
+ else return new StringToken("(literal)", strang);
}
}
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/VarCommand.java b/JPratt/src/examples/java/bjc/pratt/examples/VarCommand.java
index dd04a59..a194b72 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/VarCommand.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/VarCommand.java
@@ -11,11 +11,11 @@ import bjc.utils.parserutils.ParserException;
class VarCommand extends AbstractInitialCommand<String, String, TestContext> {
@Override
- protected ITree<Token<String, String>> intNullDenotation(Token<String, String> operator,
- ParserContext<String, String, TestContext> ctx) throws ParserException {
- Token<String, String> name = ctx.tokens.current();
+ protected ITree<Token<String, String>> intNullDenotation(final Token<String, String> operator,
+ final ParserContext<String, String, TestContext> ctx) throws ParserException {
+ final Token<String, String> name = ctx.tokens.current();
- switch(name.getKey()) {
+ switch (name.getKey()) {
case "(literal)":
case "(vref)":
ctx.tokens.next();
@@ -26,7 +26,7 @@ class VarCommand extends AbstractInitialCommand<String, String, TestContext> {
ctx.tokens.expect("=");
- ITree<Token<String, String>> body = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
+ final ITree<Token<String, String>> body = ctx.parse.parseExpression(0, ctx.tokens, ctx.state, false);
ctx.state.scopes.top().putKey(name.getValue(), body);