Merge remote-tracking branch 'upstream/master'

Conflicts:
	NOTES
This commit is contained in:
Dan Hirsch 2012-05-04 21:27:09 +01:00
commit d6c0eaf3de
3 changed files with 103 additions and 16 deletions

View file

@ -26,15 +26,7 @@
* input - the entire string being parsed
* index - current position in input
* length - size of input
* THE FOLLOWING DESCRIBES HOW JSPARSE DOES IT. OUR MILEAGE MAY VARY.
* cache - a hash table describing the state of the parse, including partial parse_results.
* It's actually a hash table of [parser_id, hash_table[index, parse_result]],
* where the parser id is incremented as the parse goes along (parsers that have
* already been applied once don't get a new parser_id ... but the global variable
* still increments? not sure why that is, need to debug some), and the locations
* at which it's been applied are memoized.
*
* In our case, it's a hash table from parser_cache_key_t to parse_state_t.
* cache - a hash table describing the state of the parse, including partial parse_results. It's a hash table from parser_cache_key_t to parse_state_t.
*
*/
#define BYTE_BIG_ENDIAN 0x1
@ -124,9 +116,22 @@ const parser_t* sequence(const parser_t* p_array[]);
/* Given an array of parsers, p_array, apply each parser in order. The first parser to succeed is the result; if no parsers succeed, the parse fails. */
const parser_t* choice(const parser_t* p_array[]);
/* Given two parsers, p1 and p2, this parser succeeds in the following cases:
* - if p1 succeeds and p2 fails
* - if both succeed but p1's result is shorter than p2's
*/
const parser_t* butnot(const parser_t* p1, const parser_t* p2);
/* Given two parsers, p1 and p2, this parser succeeds in the following cases:
* - if p1 succeeds and p2 fails
* - if both succeed but p2's result is shorter than p1's
*/
const parser_t* difference(const parser_t* p1, const parser_t* p2);
/* Given two parsers, p1 and p2, this parser succeeds if *either* p1 or p2 succeed, but not if they both do.
*/
const parser_t* xor(const parser_t* p1, const parser_t* p2);
const parser_t* repeat0(const parser_t* p);
const parser_t* repeat1(const parser_t* p);
const parser_t* repeat_n(const parser_t* p, const size_t n);