-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathparser_skeleton.php
More file actions
94 lines (88 loc) · 2.82 KB
/
parser_skeleton.php
File metadata and controls
94 lines (88 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?php
/**
* This software is released under the terms of the MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @copyright 2012 Roberto Perpuly
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
/**
* This is a command line script that takes in a bison file from a PHP source distribution
* and strips it of any actions, leaving only the grammar rules. We then use the output of
* this script as the starting point of pelet parsers.
* This script outputs the file to STDOUT.
*/
$srcFile = "";
if ($argc > 1) {
$srcFile = $argv[1];
$fp = fopen($srcFile, 'rb');
if ($fp) {
$rulesSection = false;
$inAction = false;
$inString = false;
$braceCount = 0;
$curr = ' ';
$last = ' ';
while (!feof($fp)) {
$last = $curr;
$curr = fgetc($fp);
if ('%' == $curr && '%' == $last) {
if (!$rulesSection) {
// echo the previous '%' so that
// below we echo the second '%' in order
// to complete the rules delimiter
echo '%';
}
$rulesSection = true;
}
if ($rulesSection) {
if ("'" == $curr && !$inString) {
$inString = true;
}
else if ("'" == $curr && $inString) {
$inString = false;
}
else if ('{' == $curr && !$inString && !$inAction) {
$braceCount = 1;
$inAction = true;
}
else if ('{' == $curr && !$inString && $inAction) {
$braceCount++;
}
else if ('}' == $curr && !$inString && $inAction && $braceCount > 0) {
$braceCount--;
}
if (!$inAction) {
echo $curr;
}
// put after we echo so that we dont echo the final close brace
if (0 == $braceCount) {
$inAction = false;
}
}
}
}
else {
echo "Could not open file: {$srcFile}\n";
}
}
else {
echo "This script needs one argument: the bison grammar file to parse.\n";
}