mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
d: simplify the API to build the scanner of the example
* examples/d/calc.y (calcLexer): Add an overload for File. Use it.
This commit is contained in:
@@ -54,6 +54,7 @@ exp:
|
|||||||
|
|
||||||
%%
|
%%
|
||||||
import std.range.primitives;
|
import std.range.primitives;
|
||||||
|
import std.stdio;
|
||||||
|
|
||||||
auto calcLexer(R)(R range)
|
auto calcLexer(R)(R range)
|
||||||
if (isInputRange!R && is (ElementType!R : dchar))
|
if (isInputRange!R && is (ElementType!R : dchar))
|
||||||
@@ -61,6 +62,17 @@ auto calcLexer(R)(R range)
|
|||||||
return new CalcLexer!R(range);
|
return new CalcLexer!R(range);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto calcLexer (File f)
|
||||||
|
{
|
||||||
|
import std.algorithm : map, joiner;
|
||||||
|
import std.utf : byDchar;
|
||||||
|
|
||||||
|
return f.byChunk(1024) // avoid making a syscall roundtrip per char
|
||||||
|
.map!(chunk => cast(char[]) chunk) // because byChunk returns ubyte[]
|
||||||
|
.joiner // combine chunks into a single virtual range of char
|
||||||
|
.calcLexer; // forward to other overload
|
||||||
|
}
|
||||||
|
|
||||||
class CalcLexer(R) : Lexer
|
class CalcLexer(R) : Lexer
|
||||||
if (isInputRange!R && is (ElementType!R : dchar))
|
if (isInputRange!R && is (ElementType!R : dchar))
|
||||||
{
|
{
|
||||||
@@ -127,17 +139,8 @@ class CalcLexer(R) : Lexer
|
|||||||
|
|
||||||
int main ()
|
int main ()
|
||||||
{
|
{
|
||||||
import std.algorithm : map, joiner;
|
auto l = calcLexer (stdin);
|
||||||
import std.stdio;
|
auto p = new Calc (l);
|
||||||
import std.utf : byDchar;
|
|
||||||
|
|
||||||
auto l = stdin
|
|
||||||
.byChunk(1024) // avoid making a syscall roundtrip per char
|
|
||||||
.map!(chunk => cast(char[]) chunk) // because byChunk returns ubyte[]
|
|
||||||
.joiner // combine chunks into a single virtual range of char
|
|
||||||
.calcLexer;
|
|
||||||
|
|
||||||
Calc p = new Calc (l);
|
|
||||||
p.parse ();
|
p.parse ();
|
||||||
return l.exit_status;
|
return l.exit_status;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user