diff --git a/data/skeletons/lalr1.d b/data/skeletons/lalr1.d index 06d8d405..62b12d1c 100644 --- a/data/skeletons/lalr1.d +++ b/data/skeletons/lalr1.d @@ -164,7 +164,8 @@ public struct ]b4_location_type[ * Create a Location denoting an empty range located at * a given point. * @@param loc The position at which the range is anchored. */ - public this (Position loc) { + public this(Position loc) + { this.begin = this.end = loc; } @@ -172,16 +173,25 @@ public struct ]b4_location_type[ * Create a Location from the endpoints of the range. * @@param begin The first position included in the range. * @@param end The first position beyond the range. */ - public this (Position begin, Position end) + public this(Position begin, Position end) { this.begin = begin; this.end = end; } + /** + * Reset initial location to final location. + */ + public void step() + { + this.begin = this.end; + } + /** * A representation of the location. */ - public string toString () const { + public string toString() const + { auto end_col = 0 < end.column ? end.column - 1 : 0; auto res = begin.toString (); if (end.filename && begin.filename != end.filename) diff --git a/examples/d/calc/calc.y b/examples/d/calc/calc.y index 83e378e4..d5d1274e 100644 --- a/examples/d/calc/calc.y +++ b/examples/d/calc/calc.y @@ -115,10 +115,10 @@ if (isInputRange!R && is(ElementType!R : dchar)) // Skip initial spaces while (!input.empty && input.front != '\n' && isWhite(input.front)) { - location.begin = location.end; location.end.column++; input.popFront; } + location.step(); if (input.empty) return Symbol(TokenKind.YYEOF, location); @@ -126,8 +126,6 @@ if (isInputRange!R && is(ElementType!R : dchar)) // Numbers. if (input.front.isNumber) { - int ival; - int lenChars = 0; import std.compiler : version_minor; static if (version_minor >= 95) { @@ -136,29 +134,26 @@ if (isInputRange!R && is(ElementType!R : dchar)) import std.typecons : Flag, Yes; import std.conv : parse; auto parsed = parse!(int, R, Yes.doCount)(input); - ival = parsed.data; - lenChars = cast(int) parsed.count; + int ival = parsed.data; + location.end.column += cast(int) parsed.count; } else { auto copy = input; import std.conv : parse; - ival = input.parse!int; + int ival = input.parse!int; while (!input.empty && copy.front != input.front) { - lenChars++; + location.end.column++; copy.popFront; } } - location.begin = location.end; - location.end.column += lenChars; return Symbol(TokenKind.NUM, ival, location); } // Individual characters auto ch = input.front; input.popFront; - location.begin = location.end; location.end.column++; switch (ch) {