Skip to content

Commit d6e442e

Browse files
committed
Add new parsers and expanders
1 parent f2991fc commit d6e442e

File tree

3 files changed

+215
-24
lines changed

3 files changed

+215
-24
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"files": [
1313
"source/environment.php",
1414
"source/expanders.php",
15+
"source/parsers.php",
1516
"source/functions.php",
1617
"source/autoload.php",
1718
"source/macros.php"

source/expanders.php

Lines changed: 111 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,122 @@
11
<?php
22

3-
namespace Yay\DSL\Expanders;
3+
namespace Yay\DSL\Expanders {
4+
use Yay\Engine;
5+
use Yay\TokenStream;
46

5-
use Yay\Engine;
6-
use Yay\TokenStream;
7+
function trim(TokenStream $stream, Engine $engine): TokenStream {
8+
return \Pre\Plugin\Expanders\trim($stream, $engine);
9+
}
710

8-
function trim(TokenStream $stream, Engine $engine): TokenStream
9-
{
10-
$stream = \trim($stream);
11+
function studly(TokenStream $stream, Engine $engine): TokenStream {
12+
return \Pre\Plugin\Expanders\studly($stream, $engine);
13+
}
1114

12-
return TokenStream::fromSource(
13-
$engine->expand($stream, "", Engine::GC_ENGINE_DISABLED)
14-
);
15-
}
15+
function collapse(TokenStream $stream, Engine $engine): TokenStream {
16+
return \Pre\Plugin\Expanders\collapse($stream, $engine);
17+
}
18+
19+
function functionModifiers(TokenStream $stream, Engine $engine): TokenStream {
20+
return \Pre\Plugin\Expanders\functionModifiers($stream, $engine);
21+
}
1622

17-
function studly(TokenStream $stream, Engine $engine): TokenStream
18-
{
19-
$stream = \str_replace(["-", "_"], " ", $stream);
20-
$stream = \str_replace(" ", "", \ucwords($stream));
23+
function functionArgument(TokenStream $stream, Engine $engine): TokenStream {
24+
return \Pre\Plugin\Expanders\functionArgument($stream, $engine);
25+
}
2126

22-
return TokenStream::fromSource(
23-
$engine->expand($stream, "", Engine::GC_ENGINE_DISABLED)
24-
);
27+
function functionReturn(TokenStream $stream, Engine $engine): TokenStream {
28+
return \Pre\Plugin\Expanders\functionReturn($stream, $engine);
29+
}
2530
}
2631

27-
function collapse(TokenStream $stream, Engine $engine): TokenStream
28-
{
29-
$stream = \preg_replace("/\n\s+\n/", "\n\n", $stream);
30-
$stream = \preg_replace("/\n{3}/", "\n\n", $stream);
32+
namespace Pre\Plugin\Expanders {
33+
use Yay\Engine;
34+
use Yay\TokenStream;
35+
36+
function _stream(string $source, Engine $engine): TokenStream {
37+
return TokenStream::fromSource(
38+
$engine->expand($source, "", Engine::GC_ENGINE_DISABLED)
39+
);
40+
}
41+
42+
function trim(TokenStream $stream, Engine $engine): TokenStream {
43+
$stream = \trim($stream);
44+
return _stream($stream, $engine);
45+
}
46+
47+
function studly(TokenStream $stream, Engine $engine): TokenStream {
48+
$stream = \str_replace(["-", "_"], " ", $stream);
49+
$stream = \str_replace(" ", "", \ucwords($stream));
50+
return _stream($stream, $engine);
51+
}
52+
53+
function collapse(TokenStream $stream, Engine $engine): TokenStream {
54+
$stream = \preg_replace("/\n\s+\n/", "\n\n", $stream);
55+
$stream = \preg_replace("/\n{3}/", "\n\n", $stream);
56+
return _stream($stream, $engine);
57+
}
58+
59+
function functionModifiers(TokenStream $stream, Engine $engine): TokenStream {
60+
$parts = [];
61+
62+
while ($token = $stream->current()) {
63+
\array_push($parts, (string) $token);
64+
$stream->next();
65+
}
66+
67+
$source = \join(" ", $parts);
68+
69+
return _stream($source, $engine);
70+
}
71+
72+
function functionArgument(TokenStream $stream, Engine $engine): TokenStream {
73+
$parts = [];
74+
$previous = null;
75+
$nullable = false;
76+
77+
while ($token = $stream->current()) {
78+
\array_push($parts, $token);
79+
80+
if ($token->type() === T_NEW) {
81+
\array_pop($parts);
82+
$nullable = true;
83+
break;
84+
}
85+
86+
if ($token->value() === "(" && $previous && $previous->type() === T_STRING) {
87+
\array_pop($parts);
88+
\array_pop($parts);
89+
$nullable = true;
90+
break;
91+
}
92+
93+
$previous = $token;
94+
$stream->next();
95+
}
96+
97+
if ($nullable) {
98+
\array_push($parts, "null");
99+
}
100+
101+
$source = \join(" ", $parts);
102+
$source = \str_replace("[ ]", "[]", $source);
103+
104+
return _stream($source, $engine);
105+
}
106+
107+
function functionReturn(TokenStream $stream, Engine $engine): TokenStream {
108+
if ($stream->isEmpty()) {
109+
return _stream("", $engine);
110+
}
111+
112+
// ...skip the :
113+
$stream->next();
114+
115+
// ...get the return type
116+
$token = $stream->current();
117+
118+
$source = ": {$token}";
31119

32-
return TokenStream::fromSource(
33-
$engine->expand($stream, "", Engine::GC_ENGINE_DISABLED)
34-
);
120+
return _stream($source, $engine);
121+
}
35122
}

source/parsers.php

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
<?php
2+
3+
namespace Yay {
4+
use Yay\Parser;
5+
6+
function functionModifiers(): Parser {
7+
return \Pre\Plugin\Parsers\functionModifiers();
8+
}
9+
10+
function functionArgument(): Parser {
11+
return \Pre\Plugin\Parsers\functionArgument();
12+
}
13+
14+
function functionArguments(): Parser {
15+
return \Pre\Plugin\Parsers\functionArguments();
16+
}
17+
18+
function functionReturn(): Parser {
19+
return \Pre\Plugin\Parsers\functionReturn();
20+
}
21+
}
22+
23+
namespace Pre\Plugin\Parsers {
24+
use Yay\Parser;
25+
use function Yay\buffer;
26+
use function Yay\chain;
27+
use function Yay\either;
28+
use function Yay\layer;
29+
use function Yay\ls;
30+
use function Yay\ns;
31+
use function Yay\optional;
32+
use function Yay\repeat;
33+
use function Yay\token;
34+
35+
function functionModifiers(): Parser {
36+
return optional(
37+
repeat(
38+
either(
39+
buffer("public"),
40+
buffer("protected"),
41+
buffer("private"),
42+
buffer("static")
43+
)->as("functionModifier")
44+
)
45+
)->as("functionModifiers");
46+
}
47+
48+
function functionArgument(): Parser {
49+
return chain(
50+
optional(
51+
either(
52+
ns(),
53+
token(T_ARRAY),
54+
token(T_CALLABLE)
55+
)
56+
)->as("functionArgumentType"),
57+
token(T_VARIABLE)->as("functionArgumentName"),
58+
optional(buffer("="))->as("functionArgumentEquals"),
59+
optional(token(T_NEW))->as("functionArgumentNew"),
60+
optional(
61+
either(
62+
chain(
63+
ns(),
64+
buffer("("),
65+
layer(),
66+
buffer(")")
67+
),
68+
token(T_CONSTANT_ENCAPSED_STRING),
69+
token(T_LNUMBER),
70+
token(T_DNUMBER),
71+
token(T_STRING),
72+
chain(
73+
buffer("["),
74+
layer(),
75+
buffer("]")
76+
)
77+
)
78+
)->as("functionArgumentValue")
79+
)->as("functionArgument");
80+
}
81+
82+
function functionArguments(): Parser {
83+
return optional(
84+
ls(
85+
functionArgument(),
86+
buffer(",")
87+
)
88+
)->as("functionArguments");
89+
}
90+
91+
function functionReturn(): Parser {
92+
return optional(
93+
chain(
94+
buffer(":"),
95+
either(
96+
ns(),
97+
token(T_ARRAY),
98+
token(T_CALLABLE)
99+
)->as("functionReturnType")
100+
)
101+
)->as("functionReturn");
102+
}
103+
}

0 commit comments

Comments
 (0)