Re: [Patches for Dlang support] modifications in examples
Akim Demaille <[email protected]> Sun, 17 Jan 2021 08:50:52 +0100
| Newsgroups | gmane.comp.parsers.bison.patches |
|---|---|
| Message-ID | <[email protected]> |
Hi Adela, > Le 16 janv. 2021 à 22:19, Adela Vais <[email protected]> a écrit : > > Hello! > > From Dlang v2.095.0 onwards, the std.conv.parse function, used in the calc > example, reports the number of consumed characters, so I modifed the calc > example to use it. Great, thanks! FTR, location track character positions, not bytes. So both are actually incorrect, if we were to accept say UTF-8. None of the example are correct on this regard, because it's too hard to do portably. But bison itself does it. As a matter of fact, bison tracks both character and byte positions in its locations. > Because it is a new addition to the language (Jan 1st 2021), I want to > support both (before and after v2.095.0) versions of the code. Yes, that it needed. However, from a stylistic point of view, I think it would be better to have the call site use the modern way, but to install the missing feature elsewhere. One should _try_ to avoid cluttering the code with portability issues, rather portability should be handled by providing the new feature before. I'm not sure that's possible in this case though. > I also made 2 small modifications for the examples: I removed the Value > value from the Lexer class in the calc example and did style fix for > paranthesis in the simple example. One parenthesis, two parentheses (). But actually you meant "braces" {}, not "parentheses". Perfect, thanks a lot, installed. I also installed this afterwards. Cheers! commit c20b6f1a8eed744cdc8add59df578e158e13fa55 Author: Akim Demaille <[email protected]> Date: Sun Jan 17 08:17:50 2021 +0100 d: examples: reduce scopes * data/skeletons/lalr1.d (YYLocation.step): New. * examples/d/calc/calc.y (Lexer): Reduce scopes to avoid uninitialized varibles. Factor the handling of locations. We don't need lenChars. diff --git a/data/skeletons/lalr1.d b/data/skeletons/lalr1.d index 06d8d4054..62b12d1c2 100644 --- a/data/skeletons/lalr1.d +++ b/data/skeletons/lalr1.d @@ -164,7 +164,8 @@ public struct ]b4_location_type[ * Create a <code>Location</code> 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 <code>Location</code> 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 83e378e49..d5d1274e6 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) {