Commit graph

127 commits

Author SHA1 Message Date
David Majda 0bbca136a2 Jasmine: Convert tests of parser's "unicodeEscapeSequence" rule 2012-05-06 18:39:53 +02:00
David Majda a27dc5ae4a Jasmine: Convert tests of parser's "eolEscapeSequence" rule 2012-05-06 18:39:53 +02:00
David Majda 4f91286013 Jasmine: Convert non-tests of parser's character class rules 2012-05-06 18:39:53 +02:00
David Majda 3bc61c4c50 Jasmine: Convert tests of parser's "__" rule 2012-05-06 18:39:53 +02:00
David Majda fadaef84dd Jasmine: Convert tests of parser's "comment" rule 2012-05-06 18:39:53 +02:00
David Majda b5ccaed491 Jasmine: Convert tests of parser's "singleLineComment" rule 2012-05-06 18:39:53 +02:00
David Majda dac3b0d8d9 Jasmine: Convert tests of parser's "multiLineComment" rule 2012-05-06 18:39:53 +02:00
David Majda 328edf667c Jasmine: Convert tests of parser's "eol" rule 2012-05-06 18:39:53 +02:00
David Majda b4cffee9d4 Jasmine: Convert tests of parser's "eolChar" rule 2012-05-06 18:39:53 +02:00
David Majda a46b9c197b Jasmine: Convert tests of parser's "whitespace" rule 2012-05-06 18:39:53 +02:00
David Majda 53f70b9eb9 Move compiler passes and their tests into a subdirectory 2012-04-19 14:23:21 +02:00
David Majda f046e0a838 Move compiler-related source files and tests into a subdirectory 2012-04-19 13:22:37 +02:00
David Majda ef06621a2b Remove extra comma in compiler tests 2012-04-17 12:00:58 +02:00
David Majda 5b3321d302 Implement |cache| option for |PEG.buildParser|
This option enables/disables the results cache in generated parsers.
Until now, it was always enabled, but after this commit it needs to be
enabled explicitly (i.e. the |cache| option default value is |false|).
The reason is that parsing without it is *much* faster according to the
benchmark.

Note that disabling the cache breaks the linear parsing time guarantee,
meaning that with some grammars you can get exponential parsing time
with respect to the input length. This, together with the possibility of
improving the cache performance in the future, is the reason to keep it
as an option.

Speed impact
------------
Before:     214.08 kB/s
After:      827.52 kB/s
Difference: 286.54%

Size impact
-----------
Before:     1045396 b
After:      949783 b
Difference: -9.15%

(Measured by /tools/impact with Node.js v0.6.6 on x86_64 GNU/Linux.)
2012-04-17 09:48:29 +02:00
David Majda f3970bfa5c Extend QUnit a bit more cleanly 2012-04-16 15:45:50 +02:00
David Majda d35b21e9b2 Simplify the |indent| function in /test/run 2012-04-16 15:29:04 +02:00
David Majda 9d5990f80a Update code formatting in /test/run to match conventions I use elsewhere 2012-04-16 15:26:42 +02:00
David Majda 6d624a89bd Update bundled QUnit to version 1.5.0 2012-04-16 14:54:34 +02:00
David Majda 52d7ec2224 Implement |trackLineAndColumn| option for |PEG.buildParser|
This option makes the generated parser track line and column during
parsing. Tracked line and column are made available inside actions and
predicates as |line| and |column| variables.

Note that in actions these variables denote start position of the
action's expression while in predicates they denote the current
position. The slightly different behavior is motivated by expected
usage.
2012-03-26 20:15:29 +02:00
David Majda f2f88b87ea Make current parse position visible in actions and predicates
The speed/size impact is insignificant.

Speed impact
------------
Before:     214.11 kB/s
After:      214.87 kB/s
Difference: 0.35%

Size impact
-----------
Before:     1042691 b
After:      1046731 b
Difference: 0.38%

(Measured by /tools/impact with Node.js v0.6.6 on x86_64 GNU/Linux.)
2012-03-06 19:55:55 +01:00
David Majda f47da5c682 Fix a bug in param name fixup code for sequences 2012-03-06 08:46:28 +01:00
David Majda 4d5b1d58aa AST: Store rules in an array instead of an object
This simplifies the code a bit and makes the AST more regular (each node
type has a fixed set of properties). The latter may get useful later
when generalizing visitors.
2012-03-04 17:29:32 +01:00
David Majda a2af1fe612 Semantic predicates now have access to preceding labels
Part of a fix for GH-69.
2012-02-27 20:18:21 +01:00
David Majda 4cf50bcf9f Move param computations from the emitter into a separate pass
This has two main benefits:

  1. The knowledge about scoping params in at one designated place,
     making all future adjustments in this area easier.

  2. Action-related code does not handle sequences specially anymore.
     Such knowledge/behavior doesn't belong there.
2012-02-27 20:18:03 +01:00
David Majda efc38eef9b Consolidate all variable name computations into one compiler pass
Before this change, knowledge about variable names was spread between
the |computeStackDepths| pass and the code emitter code. For example,
the fact that the |&...| expression needs one variable to store a
position was represented in both places.

This changes consolidates that knowledge and introduces a new
|computeVarNames| pass. This pass replaces old |computeStackDepths|
pass, does all computations realted to variable names and stores the
results in the AST. Note that some knowledge about variables
(inevitably) remained in emitter code templates.

