From eddf5d0259e471826e735f1a19d2bbff5a3615c6 Mon Sep 17 00:00:00 2001 From: Richard van Velzen Date: Thu, 29 Dec 2011 17:44:44 +0100 Subject: [PATCH] Some extra stuff. More pragmas, and better EOF message --- lime.bootstrap | 3 +++ lime.php | 24 ++++++++++++++++++++---- lime_scan_tokens | Bin 22209 -> 22209 bytes lime_scan_tokens.l | 6 +++++- parse_engine.php | 8 +++++--- 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lime.bootstrap b/lime.bootstrap index 1730b64..5e8bdbc 100644 --- a/lime.bootstrap +++ b/lime.bootstrap @@ -7,8 +7,11 @@ to grammar : {$$=array();} toklist sym : $$[] = $2; toklist lit : $$[] = $2; +toklist num : $$[] = $2; +toklist str : $$[] = substr($2, 1, -1); to toklist sym '=' rhs : $$ = new lime_rewrite($1); $$->add_rhs($3); +sym ':' rhs : $$ = new lime_rewrite($1); $$->add_rhs($3); rewrite '|' rhs : $$->add_rhs($3); to rewrite list : $$ = new lime_rhs($1, ''); diff --git a/lime.php b/lime.php index 085023f..9d3d434 100755 --- a/lime.php +++ b/lime.php @@ -355,9 +355,10 @@ class state { } class sym { - public function __construct($name, $id) { + public function __construct($name, $id, $desc = null) { $this->name = $name; $this->id = $id; + $this->desc = $desc; $this->term = true; // Until proven otherwise. $this->rule = array(); $this->config = array(); @@ -374,6 +375,10 @@ class sym { return $out; } + + public function descr() { + return $this->descr ? $this->descr : $this->name; + } } class rule { @@ -689,9 +694,9 @@ class lime { $sym->rule[] = $r; } - function sym($str) { + function sym($str, $description = null) { if (!isset($this->sym[$str])) { - $this->sym[$str] = new sym($str, count($this->sym)); + $this->sym[$str] = new sym($str, count($this->sym), $description); } return $this->sym[$str]; @@ -999,6 +1004,17 @@ class lime { case 'class': $this->parser_class = $args[0]; break; + case 'expect': + if (!ctype_digit($args[0])) { + emit(sprintf('Bad expect pragma: %s', $args[0])); + exit(1); + } + + $this->expect_conflicts = $args[0]; + break; + case 'token': + $this->sym($args[0], @$args[1]); + break; default: emit(sprintf('Bad Parser Pragma: (%s)', $type)); exit(1); @@ -1233,7 +1249,7 @@ function lime_bootstrap() { bug_unless(is_readable($bootstrap)); foreach(file($bootstrap) as $l) { - $a = explode(':', $l, 2); + $a = preg_split('~(?<=\s|^):(?=\s|$)~', $l, 2); if (count($a) == 2) { list($pattern, $code) = $a; diff --git a/lime_scan_tokens b/lime_scan_tokens index bb2b32765071218e3553a851b45389cbaee3cd0b..b3d8296ef80dcf279937d1d11e994940aa04e0cc 100755 GIT binary patch delta 5521 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 diff --git a/lime_scan_tokens.l b/lime_scan_tokens.l index 9cd0586..0080490 100644 --- a/lime_scan_tokens.l +++ b/lime_scan_tokens.l @@ -34,7 +34,7 @@ ALPHA [a-zA-Z] DIGIT [0-9] ALNUM {ALPHA}|{DIGIT} WORD {ALNUM}|_ -STOP "." +STOP "."|";" SYM {ALPHA}{WORD}*'* LIT '.' @@ -87,6 +87,10 @@ BLOCKCMT "/*"({CC}|{CX})*{CT} [[:space:]] {} {SYM} tok("sym"); {LIT} tok("lit"); + {DIGIT} tok("num"); + \"{DCHAR}*\" tok("str"); + '{SCHAR}*' tok("str"); + . lit(); } diff --git a/parse_engine.php b/parse_engine.php index 29df486..c3615b0 100644 --- a/parse_engine.php +++ b/parse_engine.php @@ -41,8 +41,8 @@ class parse_unexpected_token extends parse_error { } class parse_premature_eof extends parse_error { - public function __construct() { - parent::__construct('Premature EOF'); + public function __construct(array $expect) { + parent::__construct('Premature EOF, expected {' . implode(', ', $expect) . '}'); } } @@ -221,6 +221,8 @@ class parse_engine { private function premature_eof() { $seen = array(); + $expect = $this->get_steps(); + while ($this->enter_error_tolerant_state()) { if (isset($seen[$this->state()])) { // This means that it's pointless to try here. @@ -244,7 +246,7 @@ class parse_engine { } } - throw new parse_premature_eof(); + throw new parse_premature_eof($expect); } private function current_row() {