-
Notifications
You must be signed in to change notification settings - Fork 1
/
bnf.php
161 lines (155 loc) · 3.75 KB
/
bnf.php
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<?php
/**
* Parse and display BNF rules
*
* @author nicolas
* @since 5 avr. 2011
*/
namespace BNF;
/**
* The central class
*
* The BNF class parse, construct and represente BNF rules.
* The BNF (Backus Normal Form or Backus–Naur Form) is a notation
* technique for context-free grammars.
*
* Represention
*
* @author Nicolas de Marqué Fromentin
* @since 2011
* @version 1.0
*
*/
class bnf{
const PART_WORD = "__word__";
const PART_WORD_QUOTED = "__word_quoted__";
const PART_WORD_SIMPLE_QUOTED = "__word_simple_quoted__";
const PART_REPETITION = "__repetition__";
const PART_REPETITION_FORCED = "__repetition_forced__";
const PART_REPETITION_SUFFIXED = "__repetition_suffixed__";
const PART_RULE = "__rule__";
const RULE = "__is_rule__";
const PART_OPTION = "__option__";
const PART_SET = "__set__";
/**
* The parser
* @var bnfParser $parser
*/
public $parser;
/**
* The identificate string of the bnf instance.
* @var string $id
*/
public $id;
/**
* The rules of the instances in memory
* @var array $rules
*/
protected $rules=array();
/**
* The max level for display sub rules.
* Saved in static form to simplificate
* use in other class
* @var integer $maxLevel;
*/
public static $maxLevel;
/**
* The separator use beetwen string in render process.
* The static form is to simplificate use in other class.
* @var string $separator
*/
public static $separator="";
/**
* Construct the bnf object
* An optionnel string can be add to be parsed
* as rules
* @param string $id
* @param string $rules
* @return bnf
*/
public function __construct($id="bnf", $rules="")
{
$this->id = $id;
//$this->parser = new bnfParser($this);
if($rules!=="")
$this->parseRules($rules);
}
/**
* Parse the $rules
* @param string $bnfRules
*/
public function parseRules($bnfRules)
{
$this->rules = bnfParser::parseRules($this->id, $bnfRules);
}
/**
* Add a rule in this bnf system
* @param bnfRule $rule
*/
public function addRule(bnfRule $rule){
$this->rules[] = $rule;
}
/**
* With saved rules generate a well formed string
* of the rule givedn in parameter
* @param string $rule : the rule name
* @param string $separator : the separator use beetween part
* @return string
*/
public function render($rule, $separator="")
{
bnf::$separator = $separator;
return bnfRule::$rules[$this->id][$rule]->render();
}
/**
* An alias from table
*
* @param string $rule
* @param integer $level
* @return html : an html table html4.0 transitional compliant
*
*/
public function graph($rule, $level)
{
return $this->table($rule, $level);
}
/**
* Create an html table representing the rule given by
* the first parameter, and limit the representation by
* the levels of the
*
* @param string $rule
* @param integer $level
* @return html : an html table html4.0 transitional compliant
*
*/
public function table($rule, $level)
{
bnf::$maxLevel = $level;
return bnfRule::$rules[$this->id][$rule]->table(0);
}
/**
* Return css file positioning by the given
* relative path to the lib directory
* @param string $htmlRelativeDir
*/
public function getCss($htmlRelativeDir=".")
{
return $htmlRelativeDir."/assets/table.style.css";
}
/**
* Return css link tag positioning by the given
* relative path to the lib directory
* @param string $htmlRelativeDir
*/
public function getCssLink($htmlRelativeDir="."){
return "<link type=\"text/css\" media=\"all\" rel=\"stylesheet\" href=\"".$this->getCss($htmlRelativeDir)."\">";
}
/**
* Return all rules
* @return array of rules
*/
public function getRules(){
return $this->rules;
}
}