Beside DRYing things up, this change simplifies the emitter
significantly. By storing variable names in the AST it also allows
introduction of a pass that will identify parameters passed to actions
using proper symbol tables. Right now, this is done in a hackish way
directly in the emitter, which won't work well with changes planned in
GH-69.
2012-02-27 20:10:25 +01:00
David Majda 46b2eaf3e3 Add |expected| and |found| properties to exceptions thrown by parsers
Based on a patch by Marcin Stefaniuk (marcin@stefaniuk.info).
2012-02-12 12:28:59 +01:00
David Majda 21c6d9ccd3 Add |offset| property to exceptions thrown by parsers
Based on a patch by Marcin Stefaniuk (marcin@stefaniuk.info).
2012-02-12 12:28:53 +01:00
David Majda fb5028eb90 Use |util| module instead of |sys|
|sys| emits a warning in Node.js 0.6.x.
2012-01-07 12:01:11 +01:00
David Majda 8a0276ffb7 Unify checks and passes
There is no real reason to have them separated.
2011-10-03 14:57:09 +02:00
David Majda 6cd5bdc5e6 Passes now do not return anything (they always modify the AST in-place) 2011-10-03 14:57:09 +02:00
David Majda 3983f46d5d Rename |reportMissingReferencedRules| check to |reportMissingRules|
The new name is shorter, there is no real loss of meaning.
2011-10-03 14:56:54 +02:00
David Majda 64d26e5db2 Make names of compiler checks and passes verbs 2011-10-03 13:34:25 +02:00
David Majda 8acea01525 Fix reported error position when part of the input is not consumed
Closes GH-48.
2011-10-01 18:46:57 +02:00
David Majda 211a1116e4 Fix stack depth computations for empty sequences
Part of a fix for GH-53.
2011-09-30 19:47:05 +02:00
David Majda afdcb6fc4f Fix |posStackDepth| computation for rules
Rules by themselves do not need any variable for storing position.

Part of a fix for GH-53.
2011-09-30 17:57:48 +02:00
David Majda 756b6fc473 Fix |resultStackDepth| computation for sequences
The |1 + ...| was wrong -- sequence does not need its own variable since
it reuses the one used by the first item.

Part of a fix for GH-53.
2011-09-30 17:23:57 +02:00
David Majda 9c3da347cc Fix string parsing tests
The tests were wrong because the |string| rule is not used to parse
literals but rule names.
2011-09-30 16:49:50 +02:00
David Majda 3421bdb813 Test trailing characters for strings and literals at correct places 2011-09-30 16:44:44 +02:00
David Majda c04af99df8 Implament case-insensitive class matching 2011-09-30 11:45:36 +02:00
David Majda b540b2d460 Implement case-insensitive literal matching 2011-09-30 11:20:37 +02:00
David Majda 88c50a3e33 Add tests for zero- and one-char literals
We optimize these cases in the emitter so we should better test them.
2011-09-30 10:53:12 +02:00
David Majda 1c11e4aaa3 Split |literal| rule in the PEG.js grammar to |literal| and |string|
This is just a formality now but it will make sense later when literals
(but not strings) will allow "i" flag for case-insensitive matching.
2011-09-30 10:21:29 +02:00
David Majda cb2415a4fd Fix output printed during test failures
Expected value was being printed instead of the actual one.

Original patch by Wolfgang Kluge:

  1e875d4479
2011-09-18 18:05:10 +02:00
David Majda 17f62ae9e3 test/parser-test.js: Replace "\0" with "\x00"
Fixes the following JSHint errors:

  ./test/parser-test.js: line 353, col 54, Bad escapement.
  ./test/parser-test.js: line 384, col 54, Bad escapement.
  ./test/parser-test.js: line 436, col 60, Bad escapement.
  ./test/parser-test.js: line 437, col 60, Bad escapement.
  ./test/parser-test.js: line 472, col 50, Bad escapement.
2011-09-18 16:25:47 +02:00
David Majda 934bfa5eef test/parser-test.js: Fix missing/unnecessary semicolons
Fixes the following JSHint errors:

  ./test/parser-test.js: line 49, col 4, Missing semicolon.
  ./test/parser-test.js: line 58, col 4, Missing semicolon.
  ./test/parser-test.js: line 77, col 2, Unnecessary semicolon.
  ./test/parser-test.js: line 137, col 23, Missing semicolon.
2011-09-18 16:25:47 +02:00
David Majda d84f38c64b test/parser-test.js: Fix comments that look like nested to JSHint
Fixes the following JSHint errors:

  ./test/parser-test.js: line 521, col 29, Nested comment.
  ./test/parser-test.js: line 521, col 29, Stopping, unable to continue. (87% scanned).
2011-09-18 16:25:47 +02:00
David Majda 34d19a7dc6 test/passes-test.js: Add missing semicolons
Fixes the following JSHint errors:

  ./test/passes-test.js: line 12, col 6, Missing semicolon.
  ./test/passes-test.js: line 25, col 4, Missing semicolon.
  ./test/passes-test.js: line 229, col 41, Missing semicolon.
2011-09-18 16:25:47 +02:00
David Majda 0fe5769024 test/checks-test.js: Avoid function definitions in loops
Fixes the following JSHint errors:

  ./test/checks-test.js: line 26, col 8, Don't make functions within a loop.
  ./test/checks-test.js: line 31, col 5, Don't make functions within a loop.
  ./test/checks-test.js: line 59, col 8, Don't make functions within a loop.
  ./test/checks-test.js: line 64, col 5, Don't make functions within a loop.
2011-09-18 16:25:47 +02:00
David Majda 96192417d8 test/compiler-test.js: Remove extra comma
Fixes the following JSHint error:

  ./test/compiler-test.js: line 498, col 49, Extra comma.
2011-09-18 16:25:47 +02:00
David Majda e93eaa0e0e test/compiler-test.js: Add missing semicolon
Fixes the following JSHint error:

  ./test/compiler-test.js: line 420, col 47, Missing semicolon.
2011-09-18 16:25:47 +02:00