From cc04459cfee92905a635c36958d66f0edb25a257 Mon Sep 17 00:00:00 2001 From: Adela Vais Date: Thu, 10 Dec 2020 23:27:53 +0200 Subject: [PATCH] d: reduce verbosity for returning the location from yylex() * examples/d/calc/calc.y (start, end): Replace by this... (location): new member variable in the Lexer class. Use it. * tests/calc.at: Use the defined location variable. --- examples/d/calc/calc.y | 41 ++++++++++++++++++++--------------------- tests/calc.at | 28 ++++++++++++++-------------- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/examples/d/calc/calc.y b/examples/d/calc/calc.y index 8bf55fd4..c9a7df96 100644 --- a/examples/d/calc/calc.y +++ b/examples/d/calc/calc.y @@ -95,8 +95,7 @@ if (isInputRange!R && is(ElementType!R : dchar)) this(R r) { input = r; } - YYPosition start; - YYPosition end; + YYLocation location; // Should be a local in main, shared with %parse-param. int exit_status = 0; @@ -121,13 +120,13 @@ if (isInputRange!R && is(ElementType!R : dchar)) // Skip initial spaces while (!input.empty && input.front != '\n' && isWhite(input.front)) { - start = end; - end.column++; + location.begin = location.end; + location.end.column++; input.popFront; } if (input.empty) - return Symbol(TokenKind.YYEOF, YYLocation(startPos, endPos)); + return Symbol(TokenKind.YYEOF, location); // Numbers. if (input.front.isNumber) @@ -141,29 +140,29 @@ if (isInputRange!R && is(ElementType!R : dchar)) lenChars++; copy.popFront; } - start = end; - end.column += lenChars; - return Symbol(TokenKind.NUM, semanticVal_.ival, YYLocation(startPos, endPos)); + location.begin = location.end; + location.end.column += lenChars; + return Symbol(TokenKind.NUM, semanticVal_.ival, location); } // Individual characters auto ch = input.front; input.popFront; - start = end; - end.column++; + location.begin = location.end; + location.end.column++; switch (ch) { - case '+': return Symbol(TokenKind.PLUS, YYLocation(startPos, endPos)); - case '-': return Symbol(TokenKind.MINUS, YYLocation(startPos, endPos)); - case '*': return Symbol(TokenKind.STAR, YYLocation(startPos, endPos)); - case '/': return Symbol(TokenKind.SLASH, YYLocation(startPos, endPos)); - case '(': return Symbol(TokenKind.LPAR, YYLocation(startPos, endPos)); - case ')': return Symbol(TokenKind.RPAR, YYLocation(startPos, endPos)); + case '+': return Symbol(TokenKind.PLUS, location); + case '-': return Symbol(TokenKind.MINUS, location); + case '*': return Symbol(TokenKind.STAR, location); + case '/': return Symbol(TokenKind.SLASH, location); + case '(': return Symbol(TokenKind.LPAR, location); + case ')': return Symbol(TokenKind.RPAR, location); case '\n': { - end.line++; - end.column = 1; - return Symbol(TokenKind.EOL, YYLocation(startPos, endPos)); + location.end.line++; + location.end.column = 1; + return Symbol(TokenKind.EOL, location); } default: assert(0); } @@ -171,12 +170,12 @@ if (isInputRange!R && is(ElementType!R : dchar)) YYPosition startPos() const { - return start; + return location.begin; } YYPosition endPos() const { - return end; + return location.end; } } diff --git a/tests/calc.at b/tests/calc.at index 1c51d58a..9abf263d 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -606,13 +606,13 @@ class CalcLexer(R) : Lexer // EOF. if (input.empty) - return Symbol(TokenKind.]AT_TOKEN_PREFIX[EOF]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); + return Symbol(TokenKind.]AT_TOKEN_PREFIX[EOF]AT_LOCATION_IF([[, location]])[); // Numbers. if (input.front.isNumber) { semanticVal_.ival = parseInt; - return Symbol(TokenKind.]AT_TOKEN_PREFIX[NUM, semanticVal_.ival]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); + return Symbol(TokenKind.]AT_TOKEN_PREFIX[NUM, semanticVal_.ival]AT_LOCATION_IF([[, location]])[); } // Individual characters @@ -630,22 +630,22 @@ class CalcLexer(R) : Lexer if (c == '#') { stderr.writeln (]AT_LOCATION_IF([location, ": ", ])["syntax error: invalid character: '#'"); - return Symbol(TokenKind.]AT_TOKEN_PREFIX[YYerror]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); + return Symbol(TokenKind.]AT_TOKEN_PREFIX[YYerror]AT_LOCATION_IF([[, location]])[); } switch (c) { - case '+': return Symbol(TokenKind.]AT_TOKEN_PREFIX[PLUS]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); - case '-': return Symbol(TokenKind.]AT_TOKEN_PREFIX[MINUS]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); - case '*': return Symbol(TokenKind.]AT_TOKEN_PREFIX[STAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); - case '/': return Symbol(TokenKind.]AT_TOKEN_PREFIX[SLASH]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); - case '(': return Symbol(TokenKind.]AT_TOKEN_PREFIX[LPAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); - case ')': return Symbol(TokenKind.]AT_TOKEN_PREFIX[RPAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); - case '\n': return Symbol(TokenKind.]AT_TOKEN_PREFIX[EOL]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); - case '=': return Symbol(TokenKind.]AT_TOKEN_PREFIX[EQUAL]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); - case '^': return Symbol(TokenKind.]AT_TOKEN_PREFIX[POW]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); - case '!': return Symbol(TokenKind.]AT_TOKEN_PREFIX[NOT]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); - default: return Symbol(TokenKind.]AT_TOKEN_PREFIX[YYUNDEF]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); + case '+': return Symbol(TokenKind.]AT_TOKEN_PREFIX[PLUS]AT_LOCATION_IF([[, location]])[); + case '-': return Symbol(TokenKind.]AT_TOKEN_PREFIX[MINUS]AT_LOCATION_IF([[, location]])[); + case '*': return Symbol(TokenKind.]AT_TOKEN_PREFIX[STAR]AT_LOCATION_IF([[, location]])[); + case '/': return Symbol(TokenKind.]AT_TOKEN_PREFIX[SLASH]AT_LOCATION_IF([[, location]])[); + case '(': return Symbol(TokenKind.]AT_TOKEN_PREFIX[LPAR]AT_LOCATION_IF([[, location]])[); + case ')': return Symbol(TokenKind.]AT_TOKEN_PREFIX[RPAR]AT_LOCATION_IF([[, location]])[); + case '\n': return Symbol(TokenKind.]AT_TOKEN_PREFIX[EOL]AT_LOCATION_IF([[, location]])[); + case '=': return Symbol(TokenKind.]AT_TOKEN_PREFIX[EQUAL]AT_LOCATION_IF([[, location]])[); + case '^': return Symbol(TokenKind.]AT_TOKEN_PREFIX[POW]AT_LOCATION_IF([[, location]])[); + case '!': return Symbol(TokenKind.]AT_TOKEN_PREFIX[NOT]AT_LOCATION_IF([[, location]])[); + default: return Symbol(TokenKind.]AT_TOKEN_PREFIX[YYUNDEF]AT_LOCATION_IF([[, location]])[); } } } -- 2.11.4.GIT