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.
This commit is contained in:
Adela Vais
2020-12-10 23:27:53 +02:00
committed by Akim Demaille
parent ee4ec08513
commit cc04459cfe
2 changed files with 34 additions and 35 deletions

View File

@@ -95,8 +95,7 @@ if (isInputRange!R && is(ElementType!R : dchar))
this(R r) { input = r; } this(R r) { input = r; }
YYPosition start; YYLocation location;
YYPosition end;
// Should be a local in main, shared with %parse-param. // Should be a local in main, shared with %parse-param.
int exit_status = 0; int exit_status = 0;
@@ -121,13 +120,13 @@ if (isInputRange!R && is(ElementType!R : dchar))
// Skip initial spaces // Skip initial spaces
while (!input.empty && input.front != '\n' && isWhite(input.front)) while (!input.empty && input.front != '\n' && isWhite(input.front))
{ {
start = end; location.begin = location.end;
end.column++; location.end.column++;
input.popFront; input.popFront;
} }
if (input.empty) if (input.empty)
return Symbol(TokenKind.YYEOF, YYLocation(startPos, endPos)); return Symbol(TokenKind.YYEOF, location);
// Numbers. // Numbers.
if (input.front.isNumber) if (input.front.isNumber)
@@ -141,29 +140,29 @@ if (isInputRange!R && is(ElementType!R : dchar))
lenChars++; lenChars++;
copy.popFront; copy.popFront;
} }
start = end; location.begin = location.end;
end.column += lenChars; location.end.column += lenChars;
return Symbol(TokenKind.NUM, semanticVal_.ival, YYLocation(startPos, endPos)); return Symbol(TokenKind.NUM, semanticVal_.ival, location);
} }
// Individual characters // Individual characters
auto ch = input.front; auto ch = input.front;
input.popFront; input.popFront;
start = end; location.begin = location.end;
end.column++; location.end.column++;
switch (ch) switch (ch)
{ {
case '+': return Symbol(TokenKind.PLUS, YYLocation(startPos, endPos)); case '+': return Symbol(TokenKind.PLUS, location);
case '-': return Symbol(TokenKind.MINUS, YYLocation(startPos, endPos)); case '-': return Symbol(TokenKind.MINUS, location);
case '*': return Symbol(TokenKind.STAR, YYLocation(startPos, endPos)); case '*': return Symbol(TokenKind.STAR, location);
case '/': return Symbol(TokenKind.SLASH, YYLocation(startPos, endPos)); case '/': return Symbol(TokenKind.SLASH, location);
case '(': return Symbol(TokenKind.LPAR, YYLocation(startPos, endPos)); case '(': return Symbol(TokenKind.LPAR, location);
case ')': return Symbol(TokenKind.RPAR, YYLocation(startPos, endPos)); case ')': return Symbol(TokenKind.RPAR, location);
case '\n': case '\n':
{ {
end.line++; location.end.line++;
end.column = 1; location.end.column = 1;
return Symbol(TokenKind.EOL, YYLocation(startPos, endPos)); return Symbol(TokenKind.EOL, location);
} }
default: assert(0); default: assert(0);
} }
@@ -171,12 +170,12 @@ if (isInputRange!R && is(ElementType!R : dchar))
YYPosition startPos() const YYPosition startPos() const
{ {
return start; return location.begin;
} }
YYPosition endPos() const YYPosition endPos() const
{ {
return end; return location.end;
} }
} }

View File

@@ -606,13 +606,13 @@ class CalcLexer(R) : Lexer
// EOF. // EOF.
if (input.empty) 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. // Numbers.
if (input.front.isNumber) if (input.front.isNumber)
{ {
semanticVal_.ival = parseInt; 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 // Individual characters
@@ -630,22 +630,22 @@ class CalcLexer(R) : Lexer
if (c == '#') if (c == '#')
{ {
stderr.writeln (]AT_LOCATION_IF([location, ": ", ])["syntax error: invalid character: '#'"); 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) switch (c)
{ {
case '+': return Symbol(TokenKind.]AT_TOKEN_PREFIX[PLUS]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([[, YYLocation(startPos, endPos)]])[); case '-': return Symbol(TokenKind.]AT_TOKEN_PREFIX[MINUS]AT_LOCATION_IF([[, location]])[);
case '*': return Symbol(TokenKind.]AT_TOKEN_PREFIX[STAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); case '*': return Symbol(TokenKind.]AT_TOKEN_PREFIX[STAR]AT_LOCATION_IF([[, location]])[);
case '/': return Symbol(TokenKind.]AT_TOKEN_PREFIX[SLASH]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); case '/': return Symbol(TokenKind.]AT_TOKEN_PREFIX[SLASH]AT_LOCATION_IF([[, location]])[);
case '(': return Symbol(TokenKind.]AT_TOKEN_PREFIX[LPAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); case '(': return Symbol(TokenKind.]AT_TOKEN_PREFIX[LPAR]AT_LOCATION_IF([[, location]])[);
case ')': return Symbol(TokenKind.]AT_TOKEN_PREFIX[RPAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); case ')': return Symbol(TokenKind.]AT_TOKEN_PREFIX[RPAR]AT_LOCATION_IF([[, location]])[);
case '\n': return Symbol(TokenKind.]AT_TOKEN_PREFIX[EOL]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); case '\n': return Symbol(TokenKind.]AT_TOKEN_PREFIX[EOL]AT_LOCATION_IF([[, location]])[);
case '=': return Symbol(TokenKind.]AT_TOKEN_PREFIX[EQUAL]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); case '=': return Symbol(TokenKind.]AT_TOKEN_PREFIX[EQUAL]AT_LOCATION_IF([[, location]])[);
case '^': return Symbol(TokenKind.]AT_TOKEN_PREFIX[POW]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); case '^': return Symbol(TokenKind.]AT_TOKEN_PREFIX[POW]AT_LOCATION_IF([[, location]])[);
case '!': return Symbol(TokenKind.]AT_TOKEN_PREFIX[NOT]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); case '!': return Symbol(TokenKind.]AT_TOKEN_PREFIX[NOT]AT_LOCATION_IF([[, location]])[);
default: return Symbol(TokenKind.]AT_TOKEN_PREFIX[YYUNDEF]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[); default: return Symbol(TokenKind.]AT_TOKEN_PREFIX[YYUNDEF]AT_LOCATION_IF([[, location]])[);
} }
} }
} }