Merge remote-tracking branch 'upstream/master'
Conflicts: NOTES
This commit is contained in:
commit
d6c0eaf3de
3 changed files with 103 additions and 16 deletions
23
src/hammer.h
23
src/hammer.h
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue