mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
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:
committed by
Akim Demaille
parent
ee4ec08513
commit
cc04459cfe
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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]])[);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user