diff options
| author | Li Jin <dragon-fly@qq.com> | 2017-07-05 14:30:02 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2017-07-05 14:30:02 +0800 |
| commit | 2dc481058998344b7f97721d47987be3ac053768 (patch) | |
| tree | 9afd61edfc6d3f079262a3086ebef8cb70943a31 | |
| parent | 2d074d650ead2142857ff9f8b192b061d1506eca (diff) | |
| download | yuescript-2dc481058998344b7f97721d47987be3ac053768.tar.gz yuescript-2dc481058998344b7f97721d47987be3ac053768.tar.bz2 yuescript-2dc481058998344b7f97721d47987be3ac053768.zip | |
Learn PEGTL a little.
139 files changed, 10321 insertions, 0 deletions
diff --git a/MoonParser.xcodeproj/project.pbxproj b/MoonParser.xcodeproj/project.pbxproj new file mode 100644 index 0000000..2585cd1 --- /dev/null +++ b/MoonParser.xcodeproj/project.pbxproj | |||
| @@ -0,0 +1,568 @@ | |||
| 1 | // !$*UTF8*$! | ||
| 2 | { | ||
| 3 | archiveVersion = 1; | ||
| 4 | classes = { | ||
| 5 | }; | ||
| 6 | objectVersion = 46; | ||
| 7 | objects = { | ||
| 8 | |||
| 9 | /* Begin PBXBuildFile section */ | ||
| 10 | 3C06322F1F0CBE210089D0AB /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C0631A21F0CBE210089D0AB /* main.cpp */; }; | ||
| 11 | 3C0632301F0CBE210089D0AB /* slice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C06322D1F0CBE210089D0AB /* slice.cpp */; }; | ||
| 12 | /* End PBXBuildFile section */ | ||
| 13 | |||
| 14 | /* Begin PBXCopyFilesBuildPhase section */ | ||
| 15 | 3C0F0F6A1EF3781E000EADDB /* CopyFiles */ = { | ||
| 16 | isa = PBXCopyFilesBuildPhase; | ||
| 17 | buildActionMask = 2147483647; | ||
| 18 | dstPath = /usr/share/man/man1/; | ||
| 19 | dstSubfolderSpec = 0; | ||
| 20 | files = ( | ||
| 21 | ); | ||
| 22 | runOnlyForDeploymentPostprocessing = 1; | ||
| 23 | }; | ||
| 24 | /* End PBXCopyFilesBuildPhase section */ | ||
| 25 | |||
| 26 | /* Begin PBXFileReference section */ | ||
| 27 | 3C0631A21F0CBE210089D0AB /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; }; | ||
| 28 | 3C0631A51F0CBE210089D0AB /* analyze_cycles.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = analyze_cycles.hpp; sourceTree = "<group>"; }; | ||
| 29 | 3C0631A61F0CBE210089D0AB /* counted.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = counted.hpp; sourceTree = "<group>"; }; | ||
| 30 | 3C0631A71F0CBE210089D0AB /* generic.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = generic.hpp; sourceTree = "<group>"; }; | ||
| 31 | 3C0631A81F0CBE210089D0AB /* grammar_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = grammar_info.hpp; sourceTree = "<group>"; }; | ||
| 32 | 3C0631A91F0CBE210089D0AB /* insert_guard.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = insert_guard.hpp; sourceTree = "<group>"; }; | ||
| 33 | 3C0631AA1F0CBE210089D0AB /* insert_rules.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = insert_rules.hpp; sourceTree = "<group>"; }; | ||
| 34 | 3C0631AB1F0CBE210089D0AB /* rule_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rule_info.hpp; sourceTree = "<group>"; }; | ||
| 35 | 3C0631AC1F0CBE210089D0AB /* rule_type.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rule_type.hpp; sourceTree = "<group>"; }; | ||
| 36 | 3C0631AD1F0CBE210089D0AB /* analyze.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = analyze.hpp; sourceTree = "<group>"; }; | ||
| 37 | 3C0631AE1F0CBE210089D0AB /* apply_mode.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = apply_mode.hpp; sourceTree = "<group>"; }; | ||
| 38 | 3C0631AF1F0CBE210089D0AB /* argv_input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = argv_input.hpp; sourceTree = "<group>"; }; | ||
| 39 | 3C0631B01F0CBE210089D0AB /* ascii.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ascii.hpp; sourceTree = "<group>"; }; | ||
| 40 | 3C0631B11F0CBE210089D0AB /* buffer_input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = buffer_input.hpp; sourceTree = "<group>"; }; | ||
| 41 | 3C0631B21F0CBE210089D0AB /* config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = config.hpp; sourceTree = "<group>"; }; | ||
| 42 | 3C0631B41F0CBE210089D0AB /* abnf.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = abnf.hpp; sourceTree = "<group>"; }; | ||
| 43 | 3C0631B51F0CBE210089D0AB /* alphabet.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = alphabet.hpp; sourceTree = "<group>"; }; | ||
| 44 | 3C0631B61F0CBE210089D0AB /* changes.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = changes.hpp; sourceTree = "<group>"; }; | ||
| 45 | 3C0631B71F0CBE210089D0AB /* counter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = counter.hpp; sourceTree = "<group>"; }; | ||
| 46 | 3C0631B81F0CBE210089D0AB /* http.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = http.hpp; sourceTree = "<group>"; }; | ||
| 47 | 3C0631B91F0CBE210089D0AB /* json.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = json.hpp; sourceTree = "<group>"; }; | ||
| 48 | 3C0631BA1F0CBE210089D0AB /* raw_string.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = raw_string.hpp; sourceTree = "<group>"; }; | ||
| 49 | 3C0631BB1F0CBE210089D0AB /* rep_one_min_max.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rep_one_min_max.hpp; sourceTree = "<group>"; }; | ||
| 50 | 3C0631BC1F0CBE210089D0AB /* to_string.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = to_string.hpp; sourceTree = "<group>"; }; | ||
| 51 | 3C0631BD1F0CBE210089D0AB /* tracer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tracer.hpp; sourceTree = "<group>"; }; | ||
| 52 | 3C0631BE1F0CBE210089D0AB /* unescape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = unescape.hpp; sourceTree = "<group>"; }; | ||
| 53 | 3C0631BF1F0CBE210089D0AB /* uri.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = uri.hpp; sourceTree = "<group>"; }; | ||
| 54 | 3C0631C01F0CBE210089D0AB /* cstream_input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cstream_input.hpp; sourceTree = "<group>"; }; | ||
| 55 | 3C0631C11F0CBE210089D0AB /* eol.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = eol.hpp; sourceTree = "<group>"; }; | ||
| 56 | 3C0631C21F0CBE210089D0AB /* file_input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = file_input.hpp; sourceTree = "<group>"; }; | ||
| 57 | 3C0631C31F0CBE210089D0AB /* input_error.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = input_error.hpp; sourceTree = "<group>"; }; | ||
| 58 | 3C0631C51F0CBE210089D0AB /* action.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = action.hpp; sourceTree = "<group>"; }; | ||
| 59 | 3C0631C61F0CBE210089D0AB /* action_input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = action_input.hpp; sourceTree = "<group>"; }; | ||
| 60 | 3C0631C71F0CBE210089D0AB /* alnum.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = alnum.hpp; sourceTree = "<group>"; }; | ||
| 61 | 3C0631C81F0CBE210089D0AB /* alpha.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = alpha.hpp; sourceTree = "<group>"; }; | ||
| 62 | 3C0631C91F0CBE210089D0AB /* any.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = any.hpp; sourceTree = "<group>"; }; | ||
| 63 | 3C0631CA1F0CBE210089D0AB /* apply.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = apply.hpp; sourceTree = "<group>"; }; | ||
| 64 | 3C0631CB1F0CBE210089D0AB /* apply0.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = apply0.hpp; sourceTree = "<group>"; }; | ||
| 65 | 3C0631CC1F0CBE210089D0AB /* at.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = at.hpp; sourceTree = "<group>"; }; | ||
| 66 | 3C0631CD1F0CBE210089D0AB /* bof.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bof.hpp; sourceTree = "<group>"; }; | ||
| 67 | 3C0631CE1F0CBE210089D0AB /* bol.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bol.hpp; sourceTree = "<group>"; }; | ||
| 68 | 3C0631CF1F0CBE210089D0AB /* bump_help.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bump_help.hpp; sourceTree = "<group>"; }; | ||
| 69 | 3C0631D01F0CBE210089D0AB /* bump_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bump_impl.hpp; sourceTree = "<group>"; }; | ||
| 70 | 3C0631D11F0CBE210089D0AB /* bytes.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bytes.hpp; sourceTree = "<group>"; }; | ||
| 71 | 3C0631D21F0CBE210089D0AB /* control.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = control.hpp; sourceTree = "<group>"; }; | ||
| 72 | 3C0631D31F0CBE210089D0AB /* cr_crlf_eol.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cr_crlf_eol.hpp; sourceTree = "<group>"; }; | ||
| 73 | 3C0631D41F0CBE210089D0AB /* cr_eol.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cr_eol.hpp; sourceTree = "<group>"; }; | ||
| 74 | 3C0631D51F0CBE210089D0AB /* crlf_eol.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = crlf_eol.hpp; sourceTree = "<group>"; }; | ||
| 75 | 3C0631D61F0CBE210089D0AB /* cstream_reader.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cstream_reader.hpp; sourceTree = "<group>"; }; | ||
| 76 | 3C0631D71F0CBE210089D0AB /* cstring_reader.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cstring_reader.hpp; sourceTree = "<group>"; }; | ||
| 77 | 3C0631D81F0CBE210089D0AB /* demangle.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = demangle.hpp; sourceTree = "<group>"; }; | ||
| 78 | 3C0631D91F0CBE210089D0AB /* demangle_cxxabi.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = demangle_cxxabi.hpp; sourceTree = "<group>"; }; | ||
| 79 | 3C0631DA1F0CBE210089D0AB /* demangle_nop.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = demangle_nop.hpp; sourceTree = "<group>"; }; | ||
| 80 | 3C0631DB1F0CBE210089D0AB /* demangle_sanitise.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = demangle_sanitise.hpp; sourceTree = "<group>"; }; | ||
| 81 | 3C0631DC1F0CBE210089D0AB /* disable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = disable.hpp; sourceTree = "<group>"; }; | ||
| 82 | 3C0631DD1F0CBE210089D0AB /* discard.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = discard.hpp; sourceTree = "<group>"; }; | ||
| 83 | 3C0631DE1F0CBE210089D0AB /* dusel_mode.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dusel_mode.hpp; sourceTree = "<group>"; }; | ||
| 84 | 3C0631DF1F0CBE210089D0AB /* duseltronik.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = duseltronik.hpp; sourceTree = "<group>"; }; | ||
| 85 | 3C0631E01F0CBE210089D0AB /* enable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = enable.hpp; sourceTree = "<group>"; }; | ||
| 86 | 3C0631E11F0CBE210089D0AB /* eof.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = eof.hpp; sourceTree = "<group>"; }; | ||
| 87 | 3C0631E21F0CBE210089D0AB /* eol.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = eol.hpp; sourceTree = "<group>"; }; | ||
| 88 | 3C0631E31F0CBE210089D0AB /* eolf.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = eolf.hpp; sourceTree = "<group>"; }; | ||
| 89 | 3C0631E41F0CBE210089D0AB /* file_mapper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = file_mapper.hpp; sourceTree = "<group>"; }; | ||
| 90 | 3C0631E51F0CBE210089D0AB /* file_opener.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = file_opener.hpp; sourceTree = "<group>"; }; | ||
| 91 | 3C0631E61F0CBE210089D0AB /* file_reader.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = file_reader.hpp; sourceTree = "<group>"; }; | ||
| 92 | 3C0631E71F0CBE210089D0AB /* has_apply0.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = has_apply0.hpp; sourceTree = "<group>"; }; | ||
| 93 | 3C0631E81F0CBE210089D0AB /* identifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = identifier.hpp; sourceTree = "<group>"; }; | ||
| 94 | 3C0631E91F0CBE210089D0AB /* if_apply.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = if_apply.hpp; sourceTree = "<group>"; }; | ||
| 95 | 3C0631EA1F0CBE210089D0AB /* if_must.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = if_must.hpp; sourceTree = "<group>"; }; | ||
| 96 | 3C0631EB1F0CBE210089D0AB /* if_must_else.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = if_must_else.hpp; sourceTree = "<group>"; }; | ||
| 97 | 3C0631EC1F0CBE210089D0AB /* if_then_else.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = if_then_else.hpp; sourceTree = "<group>"; }; | ||
| 98 | 3C0631ED1F0CBE210089D0AB /* input_pair.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = input_pair.hpp; sourceTree = "<group>"; }; | ||
| 99 | 3C0631EE1F0CBE210089D0AB /* integer_sequence.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = integer_sequence.hpp; sourceTree = "<group>"; }; | ||
| 100 | 3C0631EF1F0CBE210089D0AB /* istream_reader.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = istream_reader.hpp; sourceTree = "<group>"; }; | ||
| 101 | 3C0631F01F0CBE210089D0AB /* istring.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = istring.hpp; sourceTree = "<group>"; }; | ||
| 102 | 3C0631F11F0CBE210089D0AB /* iterator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = iterator.hpp; sourceTree = "<group>"; }; | ||
| 103 | 3C0631F21F0CBE210089D0AB /* lf_crlf_eol.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = lf_crlf_eol.hpp; sourceTree = "<group>"; }; | ||
| 104 | 3C0631F31F0CBE210089D0AB /* lf_eol.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = lf_eol.hpp; sourceTree = "<group>"; }; | ||
| 105 | 3C0631F41F0CBE210089D0AB /* list.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = list.hpp; sourceTree = "<group>"; }; | ||
| 106 | 3C0631F51F0CBE210089D0AB /* list_must.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = list_must.hpp; sourceTree = "<group>"; }; | ||
| 107 | 3C0631F61F0CBE210089D0AB /* list_tail.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = list_tail.hpp; sourceTree = "<group>"; }; | ||
| 108 | 3C0631F71F0CBE210089D0AB /* list_tail_pad.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = list_tail_pad.hpp; sourceTree = "<group>"; }; | ||
| 109 | 3C0631F81F0CBE210089D0AB /* marker.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = marker.hpp; sourceTree = "<group>"; }; | ||
| 110 | 3C0631F91F0CBE210089D0AB /* minus.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = minus.hpp; sourceTree = "<group>"; }; | ||
| 111 | 3C0631FA1F0CBE210089D0AB /* must.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = must.hpp; sourceTree = "<group>"; }; | ||
| 112 | 3C0631FB1F0CBE210089D0AB /* not_at.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = not_at.hpp; sourceTree = "<group>"; }; | ||
| 113 | 3C0631FC1F0CBE210089D0AB /* one.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = one.hpp; sourceTree = "<group>"; }; | ||
| 114 | 3C0631FD1F0CBE210089D0AB /* opt.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = opt.hpp; sourceTree = "<group>"; }; | ||
| 115 | 3C0631FE1F0CBE210089D0AB /* pad.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = pad.hpp; sourceTree = "<group>"; }; | ||
| 116 | 3C0631FF1F0CBE210089D0AB /* pad_opt.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = pad_opt.hpp; sourceTree = "<group>"; }; | ||
| 117 | 3C0632001F0CBE210089D0AB /* peek_char.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = peek_char.hpp; sourceTree = "<group>"; }; | ||
| 118 | 3C0632011F0CBE210089D0AB /* peek_utf16.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = peek_utf16.hpp; sourceTree = "<group>"; }; | ||
| 119 | 3C0632021F0CBE210089D0AB /* peek_utf32.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = peek_utf32.hpp; sourceTree = "<group>"; }; | ||
| 120 | 3C0632031F0CBE210089D0AB /* peek_utf8.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = peek_utf8.hpp; sourceTree = "<group>"; }; | ||
| 121 | 3C0632041F0CBE210089D0AB /* pegtl_string.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = pegtl_string.hpp; sourceTree = "<group>"; }; | ||
| 122 | 3C0632051F0CBE210089D0AB /* plus.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = plus.hpp; sourceTree = "<group>"; }; | ||
| 123 | 3C0632061F0CBE210089D0AB /* raise.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = raise.hpp; sourceTree = "<group>"; }; | ||
| 124 | 3C0632071F0CBE210089D0AB /* range.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = range.hpp; sourceTree = "<group>"; }; | ||
| 125 | 3C0632081F0CBE210089D0AB /* ranges.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ranges.hpp; sourceTree = "<group>"; }; | ||
| 126 | 3C0632091F0CBE210089D0AB /* rep.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rep.hpp; sourceTree = "<group>"; }; | ||
| 127 | 3C06320A1F0CBE210089D0AB /* rep_min.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rep_min.hpp; sourceTree = "<group>"; }; | ||
| 128 | 3C06320B1F0CBE210089D0AB /* rep_min_max.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rep_min_max.hpp; sourceTree = "<group>"; }; | ||
| 129 | 3C06320C1F0CBE210089D0AB /* rep_opt.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rep_opt.hpp; sourceTree = "<group>"; }; | ||
| 130 | 3C06320D1F0CBE210089D0AB /* require.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = require.hpp; sourceTree = "<group>"; }; | ||
| 131 | 3C06320E1F0CBE210089D0AB /* result_on_found.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = result_on_found.hpp; sourceTree = "<group>"; }; | ||
| 132 | 3C06320F1F0CBE210089D0AB /* rule_conjunction.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rule_conjunction.hpp; sourceTree = "<group>"; }; | ||
| 133 | 3C0632101F0CBE210089D0AB /* rules.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rules.hpp; sourceTree = "<group>"; }; | ||
| 134 | 3C0632111F0CBE210089D0AB /* seq.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = seq.hpp; sourceTree = "<group>"; }; | ||
| 135 | 3C0632121F0CBE210089D0AB /* skip_control.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = skip_control.hpp; sourceTree = "<group>"; }; | ||
| 136 | 3C0632131F0CBE210089D0AB /* sor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = sor.hpp; sourceTree = "<group>"; }; | ||
| 137 | 3C0632141F0CBE210089D0AB /* star.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = star.hpp; sourceTree = "<group>"; }; | ||
| 138 | 3C0632151F0CBE210089D0AB /* star_must.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = star_must.hpp; sourceTree = "<group>"; }; | ||
| 139 | 3C0632161F0CBE210089D0AB /* state.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = state.hpp; sourceTree = "<group>"; }; | ||
| 140 | 3C0632171F0CBE210089D0AB /* string.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = string.hpp; sourceTree = "<group>"; }; | ||
| 141 | 3C0632181F0CBE210089D0AB /* trivial.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = trivial.hpp; sourceTree = "<group>"; }; | ||
| 142 | 3C0632191F0CBE210089D0AB /* try_catch_type.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = try_catch_type.hpp; sourceTree = "<group>"; }; | ||
| 143 | 3C06321A1F0CBE210089D0AB /* until.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = until.hpp; sourceTree = "<group>"; }; | ||
| 144 | 3C06321B1F0CBE210089D0AB /* istream_input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = istream_input.hpp; sourceTree = "<group>"; }; | ||
| 145 | 3C06321C1F0CBE210089D0AB /* memory_input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = memory_input.hpp; sourceTree = "<group>"; }; | ||
| 146 | 3C06321D1F0CBE210089D0AB /* mmap_input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mmap_input.hpp; sourceTree = "<group>"; }; | ||
| 147 | 3C06321E1F0CBE210089D0AB /* normal.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = normal.hpp; sourceTree = "<group>"; }; | ||
| 148 | 3C06321F1F0CBE210089D0AB /* nothing.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = nothing.hpp; sourceTree = "<group>"; }; | ||
| 149 | 3C0632201F0CBE210089D0AB /* parse.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = parse.hpp; sourceTree = "<group>"; }; | ||
| 150 | 3C0632211F0CBE210089D0AB /* parse_error.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = parse_error.hpp; sourceTree = "<group>"; }; | ||
| 151 | 3C0632221F0CBE210089D0AB /* position.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = position.hpp; sourceTree = "<group>"; }; | ||
| 152 | 3C0632231F0CBE210089D0AB /* read_input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = read_input.hpp; sourceTree = "<group>"; }; | ||
| 153 | 3C0632241F0CBE210089D0AB /* rewind_mode.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rewind_mode.hpp; sourceTree = "<group>"; }; | ||
| 154 | 3C0632251F0CBE210089D0AB /* rules.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rules.hpp; sourceTree = "<group>"; }; | ||
| 155 | 3C0632261F0CBE210089D0AB /* string_input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = string_input.hpp; sourceTree = "<group>"; }; | ||
| 156 | 3C0632271F0CBE210089D0AB /* tracking_mode.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tracking_mode.hpp; sourceTree = "<group>"; }; | ||
| 157 | 3C0632281F0CBE210089D0AB /* utf16.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = utf16.hpp; sourceTree = "<group>"; }; | ||
| 158 | 3C0632291F0CBE210089D0AB /* utf32.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = utf32.hpp; sourceTree = "<group>"; }; | ||
| 159 | 3C06322A1F0CBE210089D0AB /* utf8.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = utf8.hpp; sourceTree = "<group>"; }; | ||
| 160 | 3C06322B1F0CBE210089D0AB /* version.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = version.hpp; sourceTree = "<group>"; }; | ||
| 161 | 3C06322C1F0CBE210089D0AB /* pegtl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = pegtl.hpp; sourceTree = "<group>"; }; | ||
| 162 | 3C06322D1F0CBE210089D0AB /* slice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slice.cpp; sourceTree = "<group>"; }; | ||
| 163 | 3C06322E1F0CBE210089D0AB /* slice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slice.h; sourceTree = "<group>"; }; | ||
| 164 | 3C0F0F6C1EF3781E000EADDB /* MoonParser */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MoonParser; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
| 165 | /* End PBXFileReference section */ | ||
| 166 | |||
| 167 | /* Begin PBXFrameworksBuildPhase section */ | ||
| 168 | 3C0F0F691EF3781E000EADDB /* Frameworks */ = { | ||
| 169 | isa = PBXFrameworksBuildPhase; | ||
| 170 | buildActionMask = 2147483647; | ||
| 171 | files = ( | ||
| 172 | ); | ||
| 173 | runOnlyForDeploymentPostprocessing = 0; | ||
| 174 | }; | ||
| 175 | /* End PBXFrameworksBuildPhase section */ | ||
| 176 | |||
| 177 | /* Begin PBXGroup section */ | ||
| 178 | 3C0631A11F0CBE210089D0AB /* MoonParser */ = { | ||
| 179 | isa = PBXGroup; | ||
| 180 | children = ( | ||
| 181 | 3C0631A21F0CBE210089D0AB /* main.cpp */, | ||
| 182 | 3C0631A31F0CBE210089D0AB /* pegtl */, | ||
| 183 | 3C06322C1F0CBE210089D0AB /* pegtl.hpp */, | ||
| 184 | 3C06322D1F0CBE210089D0AB /* slice.cpp */, | ||
| 185 | 3C06322E1F0CBE210089D0AB /* slice.h */, | ||
| 186 | ); | ||
| 187 | path = MoonParser; | ||
| 188 | sourceTree = "<group>"; | ||
| 189 | }; | ||
| 190 | 3C0631A31F0CBE210089D0AB /* pegtl */ = { | ||
| 191 | isa = PBXGroup; | ||
| 192 | children = ( | ||
| 193 | 3C0631A41F0CBE210089D0AB /* analysis */, | ||
| 194 | 3C0631AD1F0CBE210089D0AB /* analyze.hpp */, | ||
| 195 | 3C0631AE1F0CBE210089D0AB /* apply_mode.hpp */, | ||
| 196 | 3C0631AF1F0CBE210089D0AB /* argv_input.hpp */, | ||
| 197 | 3C0631B01F0CBE210089D0AB /* ascii.hpp */, | ||
| 198 | 3C0631B11F0CBE210089D0AB /* buffer_input.hpp */, | ||
| 199 | 3C0631B21F0CBE210089D0AB /* config.hpp */, | ||
| 200 | 3C0631B31F0CBE210089D0AB /* contrib */, | ||
| 201 | 3C0631C01F0CBE210089D0AB /* cstream_input.hpp */, | ||
| 202 | 3C0631C11F0CBE210089D0AB /* eol.hpp */, | ||
| 203 | 3C0631C21F0CBE210089D0AB /* file_input.hpp */, | ||
| 204 | 3C0631C31F0CBE210089D0AB /* input_error.hpp */, | ||
| 205 | 3C0631C41F0CBE210089D0AB /* internal */, | ||
| 206 | 3C06321B1F0CBE210089D0AB /* istream_input.hpp */, | ||
| 207 | 3C06321C1F0CBE210089D0AB /* memory_input.hpp */, | ||
| 208 | 3C06321D1F0CBE210089D0AB /* mmap_input.hpp */, | ||
| 209 | 3C06321E1F0CBE210089D0AB /* normal.hpp */, | ||
| 210 | 3C06321F1F0CBE210089D0AB /* nothing.hpp */, | ||
| 211 | 3C0632201F0CBE210089D0AB /* parse.hpp */, | ||
| 212 | 3C0632211F0CBE210089D0AB /* parse_error.hpp */, | ||
| 213 | 3C0632221F0CBE210089D0AB /* position.hpp */, | ||
| 214 | 3C0632231F0CBE210089D0AB /* read_input.hpp */, | ||
| 215 | 3C0632241F0CBE210089D0AB /* rewind_mode.hpp */, | ||
| 216 | 3C0632251F0CBE210089D0AB /* rules.hpp */, | ||
| 217 | 3C0632261F0CBE210089D0AB /* string_input.hpp */, | ||
| 218 | 3C0632271F0CBE210089D0AB /* tracking_mode.hpp */, | ||
| 219 | 3C0632281F0CBE210089D0AB /* utf16.hpp */, | ||
| 220 | 3C0632291F0CBE210089D0AB /* utf32.hpp */, | ||
| 221 | 3C06322A1F0CBE210089D0AB /* utf8.hpp */, | ||
| 222 | 3C06322B1F0CBE210089D0AB /* version.hpp */, | ||
| 223 | ); | ||
| 224 | path = pegtl; | ||
| 225 | sourceTree = "<group>"; | ||
| 226 | }; | ||
| 227 | 3C0631A41F0CBE210089D0AB /* analysis */ = { | ||
| 228 | isa = PBXGroup; | ||
| 229 | children = ( | ||
| 230 | 3C0631A51F0CBE210089D0AB /* analyze_cycles.hpp */, | ||
| 231 | 3C0631A61F0CBE210089D0AB /* counted.hpp */, | ||
| 232 | 3C0631A71F0CBE210089D0AB /* generic.hpp */, | ||
| 233 | 3C0631A81F0CBE210089D0AB /* grammar_info.hpp */, | ||
| 234 | 3C0631A91F0CBE210089D0AB /* insert_guard.hpp */, | ||
| 235 | 3C0631AA1F0CBE210089D0AB /* insert_rules.hpp */, | ||
| 236 | 3C0631AB1F0CBE210089D0AB /* rule_info.hpp */, | ||
| 237 | 3C0631AC1F0CBE210089D0AB /* rule_type.hpp */, | ||
| 238 | ); | ||
| 239 | path = analysis; | ||
| 240 | sourceTree = "<group>"; | ||
| 241 | }; | ||
| 242 | 3C0631B31F0CBE210089D0AB /* contrib */ = { | ||
| 243 | isa = PBXGroup; | ||
| 244 | children = ( | ||
| 245 | 3C0631B41F0CBE210089D0AB /* abnf.hpp */, | ||
| 246 | 3C0631B51F0CBE210089D0AB /* alphabet.hpp */, | ||
| 247 | 3C0631B61F0CBE210089D0AB /* changes.hpp */, | ||
| 248 | 3C0631B71F0CBE210089D0AB /* counter.hpp */, | ||
| 249 | 3C0631B81F0CBE210089D0AB /* http.hpp */, | ||
| 250 | 3C0631B91F0CBE210089D0AB /* json.hpp */, | ||
| 251 | 3C0631BA1F0CBE210089D0AB /* raw_string.hpp */, | ||
| 252 | 3C0631BB1F0CBE210089D0AB /* rep_one_min_max.hpp */, | ||
| 253 | 3C0631BC1F0CBE210089D0AB /* to_string.hpp */, | ||
| 254 | 3C0631BD1F0CBE210089D0AB /* tracer.hpp */, | ||
| 255 | 3C0631BE1F0CBE210089D0AB /* unescape.hpp */, | ||
| 256 | 3C0631BF1F0CBE210089D0AB /* uri.hpp */, | ||
| 257 | ); | ||
| 258 | path = contrib; | ||
| 259 | sourceTree = "<group>"; | ||
| 260 | }; | ||
| 261 | 3C0631C41F0CBE210089D0AB /* internal */ = { | ||
| 262 | isa = PBXGroup; | ||
| 263 | children = ( | ||
| 264 | 3C0631C51F0CBE210089D0AB /* action.hpp */, | ||
| 265 | 3C0631C61F0CBE210089D0AB /* action_input.hpp */, | ||
| 266 | 3C0631C71F0CBE210089D0AB /* alnum.hpp */, | ||
| 267 | 3C0631C81F0CBE210089D0AB /* alpha.hpp */, | ||
| 268 | 3C0631C91F0CBE210089D0AB /* any.hpp */, | ||
| 269 | 3C0631CA1F0CBE210089D0AB /* apply.hpp */, | ||
| 270 | 3C0631CB1F0CBE210089D0AB /* apply0.hpp */, | ||
| 271 | 3C0631CC1F0CBE210089D0AB /* at.hpp */, | ||
| 272 | 3C0631CD1F0CBE210089D0AB /* bof.hpp */, | ||
| 273 | 3C0631CE1F0CBE210089D0AB /* bol.hpp */, | ||
| 274 | 3C0631CF1F0CBE210089D0AB /* bump_help.hpp */, | ||
| 275 | 3C0631D01F0CBE210089D0AB /* bump_impl.hpp */, | ||
| 276 | 3C0631D11F0CBE210089D0AB /* bytes.hpp */, | ||
| 277 | 3C0631D21F0CBE210089D0AB /* control.hpp */, | ||
| 278 | 3C0631D31F0CBE210089D0AB /* cr_crlf_eol.hpp */, | ||
| 279 | 3C0631D41F0CBE210089D0AB /* cr_eol.hpp */, | ||
| 280 | 3C0631D51F0CBE210089D0AB /* crlf_eol.hpp */, | ||
| 281 | 3C0631D61F0CBE210089D0AB /* cstream_reader.hpp */, | ||
| 282 | 3C0631D71F0CBE210089D0AB /* cstring_reader.hpp */, | ||
| 283 | 3C0631D81F0CBE210089D0AB /* demangle.hpp */, | ||
| 284 | 3C0631D91F0CBE210089D0AB /* demangle_cxxabi.hpp */, | ||
| 285 | 3C0631DA1F0CBE210089D0AB /* demangle_nop.hpp */, | ||
| 286 | 3C0631DB1F0CBE210089D0AB /* demangle_sanitise.hpp */, | ||
| 287 | 3C0631DC1F0CBE210089D0AB /* disable.hpp */, | ||
| 288 | 3C0631DD1F0CBE210089D0AB /* discard.hpp */, | ||
| 289 | 3C0631DE1F0CBE210089D0AB /* dusel_mode.hpp */, | ||
| 290 | 3C0631DF1F0CBE210089D0AB /* duseltronik.hpp */, | ||
| 291 | 3C0631E01F0CBE210089D0AB /* enable.hpp */, | ||
| 292 | 3C0631E11F0CBE210089D0AB /* eof.hpp */, | ||
| 293 | 3C0631E21F0CBE210089D0AB /* eol.hpp */, | ||
| 294 | 3C0631E31F0CBE210089D0AB /* eolf.hpp */, | ||
| 295 | 3C0631E41F0CBE210089D0AB /* file_mapper.hpp */, | ||
| 296 | 3C0631E51F0CBE210089D0AB /* file_opener.hpp */, | ||
| 297 | 3C0631E61F0CBE210089D0AB /* file_reader.hpp */, | ||
| 298 | 3C0631E71F0CBE210089D0AB /* has_apply0.hpp */, | ||
| 299 | 3C0631E81F0CBE210089D0AB /* identifier.hpp */, | ||
| 300 | 3C0631E91F0CBE210089D0AB /* if_apply.hpp */, | ||
| 301 | 3C0631EA1F0CBE210089D0AB /* if_must.hpp */, | ||
| 302 | 3C0631EB1F0CBE210089D0AB /* if_must_else.hpp */, | ||
| 303 | 3C0631EC1F0CBE210089D0AB /* if_then_else.hpp */, | ||
| 304 | 3C0631ED1F0CBE210089D0AB /* input_pair.hpp */, | ||
| 305 | 3C0631EE1F0CBE210089D0AB /* integer_sequence.hpp */, | ||
| 306 | 3C0631EF1F0CBE210089D0AB /* istream_reader.hpp */, | ||
| 307 | 3C0631F01F0CBE210089D0AB /* istring.hpp */, | ||
| 308 | 3C0631F11F0CBE210089D0AB /* iterator.hpp */, | ||
| 309 | 3C0631F21F0CBE210089D0AB /* lf_crlf_eol.hpp */, | ||
| 310 | 3C0631F31F0CBE210089D0AB /* lf_eol.hpp */, | ||
| 311 | 3C0631F41F0CBE210089D0AB /* list.hpp */, | ||
| 312 | 3C0631F51F0CBE210089D0AB /* list_must.hpp */, | ||
| 313 | 3C0631F61F0CBE210089D0AB /* list_tail.hpp */, | ||
| 314 | 3C0631F71F0CBE210089D0AB /* list_tail_pad.hpp */, | ||
| 315 | 3C0631F81F0CBE210089D0AB /* marker.hpp */, | ||
| 316 | 3C0631F91F0CBE210089D0AB /* minus.hpp */, | ||
| 317 | 3C0631FA1F0CBE210089D0AB /* must.hpp */, | ||
| 318 | 3C0631FB1F0CBE210089D0AB /* not_at.hpp */, | ||
| 319 | 3C0631FC1F0CBE210089D0AB /* one.hpp */, | ||
| 320 | 3C0631FD1F0CBE210089D0AB /* opt.hpp */, | ||
| 321 | 3C0631FE1F0CBE210089D0AB /* pad.hpp */, | ||
| 322 | 3C0631FF1F0CBE210089D0AB /* pad_opt.hpp */, | ||
| 323 | 3C0632001F0CBE210089D0AB /* peek_char.hpp */, | ||
| 324 | 3C0632011F0CBE210089D0AB /* peek_utf16.hpp */, | ||
| 325 | 3C0632021F0CBE210089D0AB /* peek_utf32.hpp */, | ||
| 326 | 3C0632031F0CBE210089D0AB /* peek_utf8.hpp */, | ||
| 327 | 3C0632041F0CBE210089D0AB /* pegtl_string.hpp */, | ||
| 328 | 3C0632051F0CBE210089D0AB /* plus.hpp */, | ||
| 329 | 3C0632061F0CBE210089D0AB /* raise.hpp */, | ||
| 330 | 3C0632071F0CBE210089D0AB /* range.hpp */, | ||
| 331 | 3C0632081F0CBE210089D0AB /* ranges.hpp */, | ||
| 332 | 3C0632091F0CBE210089D0AB /* rep.hpp */, | ||
| 333 | 3C06320A1F0CBE210089D0AB /* rep_min.hpp */, | ||
| 334 | 3C06320B1F0CBE210089D0AB /* rep_min_max.hpp */, | ||
| 335 | 3C06320C1F0CBE210089D0AB /* rep_opt.hpp */, | ||
| 336 | 3C06320D1F0CBE210089D0AB /* require.hpp */, | ||
| 337 | 3C06320E1F0CBE210089D0AB /* result_on_found.hpp */, | ||
| 338 | 3C06320F1F0CBE210089D0AB /* rule_conjunction.hpp */, | ||
| 339 | 3C0632101F0CBE210089D0AB /* rules.hpp */, | ||
| 340 | 3C0632111F0CBE210089D0AB /* seq.hpp */, | ||
| 341 | 3C0632121F0CBE210089D0AB /* skip_control.hpp */, | ||
| 342 | 3C0632131F0CBE210089D0AB /* sor.hpp */, | ||
| 343 | 3C0632141F0CBE210089D0AB /* star.hpp */, | ||
| 344 | 3C0632151F0CBE210089D0AB /* star_must.hpp */, | ||
| 345 | 3C0632161F0CBE210089D0AB /* state.hpp */, | ||
| 346 | 3C0632171F0CBE210089D0AB /* string.hpp */, | ||
| 347 | 3C0632181F0CBE210089D0AB /* trivial.hpp */, | ||
| 348 | 3C0632191F0CBE210089D0AB /* try_catch_type.hpp */, | ||
| 349 | 3C06321A1F0CBE210089D0AB /* until.hpp */, | ||
| 350 | ); | ||
| 351 | path = internal; | ||
| 352 | sourceTree = "<group>"; | ||
| 353 | }; | ||
| 354 | 3C0F0F631EF3781E000EADDB = { | ||
| 355 | isa = PBXGroup; | ||
| 356 | children = ( | ||
| 357 | 3C0631A11F0CBE210089D0AB /* MoonParser */, | ||
| 358 | 3C0F0F6D1EF3781E000EADDB /* Products */, | ||
| 359 | ); | ||
| 360 | sourceTree = "<group>"; | ||
| 361 | }; | ||
| 362 | 3C0F0F6D1EF3781E000EADDB /* Products */ = { | ||
| 363 | isa = PBXGroup; | ||
| 364 | children = ( | ||
| 365 | 3C0F0F6C1EF3781E000EADDB /* MoonParser */, | ||
| 366 | ); | ||
| 367 | name = Products; | ||
| 368 | sourceTree = "<group>"; | ||
| 369 | }; | ||
| 370 | /* End PBXGroup section */ | ||
| 371 | |||
| 372 | /* Begin PBXNativeTarget section */ | ||
| 373 | 3C0F0F6B1EF3781E000EADDB /* MoonParser */ = { | ||
| 374 | isa = PBXNativeTarget; | ||
| 375 | buildConfigurationList = 3C0F0F731EF3781E000EADDB /* Build configuration list for PBXNativeTarget "MoonParser" */; | ||
| 376 | buildPhases = ( | ||
| 377 | 3C0F0F681EF3781E000EADDB /* Sources */, | ||
| 378 | 3C0F0F691EF3781E000EADDB /* Frameworks */, | ||
| 379 | 3C0F0F6A1EF3781E000EADDB /* CopyFiles */, | ||
| 380 | ); | ||
| 381 | buildRules = ( | ||
| 382 | ); | ||
| 383 | dependencies = ( | ||
| 384 | ); | ||
| 385 | name = MoonParser; | ||
| 386 | productName = PegtlStudy; | ||
| 387 | productReference = 3C0F0F6C1EF3781E000EADDB /* MoonParser */; | ||
| 388 | productType = "com.apple.product-type.tool"; | ||
| 389 | }; | ||
| 390 | /* End PBXNativeTarget section */ | ||
| 391 | |||
| 392 | /* Begin PBXProject section */ | ||
| 393 | 3C0F0F641EF3781E000EADDB /* Project object */ = { | ||
| 394 | isa = PBXProject; | ||
| 395 | attributes = { | ||
| 396 | LastUpgradeCheck = 0820; | ||
| 397 | ORGANIZATIONNAME = "Li Jin"; | ||
| 398 | TargetAttributes = { | ||
| 399 | 3C0F0F6B1EF3781E000EADDB = { | ||
| 400 | CreatedOnToolsVersion = 8.2.1; | ||
| 401 | ProvisioningStyle = Automatic; | ||
| 402 | }; | ||
| 403 | }; | ||
| 404 | }; | ||
| 405 | buildConfigurationList = 3C0F0F671EF3781E000EADDB /* Build configuration list for PBXProject "MoonParser" */; | ||
| 406 | compatibilityVersion = "Xcode 3.2"; | ||
| 407 | developmentRegion = English; | ||
| 408 | hasScannedForEncodings = 0; | ||
| 409 | knownRegions = ( | ||
| 410 | en, | ||
| 411 | ); | ||
| 412 | mainGroup = 3C0F0F631EF3781E000EADDB; | ||
| 413 | productRefGroup = 3C0F0F6D1EF3781E000EADDB /* Products */; | ||
| 414 | projectDirPath = ""; | ||
| 415 | projectRoot = ""; | ||
| 416 | targets = ( | ||
| 417 | 3C0F0F6B1EF3781E000EADDB /* MoonParser */, | ||
| 418 | ); | ||
| 419 | }; | ||
| 420 | /* End PBXProject section */ | ||
| 421 | |||
| 422 | /* Begin PBXSourcesBuildPhase section */ | ||
| 423 | 3C0F0F681EF3781E000EADDB /* Sources */ = { | ||
| 424 | isa = PBXSourcesBuildPhase; | ||
| 425 | buildActionMask = 2147483647; | ||
| 426 | files = ( | ||
| 427 | 3C0632301F0CBE210089D0AB /* slice.cpp in Sources */, | ||
| 428 | 3C06322F1F0CBE210089D0AB /* main.cpp in Sources */, | ||
| 429 | ); | ||
| 430 | runOnlyForDeploymentPostprocessing = 0; | ||
| 431 | }; | ||
| 432 | /* End PBXSourcesBuildPhase section */ | ||
| 433 | |||
| 434 | /* Begin XCBuildConfiguration section */ | ||
| 435 | 3C0F0F711EF3781E000EADDB /* Debug */ = { | ||
| 436 | isa = XCBuildConfiguration; | ||
| 437 | buildSettings = { | ||
| 438 | ALWAYS_SEARCH_USER_PATHS = NO; | ||
| 439 | CLANG_ANALYZER_NONNULL = YES; | ||
| 440 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||
| 441 | CLANG_CXX_LIBRARY = "libc++"; | ||
| 442 | CLANG_ENABLE_MODULES = YES; | ||
| 443 | CLANG_ENABLE_OBJC_ARC = YES; | ||
| 444 | CLANG_WARN_BOOL_CONVERSION = YES; | ||
| 445 | CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
| 446 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
| 447 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||
| 448 | CLANG_WARN_EMPTY_BODY = YES; | ||
| 449 | CLANG_WARN_ENUM_CONVERSION = YES; | ||
| 450 | CLANG_WARN_INFINITE_RECURSION = YES; | ||
| 451 | CLANG_WARN_INT_CONVERSION = YES; | ||
| 452 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
| 453 | CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||
| 454 | CLANG_WARN_UNREACHABLE_CODE = YES; | ||
| 455 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
| 456 | CODE_SIGN_IDENTITY = "-"; | ||
| 457 | COPY_PHASE_STRIP = NO; | ||
| 458 | DEBUG_INFORMATION_FORMAT = dwarf; | ||
| 459 | ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
| 460 | ENABLE_TESTABILITY = YES; | ||
| 461 | GCC_C_LANGUAGE_STANDARD = gnu99; | ||
| 462 | GCC_DYNAMIC_NO_PIC = NO; | ||
| 463 | GCC_NO_COMMON_BLOCKS = YES; | ||
| 464 | GCC_OPTIMIZATION_LEVEL = 0; | ||
| 465 | GCC_PREPROCESSOR_DEFINITIONS = ( | ||
| 466 | "DEBUG=1", | ||
| 467 | "$(inherited)", | ||
| 468 | ); | ||
| 469 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
| 470 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
| 471 | GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
| 472 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
| 473 | GCC_WARN_UNUSED_FUNCTION = YES; | ||
| 474 | GCC_WARN_UNUSED_VARIABLE = YES; | ||
| 475 | MACOSX_DEPLOYMENT_TARGET = 10.12; | ||
| 476 | MTL_ENABLE_DEBUG_INFO = YES; | ||
| 477 | ONLY_ACTIVE_ARCH = YES; | ||
| 478 | SDKROOT = macosx; | ||
| 479 | }; | ||
| 480 | name = Debug; | ||
| 481 | }; | ||
| 482 | 3C0F0F721EF3781E000EADDB /* Release */ = { | ||
| 483 | isa = XCBuildConfiguration; | ||
| 484 | buildSettings = { | ||
| 485 | ALWAYS_SEARCH_USER_PATHS = NO; | ||
| 486 | CLANG_ANALYZER_NONNULL = YES; | ||
| 487 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||
| 488 | CLANG_CXX_LIBRARY = "libc++"; | ||
| 489 | CLANG_ENABLE_MODULES = YES; | ||
| 490 | CLANG_ENABLE_OBJC_ARC = YES; | ||
| 491 | CLANG_WARN_BOOL_CONVERSION = YES; | ||
| 492 | CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
| 493 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
| 494 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||
| 495 | CLANG_WARN_EMPTY_BODY = YES; | ||
| 496 | CLANG_WARN_ENUM_CONVERSION = YES; | ||
| 497 | CLANG_WARN_INFINITE_RECURSION = YES; | ||
| 498 | CLANG_WARN_INT_CONVERSION = YES; | ||
| 499 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
| 500 | CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||
| 501 | CLANG_WARN_UNREACHABLE_CODE = YES; | ||
| 502 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
| 503 | CODE_SIGN_IDENTITY = "-"; | ||
| 504 | COPY_PHASE_STRIP = NO; | ||
| 505 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||
| 506 | ENABLE_NS_ASSERTIONS = NO; | ||
| 507 | ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
| 508 | GCC_C_LANGUAGE_STANDARD = gnu99; | ||
| 509 | GCC_NO_COMMON_BLOCKS = YES; | ||
| 510 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
| 511 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
| 512 | GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
| 513 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
| 514 | GCC_WARN_UNUSED_FUNCTION = YES; | ||
| 515 | GCC_WARN_UNUSED_VARIABLE = YES; | ||
| 516 | MACOSX_DEPLOYMENT_TARGET = 10.12; | ||
| 517 | MTL_ENABLE_DEBUG_INFO = NO; | ||
| 518 | SDKROOT = macosx; | ||
| 519 | }; | ||
| 520 | name = Release; | ||
| 521 | }; | ||
| 522 | 3C0F0F741EF3781E000EADDB /* Debug */ = { | ||
| 523 | isa = XCBuildConfiguration; | ||
| 524 | buildSettings = { | ||
| 525 | OTHER_CPLUSPLUSFLAGS = ( | ||
| 526 | "$(OTHER_CFLAGS)", | ||
| 527 | "-ftemplate-depth=512", | ||
| 528 | ); | ||
| 529 | PRODUCT_NAME = "$(TARGET_NAME)"; | ||
| 530 | }; | ||
| 531 | name = Debug; | ||
| 532 | }; | ||
| 533 | 3C0F0F751EF3781E000EADDB /* Release */ = { | ||
| 534 | isa = XCBuildConfiguration; | ||
| 535 | buildSettings = { | ||
| 536 | OTHER_CPLUSPLUSFLAGS = ( | ||
| 537 | "$(OTHER_CFLAGS)", | ||
| 538 | "-ftemplate-depth=512", | ||
| 539 | ); | ||
| 540 | PRODUCT_NAME = "$(TARGET_NAME)"; | ||
| 541 | }; | ||
| 542 | name = Release; | ||
| 543 | }; | ||
| 544 | /* End XCBuildConfiguration section */ | ||
| 545 | |||
| 546 | /* Begin XCConfigurationList section */ | ||
| 547 | 3C0F0F671EF3781E000EADDB /* Build configuration list for PBXProject "MoonParser" */ = { | ||
| 548 | isa = XCConfigurationList; | ||
| 549 | buildConfigurations = ( | ||
| 550 | 3C0F0F711EF3781E000EADDB /* Debug */, | ||
| 551 | 3C0F0F721EF3781E000EADDB /* Release */, | ||
| 552 | ); | ||
| 553 | defaultConfigurationIsVisible = 0; | ||
| 554 | defaultConfigurationName = Release; | ||
| 555 | }; | ||
| 556 | 3C0F0F731EF3781E000EADDB /* Build configuration list for PBXNativeTarget "MoonParser" */ = { | ||
| 557 | isa = XCConfigurationList; | ||
| 558 | buildConfigurations = ( | ||
| 559 | 3C0F0F741EF3781E000EADDB /* Debug */, | ||
| 560 | 3C0F0F751EF3781E000EADDB /* Release */, | ||
| 561 | ); | ||
| 562 | defaultConfigurationIsVisible = 0; | ||
| 563 | defaultConfigurationName = Release; | ||
| 564 | }; | ||
| 565 | /* End XCConfigurationList section */ | ||
| 566 | }; | ||
| 567 | rootObject = 3C0F0F641EF3781E000EADDB /* Project object */; | ||
| 568 | } | ||
diff --git a/MoonParser.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/MoonParser.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1effa34 --- /dev/null +++ b/MoonParser.xcodeproj/project.xcworkspace/contents.xcworkspacedata | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | <Workspace | ||
| 3 | version = "1.0"> | ||
| 4 | <FileRef | ||
| 5 | location = "self:/Users/Jin/Workspace/PegtlStudy/MoonParser.xcodeproj"> | ||
| 6 | </FileRef> | ||
| 7 | </Workspace> | ||
diff --git a/MoonParser/main.cpp b/MoonParser/main.cpp new file mode 100644 index 0000000..332b1b4 --- /dev/null +++ b/MoonParser/main.cpp | |||
| @@ -0,0 +1,1399 @@ | |||
| 1 | // | ||
| 2 | // main.cpp | ||
| 3 | // PegtlStudy | ||
| 4 | // | ||
| 5 | // Created by Li Jin on 2017/6/16. | ||
| 6 | // Copyright © 2017年 Li Jin. All rights reserved. | ||
| 7 | // | ||
| 8 | |||
| 9 | #include <iostream> | ||
| 10 | #include <unordered_set> | ||
| 11 | #include <vector> | ||
| 12 | #include <queue> | ||
| 13 | #include <stack> | ||
| 14 | #include "pegtl.hpp" | ||
| 15 | #include "pegtl/analyze.hpp" | ||
| 16 | #include "slice.h" | ||
| 17 | using namespace silly; | ||
| 18 | |||
| 19 | using namespace tao::pegtl; | ||
| 20 | |||
| 21 | namespace helloworld // with operator precedence climbing | ||
| 22 | { | ||
| 23 | struct Stack | ||
| 24 | { | ||
| 25 | Stack() | ||
| 26 | { | ||
| 27 | pushStack(); | ||
| 28 | } | ||
| 29 | void pushValue(int value) | ||
| 30 | { | ||
| 31 | _values.back().push(value); | ||
| 32 | } | ||
| 33 | void pushOp(char op) | ||
| 34 | { | ||
| 35 | _ops.back().push(op); | ||
| 36 | } | ||
| 37 | void pushStack() | ||
| 38 | { | ||
| 39 | _values.emplace_back(); | ||
| 40 | _ops.emplace_back(); | ||
| 41 | } | ||
| 42 | int getPriority(char op) | ||
| 43 | { | ||
| 44 | switch (op) | ||
| 45 | { | ||
| 46 | case '+': return 1; | ||
| 47 | case '-': return 1; | ||
| 48 | case '*': return 2; | ||
| 49 | case '/': return 2; | ||
| 50 | } | ||
| 51 | return 0; | ||
| 52 | } | ||
| 53 | /* | ||
| 54 | def compute_expr(tokenizer, min_prec): | ||
| 55 | atom_lhs = tokenizer.get_next_token() | ||
| 56 | |||
| 57 | while True: | ||
| 58 | cur = tokenizer.cur_token | ||
| 59 | if (cur is None or OPINFO_MAP[cur.value].prec < min_prec): | ||
| 60 | break | ||
| 61 | |||
| 62 | op = cur.value | ||
| 63 | prec, assoc = OPINFO_MAP[op] | ||
| 64 | next_min_prec = prec + 1 if assoc == 'LEFT' else prec | ||
| 65 | |||
| 66 | atom_rhs = compute_expr(tokenizer, next_min_prec) | ||
| 67 | |||
| 68 | atom_lhs = compute_op(op, atom_lhs, atom_rhs) | ||
| 69 | |||
| 70 | return atom_lhs | ||
| 71 | */ | ||
| 72 | int parseNext(int minPrecedence) | ||
| 73 | { | ||
| 74 | int lhs = _values.back().front(); | ||
| 75 | _values.back().pop(); | ||
| 76 | |||
| 77 | while (true) | ||
| 78 | { | ||
| 79 | if (_ops.back().empty()) | ||
| 80 | { | ||
| 81 | break; | ||
| 82 | } | ||
| 83 | char op = _ops.back().front(); | ||
| 84 | if (getPriority(op) < minPrecedence) | ||
| 85 | { | ||
| 86 | break; | ||
| 87 | } | ||
| 88 | _ops.back().pop(); | ||
| 89 | int nextMinPrecedence = getPriority(op) + 1; | ||
| 90 | int rhs = parseNext(nextMinPrecedence); | ||
| 91 | switch (op) | ||
| 92 | { | ||
| 93 | case '+': | ||
| 94 | std::cout << lhs << " + " << rhs << " = " << lhs+rhs << '\n'; | ||
| 95 | lhs = lhs + rhs; | ||
| 96 | break; | ||
| 97 | case '-': | ||
| 98 | std::cout << lhs << " - " << rhs << " = " << lhs-rhs << '\n'; | ||
| 99 | lhs = lhs - rhs; | ||
| 100 | break; | ||
| 101 | case '*': | ||
| 102 | std::cout << lhs << " * " << rhs << " = " << lhs*rhs << '\n'; | ||
| 103 | lhs = lhs * rhs; | ||
| 104 | break; | ||
| 105 | case '/': | ||
| 106 | std::cout << lhs << " / " << rhs << " = " << lhs/rhs << '\n'; | ||
| 107 | lhs = lhs / rhs; | ||
| 108 | break; | ||
| 109 | } | ||
| 110 | } | ||
| 111 | return lhs; | ||
| 112 | } | ||
| 113 | void popStack() | ||
| 114 | { | ||
| 115 | int value = parseNext(0); | ||
| 116 | _values.pop_back(); | ||
| 117 | if (_values.empty()) | ||
| 118 | { | ||
| 119 | _values.emplace_back(); | ||
| 120 | } | ||
| 121 | _ops.pop_back(); | ||
| 122 | if (_ops.empty()) | ||
| 123 | { | ||
| 124 | _ops.emplace_back(); | ||
| 125 | } | ||
| 126 | pushValue(value); | ||
| 127 | } | ||
| 128 | int getValue() const | ||
| 129 | { | ||
| 130 | return _values.back().back(); | ||
| 131 | } | ||
| 132 | private: | ||
| 133 | std::vector<std::queue<char>> _ops; | ||
| 134 | std::vector<std::queue<int>> _values; | ||
| 135 | }; | ||
| 136 | |||
| 137 | struct number : seq<opt<one<'+', '-'>>, plus<digit>> { }; | ||
| 138 | |||
| 139 | struct expr; | ||
| 140 | |||
| 141 | struct bracket : if_must<one<'('>, expr, one<')'>> { }; | ||
| 142 | |||
| 143 | struct atomic : sor<number, bracket> { }; | ||
| 144 | |||
| 145 | struct op : one<'+', '-', '*', '/'> { }; | ||
| 146 | |||
| 147 | struct expr : list<atomic, op, space> { }; | ||
| 148 | |||
| 149 | template<typename Rule> | ||
| 150 | struct action : nothing<Rule> { }; | ||
| 151 | |||
| 152 | template<> | ||
| 153 | struct action<number> | ||
| 154 | { | ||
| 155 | template<typename Input> | ||
| 156 | static void apply(const Input& in, Stack& stack) | ||
| 157 | { | ||
| 158 | stack.pushValue(std::stoi(in.string())); | ||
| 159 | } | ||
| 160 | }; | ||
| 161 | |||
| 162 | template<> | ||
| 163 | struct action<op> | ||
| 164 | { | ||
| 165 | template<typename Input> | ||
| 166 | static void apply(const Input& in, Stack& stack) | ||
| 167 | { | ||
| 168 | stack.pushOp(*in.begin()); | ||
| 169 | } | ||
| 170 | }; | ||
| 171 | |||
| 172 | template<> | ||
| 173 | struct action<one<'('>> | ||
| 174 | { | ||
| 175 | static void apply0(Stack& stack) | ||
| 176 | { | ||
| 177 | stack.pushStack(); | ||
| 178 | } | ||
| 179 | }; | ||
| 180 | |||
| 181 | template<> | ||
| 182 | struct action<expr> | ||
| 183 | { | ||
| 184 | template<typename Input> | ||
| 185 | static void apply(const Input& in, Stack& stack) | ||
| 186 | { | ||
| 187 | stack.popStack(); | ||
| 188 | } | ||
| 189 | }; | ||
| 190 | |||
| 191 | } // namespace hello | ||
| 192 | |||
| 193 | namespace moon | ||
| 194 | { | ||
| 195 | struct State | ||
| 196 | { | ||
| 197 | State() | ||
| 198 | { | ||
| 199 | indents.push(0); | ||
| 200 | stringOpen = -1; | ||
| 201 | } | ||
| 202 | size_t stringOpen; | ||
| 203 | std::stack<int> indents; | ||
| 204 | std::stack<bool> doStack; | ||
| 205 | std::unordered_set<std::string> keywords = | ||
| 206 | { | ||
| 207 | "and", "while", "else", "using", "continue", | ||
| 208 | "local", "not", "then", "return", "from", | ||
| 209 | "extends", "for", "do", "or", "export", | ||
| 210 | "class", "in", "unless", "when", "elseif", | ||
| 211 | "switch", "break", "if", "with", "import" | ||
| 212 | }; | ||
| 213 | }; | ||
| 214 | |||
| 215 | struct White : star<one<' ', '\t', '\r', '\n'>> {}; | ||
| 216 | struct plain_space : star<one<' ', '\t'>> {}; | ||
| 217 | struct Break : seq<opt<one<'\r'>>, one<'\n'>> {}; | ||
| 218 | struct Stop : sor<Break, eof> {}; | ||
| 219 | struct Comment : seq<string<'-', '-'>, star<not_one<'\r', '\n'>>, Stop> {}; | ||
| 220 | struct Indent : star<one<' ', '\t'>> {}; | ||
| 221 | struct Space : seq<plain_space, opt<Comment>> {}; | ||
| 222 | struct SomeSpace : seq<plus<blank>, opt<Comment>> {}; | ||
| 223 | struct SpaceBreak : seq<Space, Break> {}; | ||
| 224 | typedef SpaceBreak EmptyLine; | ||
| 225 | struct AlphaNum : ranges<'a', 'z', 'A', 'Z', '0', '9', '_', '_'> {}; | ||
| 226 | struct _Name : seq<ranges<'a', 'z', 'A', 'Z', '_', '_'>, star<AlphaNum>> {}; | ||
| 227 | struct SpaceName : seq<Space, _Name> {}; | ||
| 228 | struct _Num : sor< | ||
| 229 | seq< | ||
| 230 | string<'0' ,'x'>, | ||
| 231 | plus<ranges<'0', '9', 'a', 'f', 'A', 'F'>>, | ||
| 232 | opt<seq< | ||
| 233 | opt<one<'u', 'U'>>, one<'l', 'L'>, one<'l', 'L'> | ||
| 234 | >> | ||
| 235 | >, | ||
| 236 | seq< | ||
| 237 | plus<range<'0', '9'>>, | ||
| 238 | seq< | ||
| 239 | opt<one<'u', 'U'>>, one<'l', 'L'>, one<'l', 'L'> | ||
| 240 | > | ||
| 241 | >, | ||
| 242 | seq< | ||
| 243 | sor< | ||
| 244 | seq< | ||
| 245 | plus<range<'0', '9'>>, | ||
| 246 | opt<seq< | ||
| 247 | one<'.'>, plus<range<'0', '9'>> | ||
| 248 | >> | ||
| 249 | >, | ||
| 250 | seq< | ||
| 251 | one<'.'>, | ||
| 252 | plus<range<'0', '9'>> | ||
| 253 | > | ||
| 254 | >, | ||
| 255 | opt<seq< | ||
| 256 | one<'e', 'E'>, opt<one<'-'>>, plus<range<'0', '9'>> | ||
| 257 | >> | ||
| 258 | > | ||
| 259 | > {}; | ||
| 260 | struct Num : seq<Space, _Num> {}; | ||
| 261 | |||
| 262 | struct Cut : failure {}; | ||
| 263 | |||
| 264 | template<char... Cs> struct sym : seq<Space, string<Cs...>> {}; | ||
| 265 | template<char... Cs> struct symx : string<Cs...> {}; | ||
| 266 | |||
| 267 | template<typename patt, typename finally> | ||
| 268 | struct ensure : sor<seq<patt, finally>, seq<finally, Cut>> {}; | ||
| 269 | |||
| 270 | template<char... Cs> struct key : seq<Space, string<Cs...>, not_at<AlphaNum>> {}; | ||
| 271 | template<char... Cs> struct op : seq<Space, string<Cs...>, not_at<AlphaNum>> {}; | ||
| 272 | |||
| 273 | struct Name | ||
| 274 | { | ||
| 275 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 276 | |||
| 277 | template<apply_mode A, rewind_mode M, | ||
| 278 | template<typename...> class Action, | ||
| 279 | template<typename...> class Control, | ||
| 280 | typename Input> | ||
| 281 | static bool match(Input& in, const State& st) | ||
| 282 | { | ||
| 283 | const char* current = in.current(); | ||
| 284 | if (SpaceName::match<A, M, Action, Control>(in, st)) | ||
| 285 | { | ||
| 286 | auto name = slice::Slice(current, in.current() - current + 1); | ||
| 287 | name.trimSpace(); | ||
| 288 | auto it = st.keywords.find(name); | ||
| 289 | if (it == st.keywords.end()) | ||
| 290 | { | ||
| 291 | return true; | ||
| 292 | } | ||
| 293 | } | ||
| 294 | return false; | ||
| 295 | } | ||
| 296 | }; | ||
| 297 | |||
| 298 | struct self : one<'@'> {}; | ||
| 299 | struct self_name : seq<one<'@'>, _Name> {}; | ||
| 300 | struct self_class : string<'@', '@'> {}; | ||
| 301 | struct self_class_name : seq<string<'@', '@'>, _Name> {}; | ||
| 302 | |||
| 303 | struct SelfName : seq<Space, sor<self_class_name, self_class, self_name, self>> {}; | ||
| 304 | struct KeyName : sor<SelfName, SpaceName> {}; | ||
| 305 | struct VarArg : seq<Space, string<'.', '.', '.'>> {}; | ||
| 306 | |||
| 307 | struct CheckIndent | ||
| 308 | { | ||
| 309 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 310 | |||
| 311 | template<apply_mode A, rewind_mode M, | ||
| 312 | template<typename...> class Action, | ||
| 313 | template<typename...> class Control, | ||
| 314 | typename Input> | ||
| 315 | static bool match(Input& in, const State& st) | ||
| 316 | { | ||
| 317 | const char* current = in.current(); | ||
| 318 | if (Indent::match<A, M, Action, Control>(in, st)) | ||
| 319 | { | ||
| 320 | int indent = 0; | ||
| 321 | for (const char* ch = current; ch < in.current(); ch++) | ||
| 322 | { | ||
| 323 | switch (*ch) | ||
| 324 | { | ||
| 325 | case ' ': indent++; break; | ||
| 326 | case '\t': indent += 4; break; | ||
| 327 | } | ||
| 328 | } | ||
| 329 | return st.indents.top() == indent; | ||
| 330 | } | ||
| 331 | return false; | ||
| 332 | } | ||
| 333 | }; | ||
| 334 | |||
| 335 | struct Advance | ||
| 336 | { | ||
| 337 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 338 | |||
| 339 | template<apply_mode A, rewind_mode M, | ||
| 340 | template<typename...> class Action, | ||
| 341 | template<typename...> class Control, | ||
| 342 | typename Input> | ||
| 343 | static bool match(Input& in, State& st) | ||
| 344 | { | ||
| 345 | const char* current = in.current(); | ||
| 346 | if (Indent::match<A, M, Action, Control>(in)) | ||
| 347 | { | ||
| 348 | int indent = 0; | ||
| 349 | for (const char* ch = current; ch < in.current(); ch++) | ||
| 350 | { | ||
| 351 | switch (*ch) | ||
| 352 | { | ||
| 353 | case ' ': indent++; break; | ||
| 354 | case '\t': indent += 4; break; | ||
| 355 | } | ||
| 356 | } | ||
| 357 | int top = st.indents.top(); | ||
| 358 | if (top != -1 && indent > top) | ||
| 359 | { | ||
| 360 | st.indents.push(indent); | ||
| 361 | } | ||
| 362 | return true; | ||
| 363 | } | ||
| 364 | return false; | ||
| 365 | } | ||
| 366 | }; | ||
| 367 | |||
| 368 | struct PushIndent | ||
| 369 | { | ||
| 370 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 371 | |||
| 372 | template<apply_mode A, rewind_mode M, | ||
| 373 | template<typename...> class Action, | ||
| 374 | template<typename...> class Control, | ||
| 375 | typename Input> | ||
| 376 | static bool match(Input& in, State& st) | ||
| 377 | { | ||
| 378 | const char* current = in.current(); | ||
| 379 | if (Indent::match<A, M, Action, Control>(in)) | ||
| 380 | { | ||
| 381 | int indent = 0; | ||
| 382 | for (const char* ch = current; ch < in.current(); ch++) | ||
| 383 | { | ||
| 384 | switch (*ch) | ||
| 385 | { | ||
| 386 | case ' ': indent++; break; | ||
| 387 | case '\t': indent += 4; break; | ||
| 388 | } | ||
| 389 | } | ||
| 390 | st.indents.push(indent); | ||
| 391 | return true; | ||
| 392 | } | ||
| 393 | return false; | ||
| 394 | } | ||
| 395 | }; | ||
| 396 | |||
| 397 | struct PreventIndent | ||
| 398 | { | ||
| 399 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 400 | |||
| 401 | template<apply_mode A, rewind_mode M, | ||
| 402 | template<typename...> class Action, | ||
| 403 | template<typename...> class Control, | ||
| 404 | typename Input> | ||
| 405 | static bool match(Input& in, State& st) | ||
| 406 | { | ||
| 407 | st.indents.push(-1); | ||
| 408 | return true; | ||
| 409 | } | ||
| 410 | }; | ||
| 411 | |||
| 412 | struct PopIndent | ||
| 413 | { | ||
| 414 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 415 | |||
| 416 | template<apply_mode A, rewind_mode M, | ||
| 417 | template<typename...> class Action, | ||
| 418 | template<typename...> class Control, | ||
| 419 | typename Input> | ||
| 420 | static bool match(Input& in, State& st) | ||
| 421 | { | ||
| 422 | if (st.indents.size() > 1) st.indents.pop(); | ||
| 423 | return true; | ||
| 424 | } | ||
| 425 | }; | ||
| 426 | |||
| 427 | struct Block; | ||
| 428 | |||
| 429 | struct InBlock : seq<Advance, Block, PopIndent> {}; | ||
| 430 | |||
| 431 | struct NameList; | ||
| 432 | |||
| 433 | struct Local : seq<key<'l', 'o', 'c', 'a', 'l'>, sor<sor<op<'*'>, op<'^'>>>, NameList> {}; | ||
| 434 | |||
| 435 | struct colon_import_name : seq<one<'\\'>, Name> {}; | ||
| 436 | struct ImportName : sor<colon_import_name, Name> {}; | ||
| 437 | struct ImportNameList : seq< | ||
| 438 | star<SpaceBreak>, | ||
| 439 | ImportName, | ||
| 440 | star< | ||
| 441 | sor<plus<SpaceBreak>, seq<sym<','>, star<SpaceBreak>>>, | ||
| 442 | ImportName | ||
| 443 | > | ||
| 444 | > {}; | ||
| 445 | |||
| 446 | struct Exp; | ||
| 447 | |||
| 448 | struct Import : seq<key<'i', 'm', 'p', 'o', 'r', 't'>, ImportNameList, star<SpaceBreak>, key<'f', 'r', 'o', 'm'>, Exp> {}; | ||
| 449 | |||
| 450 | struct BreakLoop : sor<key<'b', 'r', 'e', 'a', 'k'>, key<'c', 'o', 'n', 't', 'i', 'n', 'u', 'e'>> {}; | ||
| 451 | |||
| 452 | struct ExpListLow; | ||
| 453 | |||
| 454 | struct ExpList; | ||
| 455 | struct Assign; | ||
| 456 | |||
| 457 | struct Return : seq<key<'r', 'e', 't', 'u', 'r', 'n'>, sor<ExpListLow, success>> {}; | ||
| 458 | struct WithExp : seq<ExpList, opt<Assign>> {}; | ||
| 459 | |||
| 460 | struct DisableDo; | ||
| 461 | struct PopDo; | ||
| 462 | struct Body; | ||
| 463 | |||
| 464 | struct With : seq<key<'w', 'i', 't', 'h'>, DisableDo, ensure<WithExp, PopDo>, opt<key<'d', 'o'>>, Body> {}; | ||
| 465 | |||
| 466 | struct SwitchCase : seq<key<'w', 'h', 'e', 'n'>, ExpList, opt<key<'t', 'h', 'e', 'n'>>, Body> {}; | ||
| 467 | struct SwitchElse : seq<key<'e', 'l', 's', 'e'>, Body> {}; | ||
| 468 | struct SwitchBlock : seq< | ||
| 469 | star<EmptyLine>, | ||
| 470 | Advance, | ||
| 471 | seq< | ||
| 472 | SwitchCase, | ||
| 473 | star<plus<Break>, SwitchCase>, | ||
| 474 | opt<plus<Break>, SwitchElse> | ||
| 475 | >, | ||
| 476 | PopIndent | ||
| 477 | > {}; | ||
| 478 | struct Switch : seq<key<'s', 'w', 'i', 't', 'c', 'h'>, DisableDo, ensure<Exp, PopDo>, opt<key<'d', 'o'>>, opt<Space>, Break, SwitchBlock> {}; | ||
| 479 | |||
| 480 | struct IfCond : seq<Exp, opt<Assign>> {}; | ||
| 481 | |||
| 482 | struct IfElse : seq< | ||
| 483 | opt<Break, star<EmptyLine>, CheckIndent>, | ||
| 484 | string<'e', 'l', 's', 'e'>, Body | ||
| 485 | > {}; | ||
| 486 | struct IfElseIf : seq< | ||
| 487 | opt<Break, star<EmptyLine>, CheckIndent>, | ||
| 488 | key<'e', 'l', 's', 'e', 'i', 'f'>, IfCond, | ||
| 489 | opt<key<'t', 'h', 'e', 'n'>>, Body | ||
| 490 | > {}; | ||
| 491 | |||
| 492 | struct If : seq<key<'i', 'f'>, IfCond, opt<key<'t', 'h', 'e', 'n'>>, Body, star<IfElseIf>, opt<IfElse>> {}; | ||
| 493 | struct Unless : seq<key<'u', 'n', 'l', 'e', 's', 's'>, IfCond, opt<key<'t', 'h', 'e', 'n'>>, Body, star<IfElseIf>, opt<IfElse>> {}; | ||
| 494 | |||
| 495 | struct While : seq<key<'w', 'h', 'i', 'l', 'e'>, DisableDo, ensure<Exp, PopDo>, opt<key<'d','o'>>, Body> {}; | ||
| 496 | struct For : seq<key<'f', 'o', 'r'>, DisableDo, | ||
| 497 | ensure< | ||
| 498 | seq< | ||
| 499 | Name, sym<'='>, | ||
| 500 | seq<Exp, sym<','>, Exp, opt<sym<','>, Exp>> | ||
| 501 | >, | ||
| 502 | PopDo | ||
| 503 | >, | ||
| 504 | opt<key<'d', 'o'>>, Body> {}; | ||
| 505 | |||
| 506 | struct AssignableNameList; | ||
| 507 | |||
| 508 | struct ForEach : seq< | ||
| 509 | key<'f', 'o', 'r'>, | ||
| 510 | AssignableNameList, | ||
| 511 | key<'i', 'n'>, | ||
| 512 | DisableDo, | ||
| 513 | ensure< | ||
| 514 | sor< | ||
| 515 | seq<sym<'*'>, Exp>, ExpList | ||
| 516 | >, | ||
| 517 | PopDo | ||
| 518 | > | ||
| 519 | > {}; | ||
| 520 | |||
| 521 | struct Do | ||
| 522 | { | ||
| 523 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 524 | |||
| 525 | template<apply_mode A, rewind_mode M, | ||
| 526 | template<typename...> class Action, | ||
| 527 | template<typename...> class Control, | ||
| 528 | typename Input> | ||
| 529 | static bool match(Input& in, State& st) | ||
| 530 | { | ||
| 531 | if (seq<key<'d', 'o'>, Body>::match<A, M, Action, Control>(in, st)) | ||
| 532 | { | ||
| 533 | if (st.doStack.empty() || st.doStack.top()) | ||
| 534 | { | ||
| 535 | return true; | ||
| 536 | } | ||
| 537 | } | ||
| 538 | return false; | ||
| 539 | } | ||
| 540 | }; | ||
| 541 | |||
| 542 | struct DisableDo | ||
| 543 | { | ||
| 544 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 545 | |||
| 546 | template<apply_mode A, rewind_mode M, | ||
| 547 | template<typename...> class Action, | ||
| 548 | template<typename...> class Control, | ||
| 549 | typename Input> | ||
| 550 | static bool match(Input& in, State& st) | ||
| 551 | { | ||
| 552 | st.doStack.push(false); | ||
| 553 | return true; | ||
| 554 | } | ||
| 555 | }; | ||
| 556 | |||
| 557 | struct PopDo | ||
| 558 | { | ||
| 559 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 560 | |||
| 561 | template<apply_mode A, rewind_mode M, | ||
| 562 | template<typename...> class Action, | ||
| 563 | template<typename...> class Control, | ||
| 564 | typename Input> | ||
| 565 | static bool match(Input& in, State& st) | ||
| 566 | { | ||
| 567 | st.doStack.pop(); | ||
| 568 | return true; | ||
| 569 | } | ||
| 570 | }; | ||
| 571 | |||
| 572 | struct CompInner; | ||
| 573 | |||
| 574 | struct Comprehension : seq<sym<'['>, Exp, CompInner, sym<']'>> {}; | ||
| 575 | struct TblComprehension : seq<sym<'{'>, seq<Exp, opt<sym<','>, Exp>>, CompInner, sym<'}'>> {}; | ||
| 576 | |||
| 577 | struct CompForEach; | ||
| 578 | struct CompFor; | ||
| 579 | struct CompClause; | ||
| 580 | |||
| 581 | struct CompInner : seq<sor<CompForEach, CompFor>, star<CompClause>> {}; | ||
| 582 | struct CompForEach : seq< | ||
| 583 | key<'f', 'o', 'r'>, | ||
| 584 | AssignableNameList, | ||
| 585 | key<'i', 'n'>, | ||
| 586 | sor< | ||
| 587 | seq<sym<'*'>, Exp>, Exp | ||
| 588 | > | ||
| 589 | > {}; | ||
| 590 | struct CompFor : seq<key<'f', 'o', 'r'>, Name, sym<'='>, seq<Exp, sym<','>, Exp, opt<sym<','>, Exp>>> {}; | ||
| 591 | struct CompClause : sor<CompFor, CompForEach, seq<key<'w', 'h', 'e', 'n'>, Exp>> {}; | ||
| 592 | |||
| 593 | struct TableBlock; | ||
| 594 | |||
| 595 | struct Assign : seq<sym<'='>, sor<With, If, Switch, TableBlock, ExpListLow>> {}; | ||
| 596 | |||
| 597 | struct Update : seq<sor< | ||
| 598 | sym<'.', '.', '='>, | ||
| 599 | sym<'+', '='>, | ||
| 600 | sym<'-', '='>, | ||
| 601 | sym<'*', '='>, | ||
| 602 | sym<'/', '='>, | ||
| 603 | sym<'%', '='>, | ||
| 604 | sym<'o', 'r', '='>, | ||
| 605 | sym<'a', 'n', 'd', '='>, | ||
| 606 | sym<'&', '='>, | ||
| 607 | sym<'|', '='>, | ||
| 608 | sym<'>', '>', '='>, | ||
| 609 | sym<'<', '<', '='> | ||
| 610 | >, Exp> {}; | ||
| 611 | |||
| 612 | struct CharOperators : seq<Space, one<'+', '-', '*' ,'/', '%', '^', '>', '<', '|', '&'>> {}; | ||
| 613 | struct WordOperators : sor< | ||
| 614 | op<'o', 'r'>, | ||
| 615 | op<'a', 'n', 'd'>, | ||
| 616 | op<'<', '='>, | ||
| 617 | op<'>', '='>, | ||
| 618 | op<'~', '='>, | ||
| 619 | op<'!', '='>, | ||
| 620 | op<'=', '='>, | ||
| 621 | op<'.', '.'>, | ||
| 622 | op<'<', '<'>, | ||
| 623 | op<'>', '>'>, | ||
| 624 | op<'/', '/'>> {}; | ||
| 625 | struct BinaryOperator : seq<sor<CharOperators, WordOperators>, star<SpaceBreak>> {}; | ||
| 626 | |||
| 627 | struct Chain; | ||
| 628 | |||
| 629 | struct Assignable : sor<Chain, Name, SelfName> {}; | ||
| 630 | |||
| 631 | struct Value; | ||
| 632 | |||
| 633 | struct Exp : seq<Value, star<BinaryOperator, Value>> {}; | ||
| 634 | |||
| 635 | struct Callable; | ||
| 636 | struct InvokeArgs; | ||
| 637 | |||
| 638 | struct ChainValue : seq<sor<Chain, Callable>, opt<InvokeArgs>> {}; | ||
| 639 | |||
| 640 | struct KeyValueList; | ||
| 641 | struct String; | ||
| 642 | struct SimpleValue; | ||
| 643 | |||
| 644 | struct Value : sor<String, SimpleValue, KeyValueList, ChainValue> {}; | ||
| 645 | struct SliceValue : Exp {}; | ||
| 646 | |||
| 647 | struct LuaString; | ||
| 648 | |||
| 649 | struct single_string_inner : sor<string<'\\','\''>, string<'\\', '\\'>, not_one<'\''>> {}; | ||
| 650 | struct SingleString : seq<symx<'\''>, star<single_string_inner>, sym<'\''>> {}; | ||
| 651 | struct interp : seq<symx<'#', '{'>, Exp, sym<'}'>> {}; | ||
| 652 | struct double_string_plain : sor<string<'\\','\"'>, string<'\\', '\\'>, not_one<'\"'>> {}; | ||
| 653 | struct double_string_inner : plus<seq<not_at<interp>, double_string_plain>> {}; | ||
| 654 | struct DoubleString : seq<symx<'\"'>, star<sor<double_string_inner, interp>>, sym<'\"'>> {}; | ||
| 655 | struct String : sor<seq<Space, DoubleString>, seq<Space, SingleString>, LuaString> {}; | ||
| 656 | |||
| 657 | struct lua_string_open : seq<one<'['>, star<one<'='>>, one<'['>> {}; | ||
| 658 | struct lua_string_close : seq<one<']'>, star<one<'='>>, one<']'>> {}; | ||
| 659 | |||
| 660 | struct LuaStringOpen | ||
| 661 | { | ||
| 662 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 663 | |||
| 664 | template<apply_mode A, rewind_mode M, | ||
| 665 | template<typename...> class Action, | ||
| 666 | template<typename...> class Control, | ||
| 667 | typename Input> | ||
| 668 | static bool match(Input& in, State& st) | ||
| 669 | { | ||
| 670 | const char* current = in.current(); | ||
| 671 | if (lua_string_open::match<A, M, Action, Control>(in, st)) | ||
| 672 | { | ||
| 673 | st.stringOpen = in.current() - current + 1; | ||
| 674 | return true; | ||
| 675 | } | ||
| 676 | return false; | ||
| 677 | } | ||
| 678 | }; | ||
| 679 | |||
| 680 | struct LuaStringClose | ||
| 681 | { | ||
| 682 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 683 | |||
| 684 | template<apply_mode A, rewind_mode M, | ||
| 685 | template<typename...> class Action, | ||
| 686 | template<typename...> class Control, | ||
| 687 | typename Input> | ||
| 688 | static bool match(Input& in, State& st) | ||
| 689 | { | ||
| 690 | const char* current = in.current(); | ||
| 691 | if (lua_string_close::match<A, M, Action, Control>(in, st)) | ||
| 692 | { | ||
| 693 | return st.stringOpen == in.current() - current + 1; | ||
| 694 | } | ||
| 695 | return false; | ||
| 696 | } | ||
| 697 | }; | ||
| 698 | |||
| 699 | struct LuaStringContent : star<not_at<LuaStringClose>, any> {}; | ||
| 700 | |||
| 701 | struct LuaString | ||
| 702 | { | ||
| 703 | using analyze_t = analysis::generic<analysis::rule_type::ANY>; | ||
| 704 | |||
| 705 | template<apply_mode A, rewind_mode M, | ||
| 706 | template<typename...> class Action, | ||
| 707 | template<typename...> class Control, | ||
| 708 | typename Input> | ||
| 709 | static bool match(Input& in, State& st) | ||
| 710 | { | ||
| 711 | bool result = seq<LuaStringOpen, opt<Break>, LuaStringContent, LuaStringClose>::match<A, M, Action, Control>(in, st); | ||
| 712 | st.stringOpen = -1; | ||
| 713 | return result; | ||
| 714 | } | ||
| 715 | }; | ||
| 716 | |||
| 717 | struct Parens : seq<sym<'('>, star<SpaceBreak>, Exp, star<SpaceBreak>, sym<')'>> {}; | ||
| 718 | struct Callable : sor<Name, SelfName, VarArg, Parens> {}; | ||
| 719 | |||
| 720 | struct FnArgsExpList : seq<Exp, star<sor<Break, one<','>>, White, Exp>> {}; | ||
| 721 | struct FnArgs : sor< | ||
| 722 | seq<symx<'('>, star<SpaceBreak>, opt<FnArgsExpList>, star<SpaceBreak>, sym<')'>>, | ||
| 723 | seq<sym<'!'>, not_at<one<'='>>> | ||
| 724 | > {}; | ||
| 725 | |||
| 726 | struct ChainItems; | ||
| 727 | struct DotChainItem; | ||
| 728 | struct ColonChain; | ||
| 729 | |||
| 730 | struct Chain : sor< | ||
| 731 | seq<sor<Callable, String, not_one<'.', '\\'>>, ChainItems>, | ||
| 732 | seq<Space, | ||
| 733 | sor< | ||
| 734 | seq<DotChainItem, opt<ChainItems>>, | ||
| 735 | ColonChain | ||
| 736 | > | ||
| 737 | > | ||
| 738 | > {}; | ||
| 739 | |||
| 740 | struct ChainItem; | ||
| 741 | |||
| 742 | struct ChainItems : sor< | ||
| 743 | seq<plus<ChainItem>, opt<ColonChain>>, | ||
| 744 | ColonChain | ||
| 745 | > {}; | ||
| 746 | |||
| 747 | struct Invoke; | ||
| 748 | struct Slice; | ||
| 749 | |||
| 750 | struct ChainItem : sor< | ||
| 751 | Invoke, | ||
| 752 | DotChainItem, | ||
| 753 | Slice, | ||
| 754 | seq<symx<'['>, Exp, sym<']'>> | ||
| 755 | > {}; | ||
| 756 | |||
| 757 | struct DotChainItem : seq<symx<'.'>, _Name> {}; | ||
| 758 | struct ColonChainItem : seq<symx<'\\'>, _Name> {}; | ||
| 759 | struct ColonChain : seq< | ||
| 760 | ColonChainItem, | ||
| 761 | opt<Invoke, opt<ChainItems>> | ||
| 762 | > {}; | ||
| 763 | |||
| 764 | struct SliceOne : success {}; | ||
| 765 | struct SliceTwo : success {}; | ||
| 766 | struct Slice : seq< | ||
| 767 | symx<'['>, sor<SliceValue, SliceOne>, sym<','>, sor<SliceValue, SliceTwo>, opt<sym<','>, SliceValue>, sym<']'>> {}; | ||
| 768 | |||
| 769 | struct Invoke : sor< | ||
| 770 | FnArgs, | ||
| 771 | SingleString, | ||
| 772 | DoubleString, | ||
| 773 | seq<at<one<'['>>, LuaString> | ||
| 774 | > {}; | ||
| 775 | |||
| 776 | struct KeyValue; | ||
| 777 | struct TableValueList; | ||
| 778 | struct TableLitLine; | ||
| 779 | |||
| 780 | struct TableValue : sor<KeyValue, Exp> {}; | ||
| 781 | struct TableLit : seq< | ||
| 782 | sym<'{'>, | ||
| 783 | seq< | ||
| 784 | opt<TableValueList>, opt<sym<','>>, | ||
| 785 | opt< | ||
| 786 | SpaceBreak, TableLitLine, | ||
| 787 | star<opt<sym<','>>, SpaceBreak, TableLitLine>, | ||
| 788 | opt<sym<','>> | ||
| 789 | > | ||
| 790 | >, | ||
| 791 | White, sym<'}'> | ||
| 792 | > {}; | ||
| 793 | |||
| 794 | struct TableValueList : seq<TableValue, star<sym<','>, TableValue>> {}; | ||
| 795 | struct TableLitLine : sor< | ||
| 796 | seq<PushIndent, sor<seq<TableValueList, PopIndent>, seq<PopIndent, Cut>>>, | ||
| 797 | Space | ||
| 798 | > {}; | ||
| 799 | |||
| 800 | struct KeyValueLine; | ||
| 801 | |||
| 802 | struct TableBlockInner : seq<KeyValueLine, star<plus<SpaceBreak>, KeyValueLine>> {}; | ||
| 803 | struct TableBlock : seq<plus<SpaceBreak>, Advance, ensure<TableBlockInner, PopIndent>> {}; | ||
| 804 | |||
| 805 | struct Statement; | ||
| 806 | |||
| 807 | struct ClassLine : seq< | ||
| 808 | CheckIndent, | ||
| 809 | seq< | ||
| 810 | sor<KeyValueList, Statement, Exp>, | ||
| 811 | opt<sym<','>> | ||
| 812 | > | ||
| 813 | > {}; | ||
| 814 | |||
| 815 | struct ClassBlock : seq<plus<SpaceBreak>, Advance, ClassLine, star<plus<SpaceBreak>, ClassLine>, PopIndent> {}; | ||
| 816 | |||
| 817 | struct class_no_derive : success {}; | ||
| 818 | struct class_no_extend : success {}; | ||
| 819 | struct class_no_body : success {}; | ||
| 820 | struct ClassDecl : seq< | ||
| 821 | string<'c', 'l', 'a', 's', 's'>, | ||
| 822 | not_at<one<':'>>, | ||
| 823 | sor<Assignable, class_no_derive>, | ||
| 824 | opt<sor<string<'e', 'x', 't', 'e', 'n', 'd', 's'>, PreventIndent, ensure<Exp, PopIndent>, class_no_extend>>, | ||
| 825 | sor<ClassBlock, class_no_body> | ||
| 826 | > {}; | ||
| 827 | |||
| 828 | struct Export : seq< | ||
| 829 | string<'e', 'x', 'p', 'o', 'r', 't'>, | ||
| 830 | sor< | ||
| 831 | ClassDecl, | ||
| 832 | op<'*'>, | ||
| 833 | op<'^'>, | ||
| 834 | seq<NameList, opt<sym<'='>, ExpListLow>> | ||
| 835 | > | ||
| 836 | > {}; | ||
| 837 | |||
| 838 | struct KeyValue : sor< | ||
| 839 | seq<sym<':'>, not_at<SomeSpace>, Name>, | ||
| 840 | seq< | ||
| 841 | sor< | ||
| 842 | KeyName, | ||
| 843 | seq<sym<'['>, Exp, sym<']'>>, | ||
| 844 | seq<Space, DoubleString>, | ||
| 845 | seq<Space, SingleString> | ||
| 846 | >, | ||
| 847 | symx<':'>, | ||
| 848 | sor< | ||
| 849 | Exp, TableBlock, seq<plus<SpaceBreak>, Exp> | ||
| 850 | > | ||
| 851 | > | ||
| 852 | > {}; | ||
| 853 | |||
| 854 | struct KeyValueList : seq<KeyValue, star<sym<','>, KeyValue>> {}; | ||
| 855 | struct KeyValueLine : seq<CheckIndent, KeyValueList, opt<sym<','>>> {}; | ||
| 856 | |||
| 857 | struct FnArgDef : seq<sor<Name, SelfName>, opt<sym<'='>, Exp>> {}; | ||
| 858 | |||
| 859 | struct FnArgDefList : sor< | ||
| 860 | seq< | ||
| 861 | FnArgDef, | ||
| 862 | star<sor<sym<','>, Break>, White, FnArgDef>, | ||
| 863 | star<sor<sym<','>, Break>, White, VarArg> | ||
| 864 | >, | ||
| 865 | VarArg | ||
| 866 | > {}; | ||
| 867 | |||
| 868 | struct outer_value_shadow : seq<string<'u', 's', 'i', 'n', 'g'>, sor<NameList, seq<Space, string<'n', 'i', 'l'>>>> {}; | ||
| 869 | struct outer_value_no_shadowing : success {}; | ||
| 870 | struct without_args_def : success {}; | ||
| 871 | |||
| 872 | struct FnArgsDef : sor< | ||
| 873 | seq<sym<'('>, White, opt<FnArgDefList>, | ||
| 874 | sor< | ||
| 875 | outer_value_shadow, | ||
| 876 | outer_value_no_shadowing | ||
| 877 | >, | ||
| 878 | White, sym<')'> | ||
| 879 | >, | ||
| 880 | without_args_def | ||
| 881 | > {}; | ||
| 882 | |||
| 883 | struct FunLit : seq<FnArgsDef, sor<sym<'-', '>'>, sym<'=', '>'>>, sor<Body, success>> {}; | ||
| 884 | |||
| 885 | struct NameList : seq<Name, star<sym<','>, Name>> {}; | ||
| 886 | struct NameOrDestructure : sor<Name, TableLit> {}; | ||
| 887 | struct AssignableNameList : seq<NameOrDestructure, star<sym<','>, NameOrDestructure>> {}; | ||
| 888 | |||
| 889 | struct ExpList : seq<Exp, star<sym<','>, Exp>> {}; | ||
| 890 | struct ExpListLow : seq<Exp, star<sor<sym<','>, sym<';'>, Exp>>> {}; | ||
| 891 | |||
| 892 | struct ArgLine : seq<CheckIndent, ExpList> {}; | ||
| 893 | struct ArgBlock : seq<ArgLine, star<sym<','>, SpaceBreak, ArgLine>, PopIndent> {}; | ||
| 894 | |||
| 895 | struct InvokeArgs : seq< | ||
| 896 | at<not_one<'-'>>, | ||
| 897 | sor< | ||
| 898 | seq< | ||
| 899 | ExpList, | ||
| 900 | opt<sor< | ||
| 901 | seq< | ||
| 902 | sym<','>, | ||
| 903 | sor< | ||
| 904 | TableBlock, seq<SpaceBreak, Advance, ArgBlock, opt<TableBlock>> | ||
| 905 | > | ||
| 906 | >, | ||
| 907 | TableBlock | ||
| 908 | >> | ||
| 909 | >, | ||
| 910 | TableBlock | ||
| 911 | > | ||
| 912 | > {}; | ||
| 913 | |||
| 914 | struct SimpleValue : sor< | ||
| 915 | key<'n', 'i', 'l'>, | ||
| 916 | key<'t', 'r', 'u', 'e'>, | ||
| 917 | key<'f', 'a', 'l', 's', 'e'>, | ||
| 918 | If, Unless, Switch, With, ClassDecl, ForEach, For, While, Do, | ||
| 919 | seq<sym<'-'>, not_at<SomeSpace>, Exp>, | ||
| 920 | seq<sym<'#'>, Exp>, | ||
| 921 | seq<sym<'~'>, Exp>, | ||
| 922 | seq<key<'n', 'o', 't'>, Exp>, | ||
| 923 | TblComprehension, | ||
| 924 | TableLit, | ||
| 925 | Comprehension, | ||
| 926 | FunLit, | ||
| 927 | Num | ||
| 928 | > {}; | ||
| 929 | |||
| 930 | struct Assignment : seq< | ||
| 931 | ExpList, | ||
| 932 | sor<Update, Assign> | ||
| 933 | > {}; | ||
| 934 | |||
| 935 | struct Sentence : sor< | ||
| 936 | Import, While, With, For, ForEach, | ||
| 937 | Switch, Return, Local, Export, BreakLoop, | ||
| 938 | Assignment, ExpList | ||
| 939 | > {}; | ||
| 940 | |||
| 941 | struct Statement : seq< | ||
| 942 | Sentence, | ||
| 943 | Space, | ||
| 944 | opt< | ||
| 945 | sor< | ||
| 946 | seq< | ||
| 947 | key<'i', 'f'>, Exp, | ||
| 948 | opt< | ||
| 949 | key<'e', 'l', 's', 'e'>, Exp | ||
| 950 | >, | ||
| 951 | Space | ||
| 952 | >, | ||
| 953 | seq<key<'u', 'n', 'l', 'e', 's', 's'>, Exp>, | ||
| 954 | CompInner | ||
| 955 | >, | ||
| 956 | Space | ||
| 957 | > | ||
| 958 | > {}; | ||
| 959 | |||
| 960 | struct Body : sor< | ||
| 961 | seq<opt<Space>, Break, star<EmptyLine>, InBlock>, | ||
| 962 | Statement | ||
| 963 | > {}; | ||
| 964 | |||
| 965 | struct Line : sor< | ||
| 966 | seq<CheckIndent, Statement>, | ||
| 967 | seq<Space, at<Stop>> | ||
| 968 | > {}; | ||
| 969 | |||
| 970 | struct Block : seq<Line, star<plus<Break>, Line>> {}; | ||
| 971 | |||
| 972 | struct BlockWithEnd : seq<Block, eolf> {}; | ||
| 973 | |||
| 974 | template<typename Rule> | ||
| 975 | struct action : nothing<Rule> {}; | ||
| 976 | |||
| 977 | template<> | ||
| 978 | struct action<Assignment> | ||
| 979 | { | ||
| 980 | template<typename Input> | ||
| 981 | static void apply(const Input& in, State&) | ||
| 982 | { | ||
| 983 | std::cout << "Assignment: " << in.string() << '\n'; | ||
| 984 | } | ||
| 985 | }; | ||
| 986 | |||
| 987 | template<> | ||
| 988 | struct action<Return> | ||
| 989 | { | ||
| 990 | template<typename Input> | ||
| 991 | static void apply(const Input& in, State&) | ||
| 992 | { | ||
| 993 | std::cout << "Return: " << in.string() << "\n\n"; | ||
| 994 | } | ||
| 995 | }; | ||
| 996 | } | ||
| 997 | |||
| 998 | int main() | ||
| 999 | { | ||
| 1000 | analyze<moon::BlockWithEnd>(); | ||
| 1001 | moon::State state; | ||
| 1002 | string_input<> inName(R"xoxo( | ||
| 1003 | debug_grammar = false | ||
| 1004 | lpeg = require "lpeg" | ||
| 1005 | |||
| 1006 | lpeg.setmaxstack 10000 -- whoa | ||
| 1007 | |||
| 1008 | err_msg = "Failed to parse:%s\n [%d] >> %s" | ||
| 1009 | |||
| 1010 | import Stack from require "moonscript.data" | ||
| 1011 | import trim, pos_to_line, get_line from require "moonscript.util" | ||
| 1012 | import unpack from require "moonscript.util" | ||
| 1013 | import wrap_env from require "moonscript.parse.env" | ||
| 1014 | |||
| 1015 | { | ||
| 1016 | :R, :S, :V, :P, :C, :Ct, :Cmt, :Cg, :Cb, :Cc | ||
| 1017 | } = lpeg | ||
| 1018 | |||
| 1019 | { | ||
| 1020 | :White, :Break, :Stop, :Comment, :Space, :SomeSpace, :SpaceBreak, :EmptyLine, | ||
| 1021 | :AlphaNum, :Num, :Shebang, :L | ||
| 1022 | Name: _Name | ||
| 1023 | } = require "moonscript.parse.literals" | ||
| 1024 | |||
| 1025 | SpaceName = Space * _Name | ||
| 1026 | Num = Space * (Num / (v) -> {"number", v}) | ||
| 1027 | |||
| 1028 | { | ||
| 1029 | :Indent, :Cut, :ensure, :extract_line, :mark, :pos, :flatten_or_mark, | ||
| 1030 | :is_assignable, :check_assignable, :format_assign, :format_single_assign, | ||
| 1031 | :sym, :symx, :simple_string, :wrap_func_arg, :join_chain, | ||
| 1032 | :wrap_decorator, :check_lua_string, :self_assign, :got | ||
| 1033 | |||
| 1034 | } = require "moonscript.parse.util" | ||
| 1035 | |||
| 1036 | |||
| 1037 | build_grammar = wrap_env debug_grammar, (root) -> | ||
| 1038 | _indent = Stack 0 | ||
| 1039 | _do_stack = Stack 0 | ||
| 1040 | |||
| 1041 | state = { | ||
| 1042 | -- last pos we saw, used to report error location | ||
| 1043 | last_pos: 0 | ||
| 1044 | } | ||
| 1045 | |||
| 1046 | check_indent = (str, pos, indent) -> | ||
| 1047 | state.last_pos = pos | ||
| 1048 | _indent\top! == indent | ||
| 1049 | |||
| 1050 | advance_indent = (str, pos, indent) -> | ||
| 1051 | top = _indent\top! | ||
| 1052 | if top != -1 and indent > top | ||
| 1053 | _indent\push indent | ||
| 1054 | true | ||
| 1055 | |||
| 1056 | push_indent = (str, pos, indent) -> | ||
| 1057 | _indent\push indent | ||
| 1058 | true | ||
| 1059 | |||
| 1060 | pop_indent = -> | ||
| 1061 | assert _indent\pop!, "unexpected outdent" | ||
| 1062 | true | ||
| 1063 | |||
| 1064 | check_do = (str, pos, do_node) -> | ||
| 1065 | top = _do_stack\top! | ||
| 1066 | if top == nil or top | ||
| 1067 | return true, do_node | ||
| 1068 | false | ||
| 1069 | |||
| 1070 | disable_do = -> | ||
| 1071 | _do_stack\push false | ||
| 1072 | true | ||
| 1073 | |||
| 1074 | pop_do = -> | ||
| 1075 | assert _do_stack\pop! != nil, "unexpected do pop" | ||
| 1076 | true | ||
| 1077 | |||
| 1078 | DisableDo = Cmt "", disable_do | ||
| 1079 | PopDo = Cmt "", pop_do | ||
| 1080 | |||
| 1081 | keywords = {} | ||
| 1082 | key = (chars) -> | ||
| 1083 | keywords[chars] = true | ||
| 1084 | Space * chars * -AlphaNum | ||
| 1085 | |||
| 1086 | op = (chars) -> | ||
| 1087 | patt = Space * C chars | ||
| 1088 | -- it's a word, treat like keyword | ||
| 1089 | if chars\match "^%w*$" | ||
| 1090 | keywords[chars] = true | ||
| 1091 | patt *= -AlphaNum | ||
| 1092 | |||
| 1093 | patt | ||
| 1094 | |||
| 1095 | Name = Cmt(SpaceName, (str, pos, name) -> | ||
| 1096 | return false if keywords[name] | ||
| 1097 | true | ||
| 1098 | ) / trim | ||
| 1099 | |||
| 1100 | SelfName = Space * "@" * ( | ||
| 1101 | "@" * (_Name / mark"self_class" + Cc"self.__class") + | ||
| 1102 | _Name / mark"self" + | ||
| 1103 | Cc"self" -- @ by itself | ||
| 1104 | ) | ||
| 1105 | |||
| 1106 | KeyName = SelfName + Space * _Name / mark"key_literal" | ||
| 1107 | VarArg = Space * P"..." / trim | ||
| 1108 | |||
| 1109 | g = P { | ||
| 1110 | root or File | ||
| 1111 | File: Shebang^-1 * (Block + Ct"") | ||
| 1112 | Block: Ct(Line * (Break^1 * Line)^0) | ||
| 1113 | CheckIndent: Cmt(Indent, check_indent), -- validates line is in correct indent | ||
| 1114 | Line: (CheckIndent * Statement + Space * L(Stop)) | ||
| 1115 | |||
| 1116 | Statement: pos( | ||
| 1117 | Import + While + With + For + ForEach + Switch + Return + | ||
| 1118 | Local + Export + BreakLoop + | ||
| 1119 | Ct(ExpList) * (Update + Assign)^-1 / format_assign | ||
| 1120 | ) * Space * (( | ||
| 1121 | -- statement decorators | ||
| 1122 | key"if" * Exp * (key"else" * Exp)^-1 * Space / mark"if" + | ||
| 1123 | key"unless" * Exp / mark"unless" + | ||
| 1124 | CompInner / mark"comprehension" | ||
| 1125 | ) * Space)^-1 / wrap_decorator | ||
| 1126 | |||
| 1127 | Body: Space^-1 * Break * EmptyLine^0 * InBlock + Ct(Statement) -- either a statement, or an indented block | ||
| 1128 | |||
| 1129 | Advance: L Cmt(Indent, advance_indent) -- Advances the indent, gives back whitespace for CheckIndent | ||
| 1130 | PushIndent: Cmt(Indent, push_indent) | ||
| 1131 | PreventIndent: Cmt(Cc(-1), push_indent) | ||
| 1132 | PopIndent: Cmt("", pop_indent) | ||
| 1133 | InBlock: Advance * Block * PopIndent | ||
| 1134 | |||
| 1135 | Local: key"local" * ((op"*" + op"^") / mark"declare_glob" + Ct(NameList) / mark"declare_with_shadows") | ||
| 1136 | |||
| 1137 | Import: key"import" * Ct(ImportNameList) * SpaceBreak^0 * key"from" * Exp / mark"import" | ||
| 1138 | ImportName: (sym"\\" * Ct(Cc"colon" * Name) + Name) | ||
| 1139 | ImportNameList: SpaceBreak^0 * ImportName * ((SpaceBreak^1 + sym"," * SpaceBreak^0) * ImportName)^0 | ||
| 1140 | |||
| 1141 | BreakLoop: Ct(key"break"/trim) + Ct(key"continue"/trim) | ||
| 1142 | |||
| 1143 | Return: key"return" * (ExpListLow/mark"explist" + C"") / mark"return" | ||
| 1144 | |||
| 1145 | WithExp: Ct(ExpList) * Assign^-1 / format_assign | ||
| 1146 | With: key"with" * DisableDo * ensure(WithExp, PopDo) * key"do"^-1 * Body / mark"with" | ||
| 1147 | |||
| 1148 | Switch: key"switch" * DisableDo * ensure(Exp, PopDo) * key"do"^-1 * Space^-1 * Break * SwitchBlock / mark"switch" | ||
| 1149 | |||
| 1150 | SwitchBlock: EmptyLine^0 * Advance * Ct(SwitchCase * (Break^1 * SwitchCase)^0 * (Break^1 * SwitchElse)^-1) * PopIndent | ||
| 1151 | SwitchCase: key"when" * Ct(ExpList) * key"then"^-1 * Body / mark"case" | ||
| 1152 | SwitchElse: key"else" * Body / mark"else" | ||
| 1153 | |||
| 1154 | IfCond: Exp * Assign^-1 / format_single_assign | ||
| 1155 | |||
| 1156 | IfElse: (Break * EmptyLine^0 * CheckIndent)^-1 * key"else" * Body / mark"else" | ||
| 1157 | IfElseIf: (Break * EmptyLine^0 * CheckIndent)^-1 * key"elseif" * pos(IfCond) * key"then"^-1 * Body / mark"elseif" | ||
| 1158 | |||
| 1159 | If: key"if" * IfCond * key"then"^-1 * Body * IfElseIf^0 * IfElse^-1 / mark"if" | ||
| 1160 | Unless: key"unless" * IfCond * key"then"^-1 * Body * IfElseIf^0 * IfElse^-1 / mark"unless" | ||
| 1161 | |||
| 1162 | While: key"while" * DisableDo * ensure(Exp, PopDo) * key"do"^-1 * Body / mark"while" | ||
| 1163 | |||
| 1164 | For: key"for" * DisableDo * ensure(Name * sym"=" * Ct(Exp * sym"," * Exp * (sym"," * Exp)^-1), PopDo) * | ||
| 1165 | key"do"^-1 * Body / mark"for" | ||
| 1166 | |||
| 1167 | ForEach: key"for" * Ct(AssignableNameList) * key"in" * DisableDo * ensure(Ct(sym"*" * Exp / mark"unpack" + ExpList), PopDo) * key"do"^-1 * Body / mark"foreach" | ||
| 1168 | |||
| 1169 | Do: key"do" * Body / mark"do" | ||
| 1170 | |||
| 1171 | Comprehension: sym"[" * Exp * CompInner * sym"]" / mark"comprehension" | ||
| 1172 | |||
| 1173 | TblComprehension: sym"{" * Ct(Exp * (sym"," * Exp)^-1) * CompInner * sym"}" / mark"tblcomprehension" | ||
| 1174 | |||
| 1175 | CompInner: Ct((CompForEach + CompFor) * CompClause^0) | ||
| 1176 | CompForEach: key"for" * Ct(AssignableNameList) * key"in" * (sym"*" * Exp / mark"unpack" + Exp) / mark"foreach" | ||
| 1177 | CompFor: key "for" * Name * sym"=" * Ct(Exp * sym"," * Exp * (sym"," * Exp)^-1) / mark"for" | ||
| 1178 | CompClause: CompFor + CompForEach + key"when" * Exp / mark"when" | ||
| 1179 | |||
| 1180 | Assign: sym"=" * (Ct(With + If + Switch) + Ct(TableBlock + ExpListLow)) / mark"assign" | ||
| 1181 | Update: ((sym"..=" + sym"+=" + sym"-=" + sym"*=" + sym"/=" + sym"%=" + sym"or=" + sym"and=" + sym"&=" + sym"|=" + sym">>=" + sym"<<=") / trim) * Exp / mark"update" | ||
| 1182 | |||
| 1183 | CharOperators: Space * C(S"+-*/%^><|&") | ||
| 1184 | WordOperators: op"or" + op"and" + op"<=" + op">=" + op"~=" + op"!=" + op"==" + op".." + op"<<" + op">>" + op"//" | ||
| 1185 | BinaryOperator: (WordOperators + CharOperators) * SpaceBreak^0 | ||
| 1186 | |||
| 1187 | Assignable: Cmt(Chain, check_assignable) + Name + SelfName | ||
| 1188 | Exp: Ct(Value * (BinaryOperator * Value)^0) / flatten_or_mark"exp" | ||
| 1189 | |||
| 1190 | SimpleValue: | ||
| 1191 | If + Unless + | ||
| 1192 | Switch + | ||
| 1193 | With + | ||
| 1194 | ClassDecl + | ||
| 1195 | ForEach + For + While + | ||
| 1196 | Cmt(Do, check_do) + | ||
| 1197 | sym"-" * -SomeSpace * Exp / mark"minus" + | ||
| 1198 | sym"#" * Exp / mark"length" + | ||
| 1199 | sym"~" * Exp / mark"bitnot" + | ||
| 1200 | key"not" * Exp / mark"not" + | ||
| 1201 | TblComprehension + | ||
| 1202 | TableLit + | ||
| 1203 | Comprehension + | ||
| 1204 | FunLit + | ||
| 1205 | Num | ||
| 1206 | |||
| 1207 | -- a function call or an object access | ||
| 1208 | ChainValue: (Chain + Callable) * Ct(InvokeArgs^-1) / join_chain | ||
| 1209 | |||
| 1210 | Value: pos( | ||
| 1211 | SimpleValue + | ||
| 1212 | Ct(KeyValueList) / mark"table" + | ||
| 1213 | ChainValue + | ||
| 1214 | String) | ||
| 1215 | |||
| 1216 | SliceValue: Exp | ||
| 1217 | |||
| 1218 | String: Space * DoubleString + Space * SingleString + LuaString | ||
| 1219 | SingleString: simple_string("'") | ||
| 1220 | DoubleString: simple_string('"', true) | ||
| 1221 | |||
| 1222 | LuaString: Cg(LuaStringOpen, "string_open") * Cb"string_open" * Break^-1 * | ||
| 1223 | C((1 - Cmt(C(LuaStringClose) * Cb"string_open", check_lua_string))^0) * | ||
| 1224 | LuaStringClose / mark"string" | ||
| 1225 | |||
| 1226 | LuaStringOpen: sym"[" * P"="^0 * "[" / trim | ||
| 1227 | LuaStringClose: "]" * P"="^0 * "]" | ||
| 1228 | |||
| 1229 | Callable: pos(Name / mark"ref") + SelfName + VarArg + Parens / mark"parens" | ||
| 1230 | Parens: sym"(" * SpaceBreak^0 * Exp * SpaceBreak^0 * sym")" | ||
| 1231 | |||
| 1232 | FnArgs: symx"(" * SpaceBreak^0 * Ct(FnArgsExpList^-1) * SpaceBreak^0 * sym")" + sym"!" * -P"=" * Ct"" | ||
| 1233 | FnArgsExpList: Exp * ((Break + sym",") * White * Exp)^0 | ||
| 1234 | |||
| 1235 | Chain: (Callable + String + -S".\\") * ChainItems / mark"chain" + | ||
| 1236 | Space * (DotChainItem * ChainItems^-1 + ColonChain) / mark"chain" | ||
| 1237 | |||
| 1238 | ChainItems: ChainItem^1 * ColonChain^-1 + ColonChain | ||
| 1239 | |||
| 1240 | ChainItem: | ||
| 1241 | Invoke + | ||
| 1242 | DotChainItem + | ||
| 1243 | Slice + | ||
| 1244 | symx"[" * Exp/mark"index" * sym"]" | ||
| 1245 | |||
| 1246 | DotChainItem: symx"." * _Name/mark"dot" | ||
| 1247 | ColonChainItem: symx"\\" * _Name / mark"colon" | ||
| 1248 | ColonChain: ColonChainItem * (Invoke * ChainItems^-1)^-1 | ||
| 1249 | |||
| 1250 | Slice: symx"[" * (SliceValue + Cc(1)) * sym"," * (SliceValue + Cc"") * | ||
| 1251 | (sym"," * SliceValue)^-1 *sym"]" / mark"slice" | ||
| 1252 | |||
| 1253 | Invoke: FnArgs / mark"call" + | ||
| 1254 | SingleString / wrap_func_arg + | ||
| 1255 | DoubleString / wrap_func_arg + | ||
| 1256 | L(P"[") * LuaString / wrap_func_arg | ||
| 1257 | |||
| 1258 | TableValue: KeyValue + Ct(Exp) | ||
| 1259 | |||
| 1260 | TableLit: sym"{" * Ct( | ||
| 1261 | TableValueList^-1 * sym","^-1 * | ||
| 1262 | (SpaceBreak * TableLitLine * (sym","^-1 * SpaceBreak * TableLitLine)^0 * sym","^-1)^-1 | ||
| 1263 | ) * White * sym"}" / mark"table" | ||
| 1264 | |||
| 1265 | TableValueList: TableValue * (sym"," * TableValue)^0 | ||
| 1266 | TableLitLine: PushIndent * ((TableValueList * PopIndent) + (PopIndent * Cut)) + Space | ||
| 1267 | |||
| 1268 | -- the unbounded table | ||
| 1269 | TableBlockInner: Ct(KeyValueLine * (SpaceBreak^1 * KeyValueLine)^0) | ||
| 1270 | TableBlock: SpaceBreak^1 * Advance * ensure(TableBlockInner, PopIndent) / mark"table" | ||
| 1271 | |||
| 1272 | ClassDecl: key"class" * -P":" * (Assignable + Cc(nil)) * (key"extends" * PreventIndent * ensure(Exp, PopIndent) + C"")^-1 * (ClassBlock + Ct("")) / mark"class" | ||
| 1273 | |||
| 1274 | ClassBlock: SpaceBreak^1 * Advance * | ||
| 1275 | Ct(ClassLine * (SpaceBreak^1 * ClassLine)^0) * PopIndent | ||
| 1276 | ClassLine: CheckIndent * (( | ||
| 1277 | KeyValueList / mark"props" + | ||
| 1278 | Statement / mark"stm" + | ||
| 1279 | Exp / mark"stm" | ||
| 1280 | ) * sym","^-1) | ||
| 1281 | |||
| 1282 | Export: key"export" * ( | ||
| 1283 | Cc"class" * ClassDecl + | ||
| 1284 | op"*" + op"^" + | ||
| 1285 | Ct(NameList) * (sym"=" * Ct(ExpListLow))^-1) / mark"export" | ||
| 1286 | |||
| 1287 | KeyValue: (sym":" * -SomeSpace * Name * lpeg.Cp!) / self_assign + | ||
| 1288 | Ct( | ||
| 1289 | (KeyName + sym"[" * Exp * sym"]" +Space * DoubleString + Space * SingleString) * | ||
| 1290 | symx":" * | ||
| 1291 | (Exp + TableBlock + SpaceBreak^1 * Exp) | ||
| 1292 | ) | ||
| 1293 | |||
| 1294 | KeyValueList: KeyValue * (sym"," * KeyValue)^0 | ||
| 1295 | KeyValueLine: CheckIndent * KeyValueList * sym","^-1 | ||
| 1296 | |||
| 1297 | FnArgsDef: sym"(" * White * Ct(FnArgDefList^-1) * | ||
| 1298 | (key"using" * Ct(NameList + Space * "nil") + Ct"") * | ||
| 1299 | White * sym")" + Ct"" * Ct"" | ||
| 1300 | |||
| 1301 | FnArgDefList: FnArgDef * ((sym"," + Break) * White * FnArgDef)^0 * ((sym"," + Break) * White * Ct(VarArg))^0 + Ct(VarArg) | ||
| 1302 | FnArgDef: Ct((Name + SelfName) * (sym"=" * Exp)^-1) | ||
| 1303 | |||
| 1304 | FunLit: FnArgsDef * | ||
| 1305 | (sym"->" * Cc"slim" + sym"=>" * Cc"fat") * | ||
| 1306 | (Body + Ct"") / mark"fndef" | ||
| 1307 | |||
| 1308 | NameList: Name * (sym"," * Name)^0 | ||
| 1309 | NameOrDestructure: Name + TableLit | ||
| 1310 | AssignableNameList: NameOrDestructure * (sym"," * NameOrDestructure)^0 | ||
| 1311 | |||
| 1312 | ExpList: Exp * (sym"," * Exp)^0 | ||
| 1313 | ExpListLow: Exp * ((sym"," + sym";") * Exp)^0 | ||
| 1314 | |||
| 1315 | -- open args | ||
| 1316 | InvokeArgs: -P"-" * (ExpList * (sym"," * (TableBlock + SpaceBreak * Advance * ArgBlock * TableBlock^-1) + TableBlock)^-1 + TableBlock) | ||
| 1317 | ArgBlock: ArgLine * (sym"," * SpaceBreak * ArgLine)^0 * PopIndent | ||
| 1318 | ArgLine: CheckIndent * ExpList | ||
| 1319 | } | ||
| 1320 | |||
| 1321 | g, state | ||
| 1322 | |||
| 1323 | file_parser = -> | ||
| 1324 | g, state = build_grammar! | ||
| 1325 | file_grammar = White * g * White * -1 | ||
| 1326 | |||
| 1327 | { | ||
| 1328 | match: (str) => | ||
| 1329 | local tree | ||
| 1330 | _, err = xpcall (-> | ||
| 1331 | tree = file_grammar\match str | ||
| 1332 | ), (err) -> | ||
| 1333 | debug.traceback err, 2 | ||
| 1334 | |||
| 1335 | -- regular error, let it bubble up | ||
| 1336 | if type(err) == "string" | ||
| 1337 | return nil, err | ||
| 1338 | |||
| 1339 | unless tree | ||
| 1340 | local msg | ||
| 1341 | err_pos = state.last_pos | ||
| 1342 | |||
| 1343 | if err | ||
| 1344 | node, msg = unpack err | ||
| 1345 | msg = " " .. msg if msg | ||
| 1346 | err_pos = node[-1] | ||
| 1347 | |||
| 1348 | line_no = pos_to_line str, err_pos | ||
| 1349 | line_str = get_line(str, line_no) or "" | ||
| 1350 | return nil, err_msg\format msg or "", line_no, trim line_str | ||
| 1351 | |||
| 1352 | tree | ||
| 1353 | } | ||
| 1354 | |||
| 1355 | { | ||
| 1356 | :extract_line | ||
| 1357 | :build_grammar | ||
| 1358 | |||
| 1359 | -- parse a string as a file | ||
| 1360 | -- returns tree, or nil and error message | ||
| 1361 | string: (str) -> file_parser!\match str | ||
| 1362 | } | ||
| 1363 | )xoxo", "abc"); | ||
| 1364 | try | ||
| 1365 | { | ||
| 1366 | if (parse<must<moon::BlockWithEnd>, moon::action>(inName, state)) | ||
| 1367 | { | ||
| 1368 | std::cout << "matched.\n"; | ||
| 1369 | } | ||
| 1370 | else | ||
| 1371 | { | ||
| 1372 | std::cout << "not matched.\n"; | ||
| 1373 | } | ||
| 1374 | } | ||
| 1375 | catch (parse_error e) | ||
| 1376 | { | ||
| 1377 | std::cout << e.what() << '\n'; | ||
| 1378 | } | ||
| 1379 | /* | ||
| 1380 | analyze<hello::expr>(); | ||
| 1381 | const char* text = "1 + 2 + 3 * 4 / 2"; | ||
| 1382 | string_input<> in(text, "abc"); | ||
| 1383 | try | ||
| 1384 | { | ||
| 1385 | hello::Stack stack; | ||
| 1386 | if (parse<hello::expr, hello::action>(in, stack)) | ||
| 1387 | { | ||
| 1388 | std::cout << text << " = " << stack.getValue() << '\n'; | ||
| 1389 | } | ||
| 1390 | return 0; | ||
| 1391 | } | ||
| 1392 | catch (parse_error e) | ||
| 1393 | { | ||
| 1394 | std::cout << e.what() << '\n'; | ||
| 1395 | return 1; | ||
| 1396 | } | ||
| 1397 | */ | ||
| 1398 | return 0; | ||
| 1399 | } | ||
diff --git a/MoonParser/pegtl.hpp b/MoonParser/pegtl.hpp new file mode 100644 index 0000000..e96cd79 --- /dev/null +++ b/MoonParser/pegtl.hpp | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_PEGTL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_PEGTL_HPP | ||
| 6 | |||
| 7 | #include "pegtl/config.hpp" | ||
| 8 | #include "pegtl/version.hpp" | ||
| 9 | |||
| 10 | #include "pegtl/ascii.hpp" | ||
| 11 | #include "pegtl/parse.hpp" | ||
| 12 | #include "pegtl/rules.hpp" | ||
| 13 | #include "pegtl/utf16.hpp" | ||
| 14 | #include "pegtl/utf32.hpp" | ||
| 15 | #include "pegtl/utf8.hpp" | ||
| 16 | |||
| 17 | #include "pegtl/argv_input.hpp" | ||
| 18 | #include "pegtl/buffer_input.hpp" | ||
| 19 | #include "pegtl/cstream_input.hpp" | ||
| 20 | #include "pegtl/file_input.hpp" | ||
| 21 | #include "pegtl/istream_input.hpp" | ||
| 22 | #include "pegtl/memory_input.hpp" | ||
| 23 | #include "pegtl/read_input.hpp" | ||
| 24 | #include "pegtl/string_input.hpp" | ||
| 25 | |||
| 26 | // The following are not included by | ||
| 27 | // default because they include <iostream>. | ||
| 28 | |||
| 29 | // #include "pegtl/analyze.hpp" | ||
| 30 | |||
| 31 | #endif | ||
diff --git a/MoonParser/pegtl/analysis/analyze_cycles.hpp b/MoonParser/pegtl/analysis/analyze_cycles.hpp new file mode 100644 index 0000000..f063ee1 --- /dev/null +++ b/MoonParser/pegtl/analysis/analyze_cycles.hpp | |||
| @@ -0,0 +1,134 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ANALYSIS_ANALYZE_CYCLES_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ANALYSIS_ANALYZE_CYCLES_HPP | ||
| 6 | |||
| 7 | #include <cassert> | ||
| 8 | |||
| 9 | #include <map> | ||
| 10 | #include <set> | ||
| 11 | |||
| 12 | #include <iostream> | ||
| 13 | #include <utility> | ||
| 14 | |||
| 15 | #include "../config.hpp" | ||
| 16 | |||
| 17 | #include "grammar_info.hpp" | ||
| 18 | #include "insert_guard.hpp" | ||
| 19 | |||
| 20 | namespace tao | ||
| 21 | { | ||
| 22 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 23 | { | ||
| 24 | namespace analysis | ||
| 25 | { | ||
| 26 | class analyze_cycles_impl | ||
| 27 | { | ||
| 28 | protected: | ||
| 29 | explicit analyze_cycles_impl( const bool verbose ) noexcept | ||
| 30 | : m_verbose( verbose ), | ||
| 31 | m_problems( 0 ) | ||
| 32 | { | ||
| 33 | } | ||
| 34 | |||
| 35 | const bool m_verbose; | ||
| 36 | unsigned m_problems; | ||
| 37 | grammar_info m_info; | ||
| 38 | std::set< std::string > m_stack; | ||
| 39 | std::map< std::string, bool > m_cache; | ||
| 40 | std::map< std::string, bool > m_results; | ||
| 41 | |||
| 42 | const std::map< std::string, rule_info >::const_iterator find( const std::string& name ) const noexcept | ||
| 43 | { | ||
| 44 | const auto iter = m_info.map.find( name ); | ||
| 45 | assert( iter != m_info.map.end() ); | ||
| 46 | return iter; | ||
| 47 | } | ||
| 48 | |||
| 49 | bool work( const std::map< std::string, rule_info >::const_iterator& start, const bool accum ) | ||
| 50 | { | ||
| 51 | const auto j = m_cache.find( start->first ); | ||
| 52 | |||
| 53 | if( j != m_cache.end() ) { | ||
| 54 | return j->second; | ||
| 55 | } | ||
| 56 | if( const auto g = make_insert_guard( m_stack, start->first ) ) { | ||
| 57 | switch( start->second.type ) { | ||
| 58 | case rule_type::ANY: { | ||
| 59 | bool a = false; | ||
| 60 | for( const auto& r : start->second.rules ) { | ||
| 61 | a = a || work( find( r ), accum || a ); | ||
| 62 | } | ||
| 63 | return m_cache[ start->first ] = true; | ||
| 64 | } | ||
| 65 | case rule_type::OPT: { | ||
| 66 | bool a = false; | ||
| 67 | for( const auto& r : start->second.rules ) { | ||
| 68 | a = a || work( find( r ), accum || a ); | ||
| 69 | } | ||
| 70 | return m_cache[ start->first ] = false; | ||
| 71 | } | ||
| 72 | case rule_type::SEQ: { | ||
| 73 | bool a = false; | ||
| 74 | for( const auto& r : start->second.rules ) { | ||
| 75 | a = a || work( find( r ), accum || a ); | ||
| 76 | } | ||
| 77 | return m_cache[ start->first ] = a; | ||
| 78 | } | ||
| 79 | case rule_type::SOR: { | ||
| 80 | bool a = true; | ||
| 81 | for( const auto& r : start->second.rules ) { | ||
| 82 | a = a && work( find( r ), accum ); | ||
| 83 | } | ||
| 84 | return m_cache[ start->first ] = a; | ||
| 85 | } | ||
| 86 | } | ||
| 87 | throw std::runtime_error( "code should be unreachable" ); // LCOV_EXCL_LINE | ||
| 88 | } | ||
| 89 | if( !accum ) { | ||
| 90 | ++m_problems; | ||
| 91 | if( m_verbose ) { | ||
| 92 | std::cout << "problem: cycle without progress detected at rule class " << start->first << std::endl; | ||
| 93 | } | ||
| 94 | } | ||
| 95 | return m_cache[ start->first ] = accum; | ||
| 96 | } | ||
| 97 | }; | ||
| 98 | |||
| 99 | template< typename Grammar > | ||
| 100 | class analyze_cycles | ||
| 101 | : private analyze_cycles_impl | ||
| 102 | { | ||
| 103 | public: | ||
| 104 | explicit analyze_cycles( const bool verbose ) | ||
| 105 | : analyze_cycles_impl( verbose ) | ||
| 106 | { | ||
| 107 | Grammar::analyze_t::template insert< Grammar >( m_info ); | ||
| 108 | } | ||
| 109 | |||
| 110 | std::size_t problems() | ||
| 111 | { | ||
| 112 | for( auto i = m_info.map.begin(); i != m_info.map.end(); ++i ) { | ||
| 113 | m_results[ i->first ] = work( i, false ); | ||
| 114 | m_cache.clear(); | ||
| 115 | } | ||
| 116 | return m_problems; | ||
| 117 | } | ||
| 118 | |||
| 119 | template< typename Rule > | ||
| 120 | bool consumes() const noexcept | ||
| 121 | { | ||
| 122 | const auto i = m_results.find( internal::demangle< Rule >() ); | ||
| 123 | assert( i != m_results.end() ); | ||
| 124 | return i->second; | ||
| 125 | } | ||
| 126 | }; | ||
| 127 | |||
| 128 | } // namespace analysis | ||
| 129 | |||
| 130 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 131 | |||
| 132 | } // namespace tao | ||
| 133 | |||
| 134 | #endif | ||
diff --git a/MoonParser/pegtl/analysis/counted.hpp b/MoonParser/pegtl/analysis/counted.hpp new file mode 100644 index 0000000..84a12ae --- /dev/null +++ b/MoonParser/pegtl/analysis/counted.hpp | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ANALYSIS_COUNTED_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ANALYSIS_COUNTED_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "generic.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace analysis | ||
| 16 | { | ||
| 17 | template< rule_type Type, unsigned Count, typename... Rules > | ||
| 18 | struct counted | ||
| 19 | : generic< ( Count != 0 ) ? Type : rule_type::OPT, Rules... > | ||
| 20 | { | ||
| 21 | }; | ||
| 22 | |||
| 23 | } // namespace analysis | ||
| 24 | |||
| 25 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 26 | |||
| 27 | } // namespace tao | ||
| 28 | |||
| 29 | #endif | ||
diff --git a/MoonParser/pegtl/analysis/generic.hpp b/MoonParser/pegtl/analysis/generic.hpp new file mode 100644 index 0000000..27e0ffe --- /dev/null +++ b/MoonParser/pegtl/analysis/generic.hpp | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ANALYSIS_GENERIC_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ANALYSIS_GENERIC_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "grammar_info.hpp" | ||
| 10 | #include "insert_rules.hpp" | ||
| 11 | #include "rule_type.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace analysis | ||
| 18 | { | ||
| 19 | template< rule_type Type, typename... Rules > | ||
| 20 | struct generic | ||
| 21 | { | ||
| 22 | template< typename Name > | ||
| 23 | static std::string insert( grammar_info& g ) | ||
| 24 | { | ||
| 25 | const auto r = g.insert< Name >( Type ); | ||
| 26 | if( r.second ) { | ||
| 27 | insert_rules< Rules... >::insert( g, r.first->second ); | ||
| 28 | } | ||
| 29 | return r.first->first; | ||
| 30 | } | ||
| 31 | }; | ||
| 32 | |||
| 33 | } // namespace analysis | ||
| 34 | |||
| 35 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 36 | |||
| 37 | } // namespace tao | ||
| 38 | |||
| 39 | #endif | ||
diff --git a/MoonParser/pegtl/analysis/grammar_info.hpp b/MoonParser/pegtl/analysis/grammar_info.hpp new file mode 100644 index 0000000..15c96ab --- /dev/null +++ b/MoonParser/pegtl/analysis/grammar_info.hpp | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ANALYSIS_GRAMMAR_INFO_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ANALYSIS_GRAMMAR_INFO_HPP | ||
| 6 | |||
| 7 | #include <map> | ||
| 8 | #include <string> | ||
| 9 | #include <utility> | ||
| 10 | |||
| 11 | #include "../config.hpp" | ||
| 12 | #include "../internal/demangle.hpp" | ||
| 13 | |||
| 14 | #include "rule_info.hpp" | ||
| 15 | |||
| 16 | namespace tao | ||
| 17 | { | ||
| 18 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 19 | { | ||
| 20 | namespace analysis | ||
| 21 | { | ||
| 22 | struct grammar_info | ||
| 23 | { | ||
| 24 | using map_t = std::map< std::string, rule_info >; | ||
| 25 | map_t map; | ||
| 26 | |||
| 27 | template< typename Name > | ||
| 28 | std::pair< map_t::iterator, bool > insert( const rule_type type ) | ||
| 29 | { | ||
| 30 | return map.insert( map_t::value_type( internal::demangle< Name >(), rule_info( type ) ) ); | ||
| 31 | } | ||
| 32 | }; | ||
| 33 | |||
| 34 | } // namespace analysis | ||
| 35 | |||
| 36 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 37 | |||
| 38 | } // namespace tao | ||
| 39 | |||
| 40 | #endif | ||
diff --git a/MoonParser/pegtl/analysis/insert_guard.hpp b/MoonParser/pegtl/analysis/insert_guard.hpp new file mode 100644 index 0000000..9a4cc35 --- /dev/null +++ b/MoonParser/pegtl/analysis/insert_guard.hpp | |||
| @@ -0,0 +1,66 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ANALYSIS_INSERT_GUARD_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ANALYSIS_INSERT_GUARD_HPP | ||
| 6 | |||
| 7 | #include <utility> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace analysis | ||
| 16 | { | ||
| 17 | template< typename C > | ||
| 18 | class insert_guard | ||
| 19 | { | ||
| 20 | public: | ||
| 21 | insert_guard( insert_guard&& other ) noexcept | ||
| 22 | : m_i( other.m_i ), | ||
| 23 | m_c( other.m_c ) | ||
| 24 | { | ||
| 25 | other.m_c = nullptr; | ||
| 26 | } | ||
| 27 | |||
| 28 | insert_guard( C& container, const typename C::value_type& value ) | ||
| 29 | : m_i( container.insert( value ) ), | ||
| 30 | m_c( &container ) | ||
| 31 | { | ||
| 32 | } | ||
| 33 | |||
| 34 | ~insert_guard() | ||
| 35 | { | ||
| 36 | if( m_c && m_i.second ) { | ||
| 37 | m_c->erase( m_i.first ); | ||
| 38 | } | ||
| 39 | } | ||
| 40 | |||
| 41 | insert_guard( const insert_guard& ) = delete; | ||
| 42 | void operator=( const insert_guard& ) = delete; | ||
| 43 | |||
| 44 | explicit operator bool() const noexcept | ||
| 45 | { | ||
| 46 | return m_i.second; | ||
| 47 | } | ||
| 48 | |||
| 49 | private: | ||
| 50 | const std::pair< typename C::iterator, bool > m_i; | ||
| 51 | C* m_c; | ||
| 52 | }; | ||
| 53 | |||
| 54 | template< typename C > | ||
| 55 | insert_guard< C > make_insert_guard( C& container, const typename C::value_type& value ) | ||
| 56 | { | ||
| 57 | return insert_guard< C >( container, value ); | ||
| 58 | } | ||
| 59 | |||
| 60 | } // namespace analysis | ||
| 61 | |||
| 62 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 63 | |||
| 64 | } // namespace tao | ||
| 65 | |||
| 66 | #endif | ||
diff --git a/MoonParser/pegtl/analysis/insert_rules.hpp b/MoonParser/pegtl/analysis/insert_rules.hpp new file mode 100644 index 0000000..ff55f66 --- /dev/null +++ b/MoonParser/pegtl/analysis/insert_rules.hpp | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ANALYSIS_INSERT_RULES_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ANALYSIS_INSERT_RULES_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "grammar_info.hpp" | ||
| 10 | #include "rule_info.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | namespace analysis | ||
| 17 | { | ||
| 18 | template< typename... > | ||
| 19 | struct insert_rules; | ||
| 20 | |||
| 21 | template<> | ||
| 22 | struct insert_rules<> | ||
| 23 | { | ||
| 24 | static void insert( grammar_info&, rule_info& ) | ||
| 25 | { | ||
| 26 | } | ||
| 27 | }; | ||
| 28 | |||
| 29 | template< typename Rule, typename... Rules > | ||
| 30 | struct insert_rules< Rule, Rules... > | ||
| 31 | { | ||
| 32 | static void insert( grammar_info& g, rule_info& r ) | ||
| 33 | { | ||
| 34 | r.rules.push_back( Rule::analyze_t::template insert< Rule >( g ) ); | ||
| 35 | insert_rules< Rules... >::insert( g, r ); | ||
| 36 | } | ||
| 37 | }; | ||
| 38 | |||
| 39 | } // namespace analysis | ||
| 40 | |||
| 41 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 42 | |||
| 43 | } // namespace tao | ||
| 44 | |||
| 45 | #endif | ||
diff --git a/MoonParser/pegtl/analysis/rule_info.hpp b/MoonParser/pegtl/analysis/rule_info.hpp new file mode 100644 index 0000000..22910ec --- /dev/null +++ b/MoonParser/pegtl/analysis/rule_info.hpp | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ANALYSIS_RULE_INFO_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ANALYSIS_RULE_INFO_HPP | ||
| 6 | |||
| 7 | #include <string> | ||
| 8 | #include <vector> | ||
| 9 | |||
| 10 | #include "../config.hpp" | ||
| 11 | |||
| 12 | #include "rule_type.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace analysis | ||
| 19 | { | ||
| 20 | struct rule_info | ||
| 21 | { | ||
| 22 | explicit rule_info( const rule_type in_type ) | ||
| 23 | : type( in_type ) | ||
| 24 | { | ||
| 25 | } | ||
| 26 | |||
| 27 | rule_type type; | ||
| 28 | std::vector< std::string > rules; | ||
| 29 | }; | ||
| 30 | |||
| 31 | } // namespace analysis | ||
| 32 | |||
| 33 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 34 | |||
| 35 | } // namespace tao | ||
| 36 | |||
| 37 | #endif | ||
diff --git a/MoonParser/pegtl/analysis/rule_type.hpp b/MoonParser/pegtl/analysis/rule_type.hpp new file mode 100644 index 0000000..fc5d4c8 --- /dev/null +++ b/MoonParser/pegtl/analysis/rule_type.hpp | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ANALYSIS_RULE_TYPE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ANALYSIS_RULE_TYPE_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | namespace analysis | ||
| 14 | { | ||
| 15 | enum class rule_type : char | ||
| 16 | { | ||
| 17 | ANY, // Consumption-on-success is always true; assumes bounded repetition of conjunction of sub-rules. | ||
| 18 | OPT, // Consumption-on-success not necessarily true; assumes bounded repetition of conjunction of sub-rules. | ||
| 19 | SEQ, // Consumption-on-success depends on consumption of (non-zero bounded repetition of) conjunction of sub-rules. | ||
| 20 | SOR // Consumption-on-success depends on consumption of (non-zero bounded repetition of) disjunction of sub-rules. | ||
| 21 | }; | ||
| 22 | |||
| 23 | } // namespace analysis | ||
| 24 | |||
| 25 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 26 | |||
| 27 | } // namespace tao | ||
| 28 | |||
| 29 | #endif | ||
diff --git a/MoonParser/pegtl/analyze.hpp b/MoonParser/pegtl/analyze.hpp new file mode 100644 index 0000000..5468a14 --- /dev/null +++ b/MoonParser/pegtl/analyze.hpp | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ANALYZE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ANALYZE_HPP | ||
| 6 | |||
| 7 | #include "config.hpp" | ||
| 8 | |||
| 9 | #include "analysis/analyze_cycles.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | template< typename Rule > | ||
| 16 | std::size_t analyze( const bool verbose = true ) | ||
| 17 | { | ||
| 18 | return analysis::analyze_cycles< Rule >( verbose ).problems(); | ||
| 19 | } | ||
| 20 | |||
| 21 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 22 | |||
| 23 | } // namespace tao | ||
| 24 | |||
| 25 | #endif | ||
diff --git a/MoonParser/pegtl/apply_mode.hpp b/MoonParser/pegtl/apply_mode.hpp new file mode 100644 index 0000000..93a701b --- /dev/null +++ b/MoonParser/pegtl/apply_mode.hpp | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_APPLY_MODE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_APPLY_MODE_HPP | ||
| 6 | |||
| 7 | #include "config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | enum class apply_mode : bool | ||
| 14 | { | ||
| 15 | ACTION = true, | ||
| 16 | NOTHING = false | ||
| 17 | }; | ||
| 18 | |||
| 19 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 20 | |||
| 21 | } // namespace tao | ||
| 22 | |||
| 23 | #endif | ||
diff --git a/MoonParser/pegtl/argv_input.hpp b/MoonParser/pegtl/argv_input.hpp new file mode 100644 index 0000000..3846975 --- /dev/null +++ b/MoonParser/pegtl/argv_input.hpp | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ARGV_INPUT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ARGV_INPUT_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | #include <sstream> | ||
| 9 | #include <string> | ||
| 10 | #include <utility> | ||
| 11 | |||
| 12 | #include "config.hpp" | ||
| 13 | #include "eol.hpp" | ||
| 14 | #include "memory_input.hpp" | ||
| 15 | #include "tracking_mode.hpp" | ||
| 16 | |||
| 17 | namespace tao | ||
| 18 | { | ||
| 19 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 20 | { | ||
| 21 | namespace internal | ||
| 22 | { | ||
| 23 | inline std::string make_argv_source( const std::size_t argn ) | ||
| 24 | { | ||
| 25 | std::ostringstream os; | ||
| 26 | os << "argv[" << argn << ']'; | ||
| 27 | return os.str(); | ||
| 28 | } | ||
| 29 | |||
| 30 | } // namespace internal | ||
| 31 | |||
| 32 | template< tracking_mode P = tracking_mode::IMMEDIATE, typename Eol = eol::lf_crlf > | ||
| 33 | struct argv_input | ||
| 34 | : public memory_input< P, Eol > | ||
| 35 | { | ||
| 36 | template< typename T > | ||
| 37 | argv_input( char** argv, const std::size_t argn, T&& in_source ) | ||
| 38 | : memory_input< P, Eol >( static_cast< const char* >( argv[ argn ] ), std::forward< T >( in_source ) ) | ||
| 39 | { | ||
| 40 | } | ||
| 41 | |||
| 42 | argv_input( char** argv, const std::size_t argn ) | ||
| 43 | : argv_input( argv, argn, internal::make_argv_source( argn ) ) | ||
| 44 | { | ||
| 45 | } | ||
| 46 | }; | ||
| 47 | |||
| 48 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 49 | |||
| 50 | } // namespace tao | ||
| 51 | |||
| 52 | #endif | ||
diff --git a/MoonParser/pegtl/ascii.hpp b/MoonParser/pegtl/ascii.hpp new file mode 100644 index 0000000..9158061 --- /dev/null +++ b/MoonParser/pegtl/ascii.hpp | |||
| @@ -0,0 +1,67 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ASCII_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ASCII_HPP | ||
| 6 | |||
| 7 | #include "config.hpp" | ||
| 8 | #include "eol.hpp" | ||
| 9 | |||
| 10 | #include "internal/result_on_found.hpp" | ||
| 11 | #include "internal/rules.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | inline namespace ascii | ||
| 18 | { | ||
| 19 | // clang-format off | ||
| 20 | struct alnum : internal::alnum {}; | ||
| 21 | struct alpha : internal::alpha {}; | ||
| 22 | struct any : internal::any< internal::peek_char > {}; | ||
| 23 | struct blank : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, ' ', '\t' > {}; | ||
| 24 | struct digit : internal::range< internal::result_on_found::SUCCESS, internal::peek_char, '0', '9' > {}; | ||
| 25 | struct eolf : internal::eolf {}; | ||
| 26 | struct identifier_first : internal::identifier_first {}; | ||
| 27 | struct identifier_other : internal::identifier_other {}; | ||
| 28 | struct identifier : internal::identifier {}; | ||
| 29 | template< char... Cs > struct istring : internal::istring< Cs... > {}; | ||
| 30 | template< char... Cs > struct keyword : internal::seq< internal::string< Cs... >, internal::not_at< internal::identifier_other > > {}; | ||
| 31 | struct lower : internal::range< internal::result_on_found::SUCCESS, internal::peek_char, 'a', 'z' > {}; | ||
| 32 | template< char... Cs > struct not_one : internal::one< internal::result_on_found::FAILURE, internal::peek_char, Cs... > {}; | ||
| 33 | template< char Lo, char Hi > struct not_range : internal::range< internal::result_on_found::FAILURE, internal::peek_char, Lo, Hi > {}; | ||
| 34 | struct nul : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, char( 0 ) > {}; | ||
| 35 | template< char... Cs > struct one : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, Cs... > {}; | ||
| 36 | struct print : internal::range< internal::result_on_found::SUCCESS, internal::peek_char, char( 32 ), char( 126 ) > {}; | ||
| 37 | template< char Lo, char Hi > struct range : internal::range< internal::result_on_found::SUCCESS, internal::peek_char, Lo, Hi > {}; | ||
| 38 | template< char... Cs > struct ranges : internal::ranges< internal::peek_char, Cs... > {}; | ||
| 39 | struct seven : internal::range< internal::result_on_found::SUCCESS, internal::peek_char, char( 0 ), char( 127 ) > {}; | ||
| 40 | struct shebang : internal::if_must< internal::string< '#', '!' >, internal::until< internal::eolf > > {}; | ||
| 41 | struct space : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, ' ', '\n', '\r', '\t', '\v', '\f' > {}; | ||
| 42 | template< char... Cs > struct string : internal::string< Cs... > {}; | ||
| 43 | template< char C > struct two : internal::string< C, C > {}; | ||
| 44 | struct upper : internal::range< internal::result_on_found::SUCCESS, internal::peek_char, 'A', 'Z' > {}; | ||
| 45 | struct xdigit : internal::ranges< internal::peek_char, '0', '9', 'a', 'f', 'A', 'F' > {}; | ||
| 46 | // clang-format on | ||
| 47 | |||
| 48 | template<> | ||
| 49 | struct keyword<> | ||
| 50 | { | ||
| 51 | template< typename Input > | ||
| 52 | static bool match( Input& ) noexcept | ||
| 53 | { | ||
| 54 | static_assert( sizeof( Input ) == 0, "empty keywords not allowed" ); | ||
| 55 | return false; | ||
| 56 | } | ||
| 57 | }; | ||
| 58 | |||
| 59 | } // namespace ascii | ||
| 60 | |||
| 61 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 62 | |||
| 63 | } // namespace tao | ||
| 64 | |||
| 65 | #include "internal/pegtl_string.hpp" | ||
| 66 | |||
| 67 | #endif | ||
diff --git a/MoonParser/pegtl/buffer_input.hpp b/MoonParser/pegtl/buffer_input.hpp new file mode 100644 index 0000000..b65e365 --- /dev/null +++ b/MoonParser/pegtl/buffer_input.hpp | |||
| @@ -0,0 +1,179 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_BUFFER_INPUT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_BUFFER_INPUT_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | #include <cstring> | ||
| 9 | #include <memory> | ||
| 10 | #include <string> | ||
| 11 | |||
| 12 | #include "config.hpp" | ||
| 13 | #include "eol.hpp" | ||
| 14 | #include "memory_input.hpp" | ||
| 15 | #include "position.hpp" | ||
| 16 | #include "tracking_mode.hpp" | ||
| 17 | |||
| 18 | #include "internal/action_input.hpp" | ||
| 19 | #include "internal/bump_impl.hpp" | ||
| 20 | #include "internal/iterator.hpp" | ||
| 21 | #include "internal/marker.hpp" | ||
| 22 | |||
| 23 | namespace tao | ||
| 24 | { | ||
| 25 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 26 | { | ||
| 27 | template< typename Reader, typename Eol = eol::lf_crlf, typename Source = std::string > | ||
| 28 | class buffer_input | ||
| 29 | { | ||
| 30 | public: | ||
| 31 | static constexpr tracking_mode tracking_mode_v = tracking_mode::IMMEDIATE; | ||
| 32 | using reader_t = Reader; | ||
| 33 | |||
| 34 | using eol_t = Eol; | ||
| 35 | using source_t = Source; | ||
| 36 | |||
| 37 | using iterator_t = internal::iterator; | ||
| 38 | |||
| 39 | using action_t = internal::action_input< buffer_input >; | ||
| 40 | |||
| 41 | template< typename T, typename... As > | ||
| 42 | buffer_input( T&& in_source, const std::size_t maximum, As&&... as ) | ||
| 43 | : m_reader( std::forward< As >( as )... ), | ||
| 44 | m_maximum( maximum ), | ||
| 45 | m_buffer( new char[ maximum ] ), | ||
| 46 | m_current( m_buffer.get() ), | ||
| 47 | m_end( m_buffer.get() ), | ||
| 48 | m_source( std::forward< T >( in_source ) ) | ||
| 49 | { | ||
| 50 | } | ||
| 51 | |||
| 52 | buffer_input( const buffer_input& ) = delete; | ||
| 53 | void operator=( const buffer_input& ) = delete; | ||
| 54 | |||
| 55 | bool empty() | ||
| 56 | { | ||
| 57 | require( 1 ); | ||
| 58 | return m_current.data == m_end; | ||
| 59 | } | ||
| 60 | |||
| 61 | std::size_t size( const std::size_t amount ) | ||
| 62 | { | ||
| 63 | require( amount ); | ||
| 64 | return std::size_t( m_end - m_current.data ); | ||
| 65 | } | ||
| 66 | |||
| 67 | const char* current() const noexcept | ||
| 68 | { | ||
| 69 | return m_current.data; | ||
| 70 | } | ||
| 71 | |||
| 72 | const char* end( const std::size_t amount ) | ||
| 73 | { | ||
| 74 | require( amount ); | ||
| 75 | return m_end; | ||
| 76 | } | ||
| 77 | |||
| 78 | std::size_t byte() const noexcept | ||
| 79 | { | ||
| 80 | return m_current.byte; | ||
| 81 | } | ||
| 82 | |||
| 83 | std::size_t line() const noexcept | ||
| 84 | { | ||
| 85 | return m_current.line; | ||
| 86 | } | ||
| 87 | |||
| 88 | std::size_t byte_in_line() const noexcept | ||
| 89 | { | ||
| 90 | return m_current.byte_in_line; | ||
| 91 | } | ||
| 92 | |||
| 93 | const Source& source() const noexcept | ||
| 94 | { | ||
| 95 | return m_source; | ||
| 96 | } | ||
| 97 | |||
| 98 | char peek_char( const std::size_t offset = 0 ) const noexcept | ||
| 99 | { | ||
| 100 | return m_current.data[ offset ]; | ||
| 101 | } | ||
| 102 | |||
| 103 | unsigned char peek_byte( const std::size_t offset = 0 ) const noexcept | ||
| 104 | { | ||
| 105 | return static_cast< unsigned char >( peek_char( offset ) ); | ||
| 106 | } | ||
| 107 | |||
| 108 | void bump( const std::size_t in_count = 1 ) noexcept | ||
| 109 | { | ||
| 110 | internal::bump( m_current, in_count, Eol::ch ); | ||
| 111 | } | ||
| 112 | |||
| 113 | void bump_in_this_line( const std::size_t in_count = 1 ) noexcept | ||
| 114 | { | ||
| 115 | internal::bump_in_this_line( m_current, in_count ); | ||
| 116 | } | ||
| 117 | |||
| 118 | void bump_to_next_line( const std::size_t in_count = 1 ) noexcept | ||
| 119 | { | ||
| 120 | internal::bump_to_next_line( m_current, in_count ); | ||
| 121 | } | ||
| 122 | |||
| 123 | void discard() noexcept | ||
| 124 | { | ||
| 125 | const auto s = m_end - m_current.data; | ||
| 126 | std::memmove( m_buffer.get(), m_current.data, s ); | ||
| 127 | m_current.data = m_buffer.get(); | ||
| 128 | m_end = m_buffer.get() + s; | ||
| 129 | } | ||
| 130 | |||
| 131 | void require( const std::size_t amount ) | ||
| 132 | { | ||
| 133 | if( m_current.data + amount > m_end ) { | ||
| 134 | if( m_current.data + amount <= m_buffer.get() + m_maximum ) { | ||
| 135 | if( const auto r = m_reader( const_cast< char* >( m_end ), amount - std::size_t( m_end - m_current.data ) ) ) { | ||
| 136 | m_end += r; | ||
| 137 | } | ||
| 138 | else { | ||
| 139 | m_maximum = 0; | ||
| 140 | } | ||
| 141 | } | ||
| 142 | } | ||
| 143 | } | ||
| 144 | |||
| 145 | template< rewind_mode M > | ||
| 146 | internal::marker< iterator_t, M > mark() noexcept | ||
| 147 | { | ||
| 148 | return internal::marker< iterator_t, M >( m_current ); | ||
| 149 | } | ||
| 150 | |||
| 151 | TAOCPP_PEGTL_NAMESPACE::position position( const iterator_t& it ) const | ||
| 152 | { | ||
| 153 | return TAOCPP_PEGTL_NAMESPACE::position( it, m_source ); | ||
| 154 | } | ||
| 155 | |||
| 156 | TAOCPP_PEGTL_NAMESPACE::position position() const | ||
| 157 | { | ||
| 158 | return position( m_current ); | ||
| 159 | } | ||
| 160 | |||
| 161 | const iterator_t& iterator() const noexcept | ||
| 162 | { | ||
| 163 | return m_current; | ||
| 164 | } | ||
| 165 | |||
| 166 | private: | ||
| 167 | Reader m_reader; | ||
| 168 | std::size_t m_maximum; | ||
| 169 | std::unique_ptr< char[] > m_buffer; | ||
| 170 | iterator_t m_current; | ||
| 171 | const char* m_end; | ||
| 172 | const Source m_source; | ||
| 173 | }; | ||
| 174 | |||
| 175 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 176 | |||
| 177 | } // namespace tao | ||
| 178 | |||
| 179 | #endif | ||
diff --git a/MoonParser/pegtl/config.hpp b/MoonParser/pegtl/config.hpp new file mode 100644 index 0000000..e93f74a --- /dev/null +++ b/MoonParser/pegtl/config.hpp | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONFIG_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONFIG_HPP | ||
| 6 | |||
| 7 | #ifndef TAOCPP_PEGTL_NAMESPACE | ||
| 8 | #define TAOCPP_PEGTL_NAMESPACE pegtl | ||
| 9 | #endif | ||
| 10 | |||
| 11 | // Enable some improvements to the readability of | ||
| 12 | // demangled type names under some circumstances. | ||
| 13 | // #define TAOCPP_PEGTL_PRETTY_DEMANGLE | ||
| 14 | |||
| 15 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/abnf.hpp b/MoonParser/pegtl/contrib/abnf.hpp new file mode 100644 index 0000000..15319f5 --- /dev/null +++ b/MoonParser/pegtl/contrib/abnf.hpp | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_ABNF_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_ABNF_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | #include "../internal/rules.hpp" | ||
| 9 | |||
| 10 | namespace tao | ||
| 11 | { | ||
| 12 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 13 | { | ||
| 14 | namespace abnf | ||
| 15 | { | ||
| 16 | // Core ABNF rules according to RFC 5234, Appendix B | ||
| 17 | |||
| 18 | // clang-format off | ||
| 19 | struct ALPHA : internal::ranges< internal::peek_char, 'a', 'z', 'A', 'Z' > {}; | ||
| 20 | struct BIT : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, '0', '1' > {}; | ||
| 21 | struct CHAR : internal::range< internal::result_on_found::SUCCESS, internal::peek_char, char( 1 ), char( 127 ) > {}; | ||
| 22 | struct CR : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, '\r' > {}; | ||
| 23 | struct CRLF : internal::string< '\r', '\n' > {}; | ||
| 24 | struct CTL : internal::ranges< internal::peek_char, char( 0 ), char( 31 ), char( 127 ) > {}; | ||
| 25 | struct DIGIT : internal::range< internal::result_on_found::SUCCESS, internal::peek_char, '0', '9' > {}; | ||
| 26 | struct DQUOTE : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, '"' > {}; | ||
| 27 | struct HEXDIG : internal::ranges< internal::peek_char, '0', '9', 'a', 'f', 'A', 'F' > {}; | ||
| 28 | struct HTAB : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, '\t' > {}; | ||
| 29 | struct LF : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, '\n' > {}; | ||
| 30 | struct LWSP : internal::star< internal::sor< internal::string< '\r', '\n' >, internal::one< internal::result_on_found::SUCCESS, internal::peek_char, ' ', '\t' > >, internal::one< internal::result_on_found::SUCCESS, internal::peek_char, ' ', '\t' > > {}; | ||
| 31 | struct OCTET : internal::any< internal::peek_char > {}; | ||
| 32 | struct SP : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, ' ' > {}; | ||
| 33 | struct VCHAR : internal::range< internal::result_on_found::SUCCESS, internal::peek_char, char( 33 ), char( 126 ) > {}; | ||
| 34 | struct WSP : internal::one< internal::result_on_found::SUCCESS, internal::peek_char, ' ', '\t' > {}; | ||
| 35 | // clang-format on | ||
| 36 | |||
| 37 | } // namespace abnf | ||
| 38 | |||
| 39 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 40 | |||
| 41 | } // namespace tao | ||
| 42 | |||
| 43 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/alphabet.hpp b/MoonParser/pegtl/contrib/alphabet.hpp new file mode 100644 index 0000000..c0dce42 --- /dev/null +++ b/MoonParser/pegtl/contrib/alphabet.hpp | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | // Copyright (c) 2015-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_ALPHABET_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_ALPHABET_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | inline namespace alphabet | ||
| 14 | { | ||
| 15 | static const int a = 'a'; | ||
| 16 | static const int b = 'b'; | ||
| 17 | static const int c = 'c'; | ||
| 18 | static const int d = 'd'; | ||
| 19 | static const int e = 'e'; | ||
| 20 | static const int f = 'f'; | ||
| 21 | static const int g = 'g'; | ||
| 22 | static const int h = 'h'; | ||
| 23 | static const int i = 'i'; | ||
| 24 | static const int j = 'j'; | ||
| 25 | static const int k = 'k'; | ||
| 26 | static const int l = 'l'; | ||
| 27 | static const int m = 'm'; | ||
| 28 | static const int n = 'n'; | ||
| 29 | static const int o = 'o'; | ||
| 30 | static const int p = 'p'; | ||
| 31 | static const int q = 'q'; | ||
| 32 | static const int r = 'r'; | ||
| 33 | static const int s = 's'; | ||
| 34 | static const int t = 't'; | ||
| 35 | static const int u = 'u'; | ||
| 36 | static const int v = 'v'; | ||
| 37 | static const int w = 'w'; | ||
| 38 | static const int x = 'x'; | ||
| 39 | static const int y = 'y'; | ||
| 40 | static const int z = 'z'; | ||
| 41 | |||
| 42 | static const int A = 'A'; | ||
| 43 | static const int B = 'B'; | ||
| 44 | static const int C = 'C'; | ||
| 45 | static const int D = 'D'; | ||
| 46 | static const int E = 'E'; | ||
| 47 | static const int F = 'F'; | ||
| 48 | static const int G = 'G'; | ||
| 49 | static const int H = 'H'; | ||
| 50 | static const int I = 'I'; | ||
| 51 | static const int J = 'J'; | ||
| 52 | static const int K = 'K'; | ||
| 53 | static const int L = 'L'; | ||
| 54 | static const int M = 'M'; | ||
| 55 | static const int N = 'N'; | ||
| 56 | static const int O = 'O'; | ||
| 57 | static const int P = 'P'; | ||
| 58 | static const int Q = 'Q'; | ||
| 59 | static const int R = 'R'; | ||
| 60 | static const int S = 'S'; | ||
| 61 | static const int T = 'T'; | ||
| 62 | static const int U = 'U'; | ||
| 63 | static const int V = 'V'; | ||
| 64 | static const int W = 'W'; | ||
| 65 | static const int X = 'X'; | ||
| 66 | static const int Y = 'Y'; | ||
| 67 | static const int Z = 'Z'; | ||
| 68 | |||
| 69 | } // namespace alphabet | ||
| 70 | |||
| 71 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 72 | |||
| 73 | } // namespace tao | ||
| 74 | |||
| 75 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/changes.hpp b/MoonParser/pegtl/contrib/changes.hpp new file mode 100644 index 0000000..7b9f8dc --- /dev/null +++ b/MoonParser/pegtl/contrib/changes.hpp | |||
| @@ -0,0 +1,86 @@ | |||
| 1 | // Copyright (c) 2015-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_CHANGES_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_CHANGES_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | #include "../normal.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | namespace internal | ||
| 17 | { | ||
| 18 | struct dummy_disabled_state | ||
| 19 | { | ||
| 20 | template< typename... Ts > | ||
| 21 | void success( Ts&&... ) const noexcept | ||
| 22 | { | ||
| 23 | } | ||
| 24 | }; | ||
| 25 | |||
| 26 | template< apply_mode A, typename State > | ||
| 27 | using state_disable_helper = typename std::conditional< A == apply_mode::ACTION, State, dummy_disabled_state >::type; | ||
| 28 | |||
| 29 | } // namespace internal | ||
| 30 | |||
| 31 | template< typename Rule, typename State, template< typename... > class Base = normal > | ||
| 32 | struct change_state | ||
| 33 | : public Base< Rule > | ||
| 34 | { | ||
| 35 | template< apply_mode A, | ||
| 36 | rewind_mode M, | ||
| 37 | template< typename... > class Action, | ||
| 38 | template< typename... > class Control, | ||
| 39 | typename Input, | ||
| 40 | typename... States > | ||
| 41 | static bool match( Input& in, States&&... st ) | ||
| 42 | { | ||
| 43 | internal::state_disable_helper< A, State > s; | ||
| 44 | |||
| 45 | if( Base< Rule >::template match< A, M, Action, Control >( in, s ) ) { | ||
| 46 | s.success( st... ); | ||
| 47 | return true; | ||
| 48 | } | ||
| 49 | return false; | ||
| 50 | } | ||
| 51 | }; | ||
| 52 | |||
| 53 | template< typename Rule, template< typename... > class Action, template< typename... > class Base = normal > | ||
| 54 | struct change_action | ||
| 55 | : public Base< Rule > | ||
| 56 | { | ||
| 57 | template< apply_mode A, | ||
| 58 | rewind_mode M, | ||
| 59 | template< typename... > class, | ||
| 60 | template< typename... > class Control, | ||
| 61 | typename Input, | ||
| 62 | typename... States > | ||
| 63 | static bool match( Input& in, States&&... st ) | ||
| 64 | { | ||
| 65 | return Base< Rule >::template match< A, M, Action, Control >( in, st... ); | ||
| 66 | } | ||
| 67 | }; | ||
| 68 | |||
| 69 | template< template< typename... > class Action, template< typename... > class Base > | ||
| 70 | struct change_both_helper | ||
| 71 | { | ||
| 72 | template< typename T > | ||
| 73 | using change_action = change_action< T, Action, Base >; | ||
| 74 | }; | ||
| 75 | |||
| 76 | template< typename Rule, typename State, template< typename... > class Action, template< typename... > class Base = normal > | ||
| 77 | struct change_state_and_action | ||
| 78 | : public change_state< Rule, State, change_both_helper< Action, Base >::template change_action > | ||
| 79 | { | ||
| 80 | }; | ||
| 81 | |||
| 82 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 83 | |||
| 84 | } // namespace tao | ||
| 85 | |||
| 86 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/counter.hpp b/MoonParser/pegtl/contrib/counter.hpp new file mode 100644 index 0000000..52beb3b --- /dev/null +++ b/MoonParser/pegtl/contrib/counter.hpp | |||
| @@ -0,0 +1,58 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_COUNTER_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_COUNTER_HPP | ||
| 6 | |||
| 7 | #include <cassert> | ||
| 8 | #include <utility> | ||
| 9 | |||
| 10 | #include "../config.hpp" | ||
| 11 | #include "../normal.hpp" | ||
| 12 | |||
| 13 | #include "../internal/demangle.hpp" | ||
| 14 | |||
| 15 | namespace tao | ||
| 16 | { | ||
| 17 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 18 | { | ||
| 19 | struct counter_data | ||
| 20 | { | ||
| 21 | unsigned start = 0; | ||
| 22 | unsigned success = 0; | ||
| 23 | unsigned failure = 0; | ||
| 24 | }; | ||
| 25 | |||
| 26 | struct counter_state | ||
| 27 | { | ||
| 28 | std::map< std::string, counter_data > counts; | ||
| 29 | }; | ||
| 30 | |||
| 31 | template< typename Rule > | ||
| 32 | struct counter | ||
| 33 | : normal< Rule > | ||
| 34 | { | ||
| 35 | template< typename Input > | ||
| 36 | static void start( const Input&, counter_state& ts ) | ||
| 37 | { | ||
| 38 | ++ts.counts[ internal::demangle< Rule >() ].start; | ||
| 39 | } | ||
| 40 | |||
| 41 | template< typename Input > | ||
| 42 | static void success( const Input&, counter_state& ts ) | ||
| 43 | { | ||
| 44 | ++ts.counts[ internal::demangle< Rule >() ].success; | ||
| 45 | } | ||
| 46 | |||
| 47 | template< typename Input > | ||
| 48 | static void failure( const Input&, counter_state& ts ) | ||
| 49 | { | ||
| 50 | ++ts.counts[ internal::demangle< Rule >() ].failure; | ||
| 51 | } | ||
| 52 | }; | ||
| 53 | |||
| 54 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 55 | |||
| 56 | } // namespace tao | ||
| 57 | |||
| 58 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/http.hpp b/MoonParser/pegtl/contrib/http.hpp new file mode 100644 index 0000000..1446449 --- /dev/null +++ b/MoonParser/pegtl/contrib/http.hpp | |||
| @@ -0,0 +1,152 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_HTTP_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_HTTP_HPP | ||
| 6 | |||
| 7 | #include "../ascii.hpp" | ||
| 8 | #include "../config.hpp" | ||
| 9 | #include "../rules.hpp" | ||
| 10 | #include "../utf8.hpp" | ||
| 11 | #include "abnf.hpp" | ||
| 12 | #include "uri.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace http | ||
| 19 | { | ||
| 20 | // HTTP 1.1 grammar according to RFC 7230. | ||
| 21 | |||
| 22 | // This grammar is a direct PEG translation of the original HTTP grammar. | ||
| 23 | // It should be considered experimental -- in case of any issues, in particular | ||
| 24 | // missing rules for attached actions, please contact the developers. | ||
| 25 | |||
| 26 | using namespace abnf; | ||
| 27 | |||
| 28 | using OWS = star< WSP >; // optional whitespace | ||
| 29 | using RWS = plus< WSP >; // required whitespace | ||
| 30 | using BWS = OWS; // "bad" whitespace | ||
| 31 | |||
| 32 | // cppcheck-suppress constStatement | ||
| 33 | using obs_text = not_range< 0x00, 0x7F >; | ||
| 34 | using obs_fold = seq< CRLF, plus< WSP > >; | ||
| 35 | |||
| 36 | // clang-format off | ||
| 37 | struct tchar : sor< ALPHA, DIGIT, one< '!', '#', '$', '%', '&', '\'', '*', '+', '-', '.', '^', '_', '`', '|', '~' > > {}; | ||
| 38 | struct token : plus< tchar > {}; | ||
| 39 | |||
| 40 | struct field_name : token {}; | ||
| 41 | |||
| 42 | struct field_vchar : sor< VCHAR, obs_text > {}; | ||
| 43 | struct field_content : list< field_vchar, plus< WSP > > {}; | ||
| 44 | struct field_value : star< sor< field_content, obs_fold > > {}; | ||
| 45 | |||
| 46 | struct header_field : seq< field_name, one< ':' >, OWS, field_value, OWS > {}; | ||
| 47 | |||
| 48 | struct method : token {}; | ||
| 49 | |||
| 50 | struct absolute_path : plus< one< '/' >, uri::segment > {}; | ||
| 51 | |||
| 52 | struct origin_form : seq< absolute_path, uri::opt_query > {}; | ||
| 53 | struct absolute_form : uri::absolute_URI {}; | ||
| 54 | struct authority_form : uri::authority {}; | ||
| 55 | struct asterisk_form : one< '*' > {}; | ||
| 56 | |||
| 57 | struct request_target : sor< origin_form, absolute_form, authority_form, asterisk_form > {}; | ||
| 58 | |||
| 59 | struct status_code : rep< 3, DIGIT > {}; | ||
| 60 | struct reason_phrase : star< sor< VCHAR, obs_text, WSP > > {}; | ||
| 61 | |||
| 62 | struct HTTP_version : if_must< TAOCPP_PEGTL_STRING( "HTTP/" ), DIGIT, one< '.' >, DIGIT > {}; | ||
| 63 | |||
| 64 | struct request_line : if_must< method, SP, request_target, SP, HTTP_version, CRLF > {}; | ||
| 65 | struct status_line : if_must< HTTP_version, SP, status_code, SP, reason_phrase, CRLF > {}; | ||
| 66 | struct start_line : sor< status_line, request_line > {}; | ||
| 67 | |||
| 68 | struct message_body : star< OCTET > {}; | ||
| 69 | struct HTTP_message : seq< start_line, star< header_field, CRLF >, CRLF, opt< message_body > > {}; | ||
| 70 | |||
| 71 | struct Content_Length : plus< DIGIT > {}; | ||
| 72 | |||
| 73 | struct uri_host : uri::host {}; | ||
| 74 | struct port : uri::port {}; | ||
| 75 | |||
| 76 | struct Host : seq< uri_host, opt< one< ':' >, port > > {}; | ||
| 77 | |||
| 78 | // PEG are different from CFGs! (this replaces ctext and qdtext) | ||
| 79 | using text = sor< HTAB, range< 0x20, 0x7E >, obs_text >; | ||
| 80 | |||
| 81 | struct quoted_pair : if_must< one< '\\' >, sor< VCHAR, obs_text, WSP > > {}; | ||
| 82 | struct quoted_string : if_must< DQUOTE, until< DQUOTE, sor< quoted_pair, text > > > {}; | ||
| 83 | |||
| 84 | struct transfer_parameter : seq< token, BWS, one< '=' >, BWS, sor< token, quoted_string > > {}; | ||
| 85 | struct transfer_extension : seq< token, star< OWS, one< ';' >, OWS, transfer_parameter > > {}; | ||
| 86 | struct transfer_coding : sor< TAOCPP_PEGTL_ISTRING( "chunked" ), | ||
| 87 | TAOCPP_PEGTL_ISTRING( "compress" ), | ||
| 88 | TAOCPP_PEGTL_ISTRING( "deflate" ), | ||
| 89 | TAOCPP_PEGTL_ISTRING( "gzip" ), | ||
| 90 | transfer_extension > {}; | ||
| 91 | |||
| 92 | struct rank : sor< seq< one< '0' >, opt< one< '.' >, rep_opt< 3, DIGIT > > >, | ||
| 93 | seq< one< '1' >, opt< one< '.' >, rep_opt< 3, one< '0' > > > > > {}; | ||
| 94 | |||
| 95 | struct t_ranking : seq< OWS, one< ';' >, OWS, one< 'q', 'Q' >, one< '=' >, rank > {}; | ||
| 96 | struct t_codings : sor< TAOCPP_PEGTL_ISTRING( "trailers" ), seq< transfer_coding, opt< t_ranking > > > {}; | ||
| 97 | |||
| 98 | struct TE : opt< sor< one< ',' >, t_codings >, star< OWS, one< ',' >, opt< OWS, t_codings > > > {}; | ||
| 99 | |||
| 100 | template< typename T > | ||
| 101 | using make_comma_list = seq< star< one< ',' >, OWS >, T, star< OWS, one< ',' >, opt< OWS, T > > >; | ||
| 102 | |||
| 103 | struct connection_option : token {}; | ||
| 104 | struct Connection : make_comma_list< connection_option > {}; | ||
| 105 | |||
| 106 | struct Trailer : make_comma_list< field_name > {}; | ||
| 107 | |||
| 108 | struct Transfer_Encoding : make_comma_list< transfer_coding > {}; | ||
| 109 | |||
| 110 | struct protocol_name : token {}; | ||
| 111 | struct protocol_version : token {}; | ||
| 112 | struct protocol : seq< protocol_name, opt< one< '/' >, protocol_version > > {}; | ||
| 113 | struct Upgrade : make_comma_list< protocol > {}; | ||
| 114 | |||
| 115 | struct pseudonym : token {}; | ||
| 116 | |||
| 117 | struct received_protocol : seq< opt< protocol_name, one< '/' > >, protocol_version > {}; | ||
| 118 | struct received_by : sor< seq< uri_host, opt< one< ':' >, port > >, pseudonym > {}; | ||
| 119 | |||
| 120 | struct comment : if_must< one< '(' >, until< one< ')' >, sor< comment, quoted_pair, text > > > {}; | ||
| 121 | |||
| 122 | struct Via : make_comma_list< seq< received_protocol, RWS, received_by, opt< RWS, comment > > > {}; | ||
| 123 | |||
| 124 | struct http_URI : if_must< TAOCPP_PEGTL_ISTRING( "http://" ), uri::authority, uri::path_abempty, uri::opt_query, uri::opt_fragment > {}; | ||
| 125 | struct https_URI : if_must< TAOCPP_PEGTL_ISTRING( "https://" ), uri::authority, uri::path_abempty, uri::opt_query, uri::opt_fragment > {}; | ||
| 126 | |||
| 127 | struct partial_URI : seq< uri::relative_part, uri::opt_query > {}; | ||
| 128 | |||
| 129 | struct chunk_size : plus< HEXDIG > {}; | ||
| 130 | |||
| 131 | struct chunk_ext_name : token {}; | ||
| 132 | struct chunk_ext_val : sor< quoted_string, token > {}; | ||
| 133 | struct chunk_ext : star< if_must< one< ';' >, chunk_ext_name, if_must< one< '=' >, chunk_ext_val > > > {}; | ||
| 134 | |||
| 135 | struct chunk_data : until< at< CRLF >, OCTET > {}; | ||
| 136 | |||
| 137 | struct chunk : seq< chunk_size, opt< chunk_ext >, CRLF, chunk_data, CRLF > {}; | ||
| 138 | |||
| 139 | struct last_chunk : seq< plus< one< '0' > >, opt< chunk_ext >, CRLF > {}; | ||
| 140 | |||
| 141 | struct trailer_part : star< header_field, CRLF > {}; | ||
| 142 | |||
| 143 | struct chunked_body : seq< until< last_chunk, chunk >, trailer_part, CRLF > {}; | ||
| 144 | // clang-format on | ||
| 145 | |||
| 146 | } // namespace http | ||
| 147 | |||
| 148 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 149 | |||
| 150 | } // namespace tao | ||
| 151 | |||
| 152 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/json.hpp b/MoonParser/pegtl/contrib/json.hpp new file mode 100644 index 0000000..688f607 --- /dev/null +++ b/MoonParser/pegtl/contrib/json.hpp | |||
| @@ -0,0 +1,98 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_JSON_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_JSON_HPP | ||
| 6 | |||
| 7 | #include "../ascii.hpp" | ||
| 8 | #include "../config.hpp" | ||
| 9 | #include "../rules.hpp" | ||
| 10 | #include "../utf8.hpp" | ||
| 11 | |||
| 12 | #include "abnf.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace json | ||
| 19 | { | ||
| 20 | // JSON grammar according to RFC 7159 (for UTF-8 encoded JSON only). | ||
| 21 | |||
| 22 | // clang-format off | ||
| 23 | struct ws : one< ' ', '\t', '\n', '\r' > {}; | ||
| 24 | |||
| 25 | template< typename R, typename P = ws > | ||
| 26 | struct padr : internal::seq< R, internal::star< P > > {}; | ||
| 27 | |||
| 28 | struct begin_array : padr< one< '[' > > {}; | ||
| 29 | struct begin_object : padr< one< '{' > > {}; | ||
| 30 | struct end_array : one< ']' > {}; | ||
| 31 | struct end_object : one< '}' > {}; | ||
| 32 | struct name_separator : pad< one< ':' >, ws > {}; | ||
| 33 | struct value_separator : padr< one< ',' > > {}; | ||
| 34 | |||
| 35 | struct false_ : TAOCPP_PEGTL_STRING( "false" ) {}; | ||
| 36 | struct null : TAOCPP_PEGTL_STRING( "null" ) {}; | ||
| 37 | struct true_ : TAOCPP_PEGTL_STRING( "true" ) {}; | ||
| 38 | |||
| 39 | struct digits : plus< abnf::DIGIT > {}; | ||
| 40 | struct exp : seq< one< 'e', 'E' >, opt< one< '-', '+'> >, must< digits > > {}; | ||
| 41 | struct frac : if_must< one< '.' >, digits > {}; | ||
| 42 | struct int_ : sor< one< '0' >, digits > {}; | ||
| 43 | struct number : seq< opt< one< '-' > >, int_, opt< frac >, opt< exp > > {}; | ||
| 44 | |||
| 45 | struct xdigit : abnf::HEXDIG {}; | ||
| 46 | struct unicode : list< seq< one< 'u' >, rep< 4, must< xdigit > > >, one< '\\' > > {}; | ||
| 47 | struct escaped_char : one< '"', '\\', '/', 'b', 'f', 'n', 'r', 't' > {}; | ||
| 48 | struct escaped : sor< escaped_char, unicode > {}; | ||
| 49 | struct unescaped : utf8::range< 0x20, 0x10FFFF > {}; | ||
| 50 | struct char_ : if_then_else< one< '\\' >, must< escaped >, unescaped > {}; | ||
| 51 | |||
| 52 | struct string_content : until< at< one< '"' > >, must< char_ > > {}; | ||
| 53 | struct string : seq< one< '"' >, must< string_content >, any > | ||
| 54 | { | ||
| 55 | using content = string_content; | ||
| 56 | }; | ||
| 57 | |||
| 58 | struct key_content : until< at< one< '"' > >, must< char_ > > {}; | ||
| 59 | struct key : seq< one< '"' >, must< key_content >, any > | ||
| 60 | { | ||
| 61 | using content = key_content; | ||
| 62 | }; | ||
| 63 | |||
| 64 | struct value; | ||
| 65 | |||
| 66 | struct array_element; | ||
| 67 | struct array_content : opt< list_must< array_element, value_separator > > {}; | ||
| 68 | struct array : seq< begin_array, array_content, must< end_array > > | ||
| 69 | { | ||
| 70 | using begin = begin_array; | ||
| 71 | using end = end_array; | ||
| 72 | using element = array_element; | ||
| 73 | using content = array_content; | ||
| 74 | }; | ||
| 75 | |||
| 76 | struct member : if_must< key, name_separator, value > {}; | ||
| 77 | struct object_content : opt< list_must< member, value_separator > > {}; | ||
| 78 | struct object : seq< begin_object, object_content, must< end_object > > | ||
| 79 | { | ||
| 80 | using begin = begin_object; | ||
| 81 | using end = end_object; | ||
| 82 | using element = member; | ||
| 83 | using content = object_content; | ||
| 84 | }; | ||
| 85 | |||
| 86 | struct value : padr< sor< string, number, object, array, false_, true_, null > > {}; | ||
| 87 | struct array_element : seq< value > {}; | ||
| 88 | |||
| 89 | struct text : seq< star< ws >, value > {}; | ||
| 90 | // clang-format on | ||
| 91 | |||
| 92 | } // namespace json | ||
| 93 | |||
| 94 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 95 | |||
| 96 | } // namespace tao | ||
| 97 | |||
| 98 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/raw_string.hpp b/MoonParser/pegtl/contrib/raw_string.hpp new file mode 100644 index 0000000..592ce5b --- /dev/null +++ b/MoonParser/pegtl/contrib/raw_string.hpp | |||
| @@ -0,0 +1,252 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_RAW_STRING_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_RAW_STRING_HPP | ||
| 6 | |||
| 7 | #include "../apply_mode.hpp" | ||
| 8 | #include "../config.hpp" | ||
| 9 | #include "../nothing.hpp" | ||
| 10 | #include "../rewind_mode.hpp" | ||
| 11 | |||
| 12 | #include "../internal/iterator.hpp" | ||
| 13 | #include "../internal/must.hpp" | ||
| 14 | #include "../internal/skip_control.hpp" | ||
| 15 | #include "../internal/state.hpp" | ||
| 16 | #include "../internal/until.hpp" | ||
| 17 | |||
| 18 | #include "../analysis/generic.hpp" | ||
| 19 | |||
| 20 | namespace tao | ||
| 21 | { | ||
| 22 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 23 | { | ||
| 24 | namespace internal | ||
| 25 | { | ||
| 26 | template< char Open, char Marker, char Close, typename... Contents > | ||
| 27 | struct raw_string_tag | ||
| 28 | { | ||
| 29 | }; | ||
| 30 | |||
| 31 | template< bool use_action, bool use_apply0, typename Tag > | ||
| 32 | struct raw_string_state_apply; | ||
| 33 | |||
| 34 | template< typename Tag > | ||
| 35 | struct raw_string_state_apply< false, false, Tag > | ||
| 36 | { | ||
| 37 | template< template< typename... > class, | ||
| 38 | template< typename... > class, | ||
| 39 | typename State, | ||
| 40 | typename Input, | ||
| 41 | typename... States > | ||
| 42 | static void success( const State&, const Input&, States&&... ) | ||
| 43 | { | ||
| 44 | } | ||
| 45 | }; | ||
| 46 | |||
| 47 | template< typename Tag > | ||
| 48 | struct raw_string_state_apply< true, false, Tag > | ||
| 49 | { | ||
| 50 | template< template< typename... > class Action, | ||
| 51 | template< typename... > class Control, | ||
| 52 | typename State, | ||
| 53 | typename Input, | ||
| 54 | typename... States > | ||
| 55 | static void success( const State& s, const Input& in, States&&... st ) | ||
| 56 | { | ||
| 57 | Control< Tag >::template apply< Action >( s.iter, in, st... ); | ||
| 58 | } | ||
| 59 | }; | ||
| 60 | |||
| 61 | template< typename Tag > | ||
| 62 | struct raw_string_state_apply< true, true, Tag > | ||
| 63 | { | ||
| 64 | template< template< typename... > class Action, | ||
| 65 | template< typename... > class Control, | ||
| 66 | typename State, | ||
| 67 | typename Input, | ||
| 68 | typename... States > | ||
| 69 | static void success( const State&, const Input& in, States&&... st ) | ||
| 70 | { | ||
| 71 | Control< Tag >::template apply0< Action >( in, st... ); | ||
| 72 | } | ||
| 73 | }; | ||
| 74 | |||
| 75 | template< typename Tag, typename Iterator > | ||
| 76 | struct raw_string_state | ||
| 77 | { | ||
| 78 | template< typename Input, typename... States > | ||
| 79 | raw_string_state( const Input&, States&&... ) | ||
| 80 | { | ||
| 81 | } | ||
| 82 | |||
| 83 | template< apply_mode A, | ||
| 84 | rewind_mode, | ||
| 85 | template< typename... > class Action, | ||
| 86 | template< typename... > class Control, | ||
| 87 | typename Input, | ||
| 88 | typename... States > | ||
| 89 | void success( Input& in, States&&... st ) const | ||
| 90 | { | ||
| 91 | constexpr bool use_action = ( A == apply_mode::ACTION ) && ( !is_nothing< Action, Tag >::value ); | ||
| 92 | constexpr bool use_apply0 = use_action && has_apply0< Action< Tag >, type_list< States... > >::value; | ||
| 93 | raw_string_state_apply< use_action, use_apply0, Tag >::template success< Action, Control >( *this, in, st... ); | ||
| 94 | in.bump_in_this_line( marker_size ); | ||
| 95 | } | ||
| 96 | |||
| 97 | raw_string_state( const raw_string_state& ) = delete; | ||
| 98 | void operator=( const raw_string_state& ) = delete; | ||
| 99 | |||
| 100 | Iterator iter; | ||
| 101 | std::size_t marker_size = 0; | ||
| 102 | }; | ||
| 103 | |||
| 104 | template< char Open, char Marker > | ||
| 105 | struct raw_string_open | ||
| 106 | { | ||
| 107 | using analyze_t = analysis::generic< analysis::rule_type::ANY >; | ||
| 108 | |||
| 109 | template< apply_mode A, | ||
| 110 | rewind_mode, | ||
| 111 | template< typename... > class Action, | ||
| 112 | template< typename... > class Control, | ||
| 113 | typename Input, | ||
| 114 | typename State > | ||
| 115 | static bool match( Input& in, State& ls ) | ||
| 116 | { | ||
| 117 | if( in.empty() || ( in.peek_char( 0 ) != Open ) ) { | ||
| 118 | return false; | ||
| 119 | } | ||
| 120 | for( std::size_t i = 1; i < in.size( i + 1 ); ++i ) { | ||
| 121 | switch( const auto c = in.peek_char( i ) ) { | ||
| 122 | case Open: | ||
| 123 | ls.marker_size = i + 1; | ||
| 124 | in.bump( ls.marker_size ); | ||
| 125 | eol::match( in ); | ||
| 126 | ls.iter = in.iterator(); | ||
| 127 | return true; | ||
| 128 | case Marker: | ||
| 129 | break; | ||
| 130 | default: | ||
| 131 | return false; | ||
| 132 | } | ||
| 133 | } | ||
| 134 | return false; | ||
| 135 | } | ||
| 136 | }; | ||
| 137 | |||
| 138 | template< char Open, char Marker > | ||
| 139 | struct skip_control< raw_string_open< Open, Marker > > : std::true_type | ||
| 140 | { | ||
| 141 | }; | ||
| 142 | |||
| 143 | template< char Marker, char Close > | ||
| 144 | struct at_raw_string_close | ||
| 145 | { | ||
| 146 | using analyze_t = analysis::generic< analysis::rule_type::ANY >; | ||
| 147 | |||
| 148 | template< apply_mode A, | ||
| 149 | rewind_mode, | ||
| 150 | template< typename... > class Action, | ||
| 151 | template< typename... > class Control, | ||
| 152 | typename Input, | ||
| 153 | typename State > | ||
| 154 | static bool match( Input& in, const State& ls ) | ||
| 155 | { | ||
| 156 | if( in.size( ls.marker_size ) < ls.marker_size ) { | ||
| 157 | return false; | ||
| 158 | } | ||
| 159 | if( in.peek_char( 0 ) != Close ) { | ||
| 160 | return false; | ||
| 161 | } | ||
| 162 | if( in.peek_char( ls.marker_size - 1 ) != Close ) { | ||
| 163 | return false; | ||
| 164 | } | ||
| 165 | for( std::size_t i = 0; i < ls.marker_size - 2; ++i ) { | ||
| 166 | if( in.peek_char( i + 1 ) != Marker ) { | ||
| 167 | return false; | ||
| 168 | } | ||
| 169 | } | ||
| 170 | return true; | ||
| 171 | } | ||
| 172 | }; | ||
| 173 | |||
| 174 | template< char Marker, char Close > | ||
| 175 | struct skip_control< at_raw_string_close< Marker, Close > > : std::true_type | ||
| 176 | { | ||
| 177 | }; | ||
| 178 | |||
| 179 | template< class Tag, typename... Rules > | ||
| 180 | struct raw_string_switch_state | ||
| 181 | { | ||
| 182 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rules... >; | ||
| 183 | |||
| 184 | template< apply_mode A, | ||
| 185 | rewind_mode M, | ||
| 186 | template< typename... > class Action, | ||
| 187 | template< typename... > class Control, | ||
| 188 | typename Input, | ||
| 189 | typename... States > | ||
| 190 | static bool match( Input& in, States&&... st ) | ||
| 191 | { | ||
| 192 | using Iterator = typename Input::iterator_t; | ||
| 193 | raw_string_state< Tag, Iterator > s( const_cast< const Input& >( in ), st... ); | ||
| 194 | |||
| 195 | if( duseltronik< seq< Rules... >, A, M, Action, Control >::match( in, s ) ) { | ||
| 196 | s.template success< A, M, Action, Control >( in, st... ); | ||
| 197 | return true; | ||
| 198 | } | ||
| 199 | return false; | ||
| 200 | } | ||
| 201 | }; | ||
| 202 | |||
| 203 | template< typename Tag, typename... Rules > | ||
| 204 | struct skip_control< raw_string_switch_state< Tag, Rules... > > : std::true_type | ||
| 205 | { | ||
| 206 | }; | ||
| 207 | |||
| 208 | } // namespace internal | ||
| 209 | |||
| 210 | // raw_string matches Lua-style long literals. | ||
| 211 | // | ||
| 212 | // The following description was taken from the Lua documentation | ||
| 213 | // (see http://www.lua.org/docs.html): | ||
| 214 | // | ||
| 215 | // - An "opening long bracket of level n" is defined as an opening square | ||
| 216 | // bracket followed by n equal signs followed by another opening square | ||
| 217 | // bracket. So, an opening long bracket of level 0 is written as `[[`, | ||
| 218 | // an opening long bracket of level 1 is written as `[=[`, and so on. | ||
| 219 | // - A "closing long bracket" is defined similarly; for instance, a closing | ||
| 220 | // long bracket of level 4 is written as `]====]`. | ||
| 221 | // - A "long literal" starts with an opening long bracket of any level and | ||
| 222 | // ends at the first closing long bracket of the same level. It can | ||
| 223 | // contain any text except a closing bracket of the same level. | ||
| 224 | // - Literals in this bracketed form can run for several lines, do not | ||
| 225 | // interpret any escape sequences, and ignore long brackets of any other | ||
| 226 | // level. | ||
| 227 | // - For convenience, when the opening long bracket is immediately followed | ||
| 228 | // by a newline, the newline is not included in the string. | ||
| 229 | // | ||
| 230 | // Note that unlike Lua's long literal, a raw_string is customizable to use | ||
| 231 | // other characters than `[`, `=` and `]` for matching. Also note that Lua | ||
| 232 | // introduced newline-specific replacements in Lua 5.2, which we do not | ||
| 233 | // support on the grammar level. | ||
| 234 | |||
| 235 | template< char Open, char Marker, char Close, typename... Contents > | ||
| 236 | struct raw_string | ||
| 237 | : internal::raw_string_switch_state< internal::raw_string_tag< Open, Marker, Close >, | ||
| 238 | internal::raw_string_open< Open, Marker >, | ||
| 239 | internal::must< internal::until< internal::at_raw_string_close< Marker, Close >, Contents... > > > | ||
| 240 | { | ||
| 241 | // This is used to bind an action to the content. | ||
| 242 | using content = internal::raw_string_tag< Open, Marker, Close, Contents... >; | ||
| 243 | |||
| 244 | // This is used for error-reporting when a raw string is not closed properly. | ||
| 245 | using close = internal::until< internal::at_raw_string_close< Marker, Close > >; | ||
| 246 | }; | ||
| 247 | |||
| 248 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 249 | |||
| 250 | } // namespace tao | ||
| 251 | |||
| 252 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/rep_one_min_max.hpp b/MoonParser/pegtl/contrib/rep_one_min_max.hpp new file mode 100644 index 0000000..28fdbcd --- /dev/null +++ b/MoonParser/pegtl/contrib/rep_one_min_max.hpp | |||
| @@ -0,0 +1,72 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_REP_ONE_MIN_MAX_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_REP_ONE_MIN_MAX_HPP | ||
| 6 | |||
| 7 | #include <algorithm> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | #include "../analysis/counted.hpp" | ||
| 12 | |||
| 13 | #include "../internal/bump_help.hpp" | ||
| 14 | #include "../internal/skip_control.hpp" | ||
| 15 | |||
| 16 | namespace tao | ||
| 17 | { | ||
| 18 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 19 | { | ||
| 20 | namespace internal | ||
| 21 | { | ||
| 22 | template< unsigned Min, unsigned Max, char C > | ||
| 23 | struct rep_one_min_max | ||
| 24 | { | ||
| 25 | using analyze_t = analysis::counted< analysis::rule_type::ANY, Min >; | ||
| 26 | |||
| 27 | static_assert( Min <= Max, "invalid rep_one_min_max rule (maximum number of repetitions smaller than minimum)" ); | ||
| 28 | |||
| 29 | template< typename Input > | ||
| 30 | static bool match( Input& in ) | ||
| 31 | { | ||
| 32 | const auto size = in.size( Max + 1 ); | ||
| 33 | if( size < Min ) { | ||
| 34 | return false; | ||
| 35 | } | ||
| 36 | std::size_t i = 0; | ||
| 37 | while( ( i < size ) && ( in.peek_char( i ) == C ) ) { | ||
| 38 | ++i; | ||
| 39 | } | ||
| 40 | if( ( Min <= i ) && ( i <= Max ) ) { | ||
| 41 | bump_help< result_on_found::SUCCESS, Input, char, C >( in, i ); | ||
| 42 | return true; | ||
| 43 | } | ||
| 44 | return false; | ||
| 45 | } | ||
| 46 | }; | ||
| 47 | |||
| 48 | template< unsigned Min, unsigned Max, char C > | ||
| 49 | struct skip_control< rep_one_min_max< Min, Max, C > > : std::true_type | ||
| 50 | { | ||
| 51 | }; | ||
| 52 | |||
| 53 | } // namespace internal | ||
| 54 | |||
| 55 | inline namespace ascii | ||
| 56 | { | ||
| 57 | template< unsigned Min, unsigned Max, char C > | ||
| 58 | struct rep_one_min_max : internal::rep_one_min_max< Min, Max, C > | ||
| 59 | { | ||
| 60 | }; | ||
| 61 | |||
| 62 | struct ellipsis : internal::rep_one_min_max< 3, 3, '.' > | ||
| 63 | { | ||
| 64 | }; | ||
| 65 | |||
| 66 | } // namespace ascii | ||
| 67 | |||
| 68 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 69 | |||
| 70 | } // namespace tao | ||
| 71 | |||
| 72 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/to_string.hpp b/MoonParser/pegtl/contrib/to_string.hpp new file mode 100644 index 0000000..4c19931 --- /dev/null +++ b/MoonParser/pegtl/contrib/to_string.hpp | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_TO_STRING_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_TO_STRING_HPP | ||
| 6 | |||
| 7 | #include <string> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | template< typename > | ||
| 18 | struct to_string; | ||
| 19 | |||
| 20 | template< template< char... > class X, char... Cs > | ||
| 21 | struct to_string< X< Cs... > > | ||
| 22 | { | ||
| 23 | static std::string get() | ||
| 24 | { | ||
| 25 | const char s[] = { Cs..., 0 }; | ||
| 26 | return std::string( s, sizeof...( Cs ) ); | ||
| 27 | } | ||
| 28 | }; | ||
| 29 | |||
| 30 | } // namespace internal | ||
| 31 | |||
| 32 | template< typename T > | ||
| 33 | std::string to_string() | ||
| 34 | { | ||
| 35 | return internal::to_string< T >::get(); | ||
| 36 | } | ||
| 37 | |||
| 38 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 39 | |||
| 40 | } // namespace tao | ||
| 41 | |||
| 42 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/tracer.hpp b/MoonParser/pegtl/contrib/tracer.hpp new file mode 100644 index 0000000..5649078 --- /dev/null +++ b/MoonParser/pegtl/contrib/tracer.hpp | |||
| @@ -0,0 +1,111 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_TRACER_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_TRACER_HPP | ||
| 6 | |||
| 7 | #include <cassert> | ||
| 8 | #include <iomanip> | ||
| 9 | #include <iostream> | ||
| 10 | #include <utility> | ||
| 11 | #include <vector> | ||
| 12 | |||
| 13 | #include "../config.hpp" | ||
| 14 | #include "../normal.hpp" | ||
| 15 | |||
| 16 | #include "../internal/demangle.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | struct trace_state | ||
| 23 | { | ||
| 24 | unsigned rule = 0; | ||
| 25 | unsigned line = 0; | ||
| 26 | std::vector< unsigned > stack; | ||
| 27 | }; | ||
| 28 | |||
| 29 | template< typename Rule > | ||
| 30 | struct tracer | ||
| 31 | : normal< Rule > | ||
| 32 | { | ||
| 33 | template< typename Input, typename... States > | ||
| 34 | static void start( const Input& in, States&&... ) | ||
| 35 | { | ||
| 36 | std::cerr << in.position() << " start " << internal::demangle< Rule >() << std::endl; | ||
| 37 | } | ||
| 38 | |||
| 39 | template< typename Input > | ||
| 40 | static void start( const Input& in, trace_state& ts ) | ||
| 41 | { | ||
| 42 | std::cerr << std::setw( 6 ) << ++ts.line << " " << std::setw( 6 ) << ++ts.rule << " " << in.position() << " start " << internal::demangle< Rule >() << std::endl; | ||
| 43 | ts.stack.push_back( ts.rule ); | ||
| 44 | } | ||
| 45 | |||
| 46 | template< typename Input, typename... States > | ||
| 47 | static void success( const Input& in, States&&... ) | ||
| 48 | { | ||
| 49 | std::cerr << in.position() << " success " << internal::demangle< Rule >() << std::endl; | ||
| 50 | } | ||
| 51 | |||
| 52 | template< typename Input > | ||
| 53 | static void success( const Input& in, trace_state& ts ) | ||
| 54 | { | ||
| 55 | assert( !ts.stack.empty() ); | ||
| 56 | std::cerr << std::setw( 6 ) << ++ts.line << " " << std::setw( 6 ) << ts.stack.back() << " " << in.position() << " success " << internal::demangle< Rule >() << std::endl; | ||
| 57 | ts.stack.pop_back(); | ||
| 58 | } | ||
| 59 | |||
| 60 | template< typename Input, typename... States > | ||
| 61 | static void failure( const Input& in, States&&... ) | ||
| 62 | { | ||
| 63 | std::cerr << in.position() << " failure " << internal::demangle< Rule >() << std::endl; | ||
| 64 | } | ||
| 65 | |||
| 66 | template< typename Input > | ||
| 67 | static void failure( const Input& in, trace_state& ts ) | ||
| 68 | { | ||
| 69 | assert( !ts.stack.empty() ); | ||
| 70 | std::cerr << std::setw( 6 ) << ++ts.line << " " << std::setw( 6 ) << ts.stack.back() << " " << in.position() << " failure " << internal::demangle< Rule >() << std::endl; | ||
| 71 | ts.stack.pop_back(); | ||
| 72 | } | ||
| 73 | |||
| 74 | template< template< typename... > class Action, typename Input, typename... States > | ||
| 75 | static void apply0( const Input&, States&&... st ) | ||
| 76 | { | ||
| 77 | std::cerr << "apply0 " << internal::demangle< Action< Rule > >() << std::endl; | ||
| 78 | Action< Rule >::apply0( st... ); | ||
| 79 | } | ||
| 80 | |||
| 81 | template< template< typename... > class Action, typename Input > | ||
| 82 | static void apply0( const Input&, trace_state& ts ) | ||
| 83 | { | ||
| 84 | std::cerr << std::setw( 6 ) << ++ts.line << " " << internal::demangle< Action< Rule > >() << "::apply0()" << std::endl; | ||
| 85 | Action< Rule >::apply0( ts ); | ||
| 86 | } | ||
| 87 | |||
| 88 | template< template< typename... > class Action, typename Iterator, typename Input, typename... States > | ||
| 89 | static void apply( const Iterator& begin, const Input& in, States&&... st ) | ||
| 90 | { | ||
| 91 | std::cerr << "apply " << internal::demangle< Action< Rule > >() << std::endl; | ||
| 92 | using action_t = typename Input::action_t; | ||
| 93 | const action_t action_input( begin, in ); | ||
| 94 | Action< Rule >::apply( action_input, st... ); | ||
| 95 | } | ||
| 96 | |||
| 97 | template< template< typename... > class Action, typename Iterator, typename Input > | ||
| 98 | static void apply( const Iterator& begin, const Input& in, trace_state& ts ) | ||
| 99 | { | ||
| 100 | std::cerr << std::setw( 6 ) << ++ts.line << " " << internal::demangle< Action< Rule > >() << "::apply()" << std::endl; | ||
| 101 | using action_t = typename Input::action_t; | ||
| 102 | const action_t action_input( begin, in ); | ||
| 103 | Action< Rule >::apply( action_input, ts ); | ||
| 104 | } | ||
| 105 | }; | ||
| 106 | |||
| 107 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 108 | |||
| 109 | } // namespace tao | ||
| 110 | |||
| 111 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/unescape.hpp b/MoonParser/pegtl/contrib/unescape.hpp new file mode 100644 index 0000000..2a7c53f --- /dev/null +++ b/MoonParser/pegtl/contrib/unescape.hpp | |||
| @@ -0,0 +1,203 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_UNESCAPE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_UNESCAPE_HPP | ||
| 6 | |||
| 7 | #include <cassert> | ||
| 8 | #include <string> | ||
| 9 | |||
| 10 | #include "../ascii.hpp" | ||
| 11 | #include "../config.hpp" | ||
| 12 | #include "../parse_error.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace unescape | ||
| 19 | { | ||
| 20 | struct state | ||
| 21 | { | ||
| 22 | std::string unescaped; | ||
| 23 | }; | ||
| 24 | |||
| 25 | // Utility functions for the unescape actions. | ||
| 26 | |||
| 27 | inline bool utf8_append_utf32( std::string& string, const unsigned utf32 ) | ||
| 28 | { | ||
| 29 | if( utf32 <= 0x7f ) { | ||
| 30 | string += char( utf32 & 0xff ); | ||
| 31 | return true; | ||
| 32 | } | ||
| 33 | if( utf32 <= 0x7ff ) { | ||
| 34 | char tmp[] = { char( ( ( utf32 & 0x7c0 ) >> 6 ) | 0xc0 ), | ||
| 35 | char( ( ( utf32 & 0x03f ) ) | 0x80 ) }; | ||
| 36 | string.append( tmp, sizeof( tmp ) ); | ||
| 37 | return true; | ||
| 38 | } | ||
| 39 | if( utf32 <= 0xffff ) { | ||
| 40 | char tmp[] = { char( ( ( utf32 & 0xf000 ) >> 12 ) | 0xe0 ), | ||
| 41 | char( ( ( utf32 & 0x0fc0 ) >> 6 ) | 0x80 ), | ||
| 42 | char( ( ( utf32 & 0x003f ) ) | 0x80 ) }; | ||
| 43 | string.append( tmp, sizeof( tmp ) ); | ||
| 44 | return true; | ||
| 45 | } | ||
| 46 | if( utf32 <= 0x10ffff ) { | ||
| 47 | char tmp[] = { char( ( ( utf32 & 0x1c0000 ) >> 18 ) | 0xf0 ), | ||
| 48 | char( ( ( utf32 & 0x03f000 ) >> 12 ) | 0x80 ), | ||
| 49 | char( ( ( utf32 & 0x000fc0 ) >> 6 ) | 0x80 ), | ||
| 50 | char( ( ( utf32 & 0x00003f ) ) | 0x80 ) }; | ||
| 51 | string.append( tmp, sizeof( tmp ) ); | ||
| 52 | return true; | ||
| 53 | } | ||
| 54 | return false; | ||
| 55 | } | ||
| 56 | |||
| 57 | // This function MUST only be called for characters matching tao::TAOCPP_PEGTL_NAMESPACE::ascii::xdigit! | ||
| 58 | template< typename I > | ||
| 59 | I unhex_char( const char c ) | ||
| 60 | { | ||
| 61 | switch( c ) { | ||
| 62 | case '0': | ||
| 63 | case '1': | ||
| 64 | case '2': | ||
| 65 | case '3': | ||
| 66 | case '4': | ||
| 67 | case '5': | ||
| 68 | case '6': | ||
| 69 | case '7': | ||
| 70 | case '8': | ||
| 71 | case '9': | ||
| 72 | return I( c - '0' ); | ||
| 73 | case 'a': | ||
| 74 | case 'b': | ||
| 75 | case 'c': | ||
| 76 | case 'd': | ||
| 77 | case 'e': | ||
| 78 | case 'f': | ||
| 79 | return I( c - 'a' + 10 ); | ||
| 80 | case 'A': | ||
| 81 | case 'B': | ||
| 82 | case 'C': | ||
| 83 | case 'D': | ||
| 84 | case 'E': | ||
| 85 | case 'F': | ||
| 86 | return I( c - 'A' + 10 ); | ||
| 87 | } | ||
| 88 | throw std::runtime_error( "invalid character in unhex" ); // LCOV_EXCL_LINE | ||
| 89 | } | ||
| 90 | |||
| 91 | template< typename I > | ||
| 92 | I unhex_string( const char* begin, const char* const end ) | ||
| 93 | { | ||
| 94 | I r = 0; | ||
| 95 | while( begin != end ) { | ||
| 96 | r <<= 4; | ||
| 97 | r += unhex_char< I >( *begin++ ); | ||
| 98 | } | ||
| 99 | return r; | ||
| 100 | } | ||
| 101 | |||
| 102 | // Actions for common unescape situations. | ||
| 103 | |||
| 104 | struct append_all | ||
| 105 | { | ||
| 106 | template< typename Input, typename State > | ||
| 107 | static void apply( const Input& in, State& st ) | ||
| 108 | { | ||
| 109 | st.unescaped.append( in.begin(), in.size() ); | ||
| 110 | } | ||
| 111 | }; | ||
| 112 | |||
| 113 | // This action MUST be called for a character matching T which MUST be tao::TAOCPP_PEGTL_NAMESPACE::one< ... >. | ||
| 114 | template< typename T, char... Rs > | ||
| 115 | struct unescape_c | ||
| 116 | { | ||
| 117 | template< typename Input, typename State > | ||
| 118 | static void apply( const Input& in, State& st ) | ||
| 119 | { | ||
| 120 | assert( in.size() == 1 ); | ||
| 121 | st.unescaped += apply_one( *in.begin(), static_cast< const T* >( nullptr ) ); | ||
| 122 | } | ||
| 123 | |||
| 124 | template< char... Qs > | ||
| 125 | static char apply_one( const char c, const one< Qs... >* ) | ||
| 126 | { | ||
| 127 | static_assert( sizeof...( Qs ) == sizeof...( Rs ), "size mismatch between escaped characters and their mappings" ); | ||
| 128 | return apply_two( c, { Qs... }, { Rs... } ); | ||
| 129 | } | ||
| 130 | |||
| 131 | static char apply_two( const char c, const std::initializer_list< char >& q, const std::initializer_list< char >& r ) | ||
| 132 | { | ||
| 133 | for( std::size_t i = 0; i < q.size(); ++i ) { | ||
| 134 | if( *( q.begin() + i ) == c ) { | ||
| 135 | return *( r.begin() + i ); | ||
| 136 | } | ||
| 137 | } | ||
| 138 | throw std::runtime_error( "invalid character in unescape" ); // LCOV_EXCL_LINE | ||
| 139 | } | ||
| 140 | }; | ||
| 141 | |||
| 142 | // See src/example/pegtl/unescape.cpp for why the following two actions | ||
| 143 | // skip the first input character. They also MUST be called | ||
| 144 | // with non-empty matched inputs! | ||
| 145 | |||
| 146 | struct unescape_u | ||
| 147 | { | ||
| 148 | template< typename Input, typename State > | ||
| 149 | static void apply( const Input& in, State& st ) | ||
| 150 | { | ||
| 151 | assert( !in.empty() ); // First character MUST be present, usually 'u' or 'U'. | ||
| 152 | if( !utf8_append_utf32( st.unescaped, unhex_string< unsigned >( in.begin() + 1, in.end() ) ) ) { | ||
| 153 | throw parse_error( "invalid escaped unicode code point", in ); | ||
| 154 | } | ||
| 155 | } | ||
| 156 | }; | ||
| 157 | |||
| 158 | struct unescape_x | ||
| 159 | { | ||
| 160 | template< typename Input, typename State > | ||
| 161 | static void apply( const Input& in, State& st ) | ||
| 162 | { | ||
| 163 | assert( !in.empty() ); // First character MUST be present, usually 'x'. | ||
| 164 | st.unescaped += unhex_string< char >( in.begin() + 1, in.end() ); | ||
| 165 | } | ||
| 166 | }; | ||
| 167 | |||
| 168 | // The unescape_j action is similar to unescape_u, however unlike | ||
| 169 | // unescape_u it | ||
| 170 | // (a) assumes exactly 4 hexdigits per escape sequence, | ||
| 171 | // (b) accepts multiple consecutive escaped 16-bit values. | ||
| 172 | // When applied to more than one escape sequence, unescape_j | ||
| 173 | // translates UTF-16 surrogate pairs in the input into a single | ||
| 174 | // UTF-8 sequence in st.unescaped, as required for JSON by RFC 7159. | ||
| 175 | |||
| 176 | struct unescape_j | ||
| 177 | { | ||
| 178 | template< typename Input, typename State > | ||
| 179 | static void apply( const Input& in, State& st ) | ||
| 180 | { | ||
| 181 | assert( ( ( in.size() + 1 ) % 6 ) == 0 ); // Expects multiple "\\u1234", starting with the first "u". | ||
| 182 | for( const char* b = in.begin() + 1; b < in.end(); b += 6 ) { | ||
| 183 | const auto c = unhex_string< unsigned >( b, b + 4 ); | ||
| 184 | if( ( 0xd800 <= c ) && ( c <= 0xdbff ) && ( b + 6 < in.end() ) ) { | ||
| 185 | const auto d = unhex_string< unsigned >( b + 6, b + 10 ); | ||
| 186 | if( ( 0xdc00 <= d ) && ( d <= 0xdfff ) ) { | ||
| 187 | b += 6; | ||
| 188 | utf8_append_utf32( st.unescaped, ( ( ( c & 0x03ff ) << 10 ) | ( d & 0x03ff ) ) + 0x10000 ); | ||
| 189 | continue; | ||
| 190 | } | ||
| 191 | } | ||
| 192 | utf8_append_utf32( st.unescaped, c ); | ||
| 193 | } | ||
| 194 | } | ||
| 195 | }; | ||
| 196 | |||
| 197 | } // namespace unescape | ||
| 198 | |||
| 199 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 200 | |||
| 201 | } // namespace tao | ||
| 202 | |||
| 203 | #endif | ||
diff --git a/MoonParser/pegtl/contrib/uri.hpp b/MoonParser/pegtl/contrib/uri.hpp new file mode 100644 index 0000000..1401a7d --- /dev/null +++ b/MoonParser/pegtl/contrib/uri.hpp | |||
| @@ -0,0 +1,116 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CONTRIB_URI_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CONTRIB_URI_HPP | ||
| 6 | |||
| 7 | #include "../ascii.hpp" | ||
| 8 | #include "../config.hpp" | ||
| 9 | #include "../rules.hpp" | ||
| 10 | #include "../utf8.hpp" | ||
| 11 | |||
| 12 | #include "abnf.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace uri | ||
| 19 | { | ||
| 20 | // URI grammar according to RFC 3986. | ||
| 21 | |||
| 22 | // This grammar is a direct PEG translation of the original URI grammar. | ||
| 23 | // It should be considered experimental -- in case of any issues, in particular | ||
| 24 | // missing rules for attached actions, please contact the developers. | ||
| 25 | |||
| 26 | // Note that this grammar has multiple top-level rules. | ||
| 27 | |||
| 28 | using namespace abnf; | ||
| 29 | |||
| 30 | using dot = one< '.' >; | ||
| 31 | using colon = one< ':' >; | ||
| 32 | |||
| 33 | // clang-format off | ||
| 34 | struct dec_octet : sor< one< '0' >, | ||
| 35 | rep_min_max< 1, 2, DIGIT >, | ||
| 36 | seq< one< '1' >, DIGIT, DIGIT >, | ||
| 37 | seq< one< '2' >, range< '0', '4' >, DIGIT >, | ||
| 38 | seq< string< '2', '5' >, range< '0', '5' > > > {}; | ||
| 39 | |||
| 40 | struct IPv4address : seq< dec_octet, dot, dec_octet, dot, dec_octet, dot, dec_octet > {}; | ||
| 41 | |||
| 42 | struct h16 : rep_min_max< 1, 4, HEXDIG > {}; | ||
| 43 | struct ls32 : sor< seq< h16, colon, h16 >, IPv4address > {}; | ||
| 44 | |||
| 45 | struct dcolon : two< ':' > {}; | ||
| 46 | |||
| 47 | struct IPv6address : sor< seq< rep< 6, h16, colon >, ls32 >, | ||
| 48 | seq< dcolon, rep< 5, h16, colon >, ls32 >, | ||
| 49 | seq< opt< h16 >, dcolon, rep< 4, h16, colon >, ls32 >, | ||
| 50 | seq< opt< h16, opt< colon, h16 > >, dcolon, rep< 3, h16, colon >, ls32 >, | ||
| 51 | seq< opt< h16, rep_opt< 2, colon, h16 > >, dcolon, rep< 2, h16, colon >, ls32 >, | ||
| 52 | seq< opt< h16, rep_opt< 3, colon, h16 > >, dcolon, h16, colon, ls32 >, | ||
| 53 | seq< opt< h16, rep_opt< 4, colon, h16 > >, dcolon, ls32 >, | ||
| 54 | seq< opt< h16, rep_opt< 5, colon, h16 > >, dcolon, h16 >, | ||
| 55 | seq< opt< h16, rep_opt< 6, colon, h16 > >, dcolon > > {}; | ||
| 56 | |||
| 57 | struct gen_delims : one< ':', '/', '?', '#', '[', ']', '@' > {}; | ||
| 58 | struct sub_delims : one< '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=' > {}; | ||
| 59 | |||
| 60 | struct unreserved : sor< ALPHA, DIGIT, one< '-', '.', '_', '~' > > {}; | ||
| 61 | struct reserved : sor< gen_delims, sub_delims > {}; | ||
| 62 | |||
| 63 | struct IPvFuture : if_must< one< 'v' >, plus< HEXDIG >, dot, plus< sor< unreserved, sub_delims, colon > > > {}; | ||
| 64 | |||
| 65 | struct IP_literal : if_must< one< '[' >, sor< IPvFuture, IPv6address >, one< ']' > > {}; | ||
| 66 | |||
| 67 | struct pct_encoded : if_must< one< '%' >, HEXDIG, HEXDIG > {}; | ||
| 68 | struct pchar : sor< unreserved, pct_encoded, sub_delims, one< ':', '@' > > {}; | ||
| 69 | |||
| 70 | struct query : star< sor< pchar, one< '/', '?' > > > {}; | ||
| 71 | struct fragment : star< sor< pchar, one< '/', '?' > > > {}; | ||
| 72 | |||
| 73 | struct segment : star< pchar > {}; | ||
| 74 | struct segment_nz : plus< pchar > {}; | ||
| 75 | struct segment_nz_nc : plus< sor< unreserved, pct_encoded, sub_delims, one< '@' > > > {}; // non-zero-length segment without any colon ":" | ||
| 76 | |||
| 77 | struct path_abempty : star< one< '/' >, segment > {}; | ||
| 78 | struct path_absolute : seq< one< '/' >, opt< segment_nz, star< one< '/' >, segment > > > {}; | ||
| 79 | struct path_noscheme : seq< segment_nz_nc, star< one< '/' >, segment > > {}; | ||
| 80 | struct path_rootless : seq< segment_nz, star< one< '/' >, segment > > {}; | ||
| 81 | struct path_empty : success {}; | ||
| 82 | |||
| 83 | struct path : sor< path_noscheme, // begins with a non-colon segment | ||
| 84 | path_rootless, // begins with a segment | ||
| 85 | path_absolute, // begins with "/" but not "//" | ||
| 86 | path_abempty > {}; // begins with "/" or is empty | ||
| 87 | |||
| 88 | struct reg_name : star< sor< unreserved, pct_encoded, sub_delims > > {}; | ||
| 89 | |||
| 90 | struct port : star< DIGIT > {}; | ||
| 91 | struct host : sor< IP_literal, IPv4address, reg_name > {}; | ||
| 92 | struct userinfo : star< sor< unreserved, pct_encoded, sub_delims, colon > > {}; | ||
| 93 | struct authority : seq< opt< userinfo, one< '@' > >, host, opt< colon, port > > {}; | ||
| 94 | |||
| 95 | struct scheme : seq< ALPHA, star< sor< ALPHA, DIGIT, one< '+', '-', '.' > > > > {}; | ||
| 96 | |||
| 97 | using dslash = two< '/' >; | ||
| 98 | using opt_query = opt< if_must< one< '?' >, query > >; | ||
| 99 | using opt_fragment = opt< if_must< one< '#' >, fragment > >; | ||
| 100 | |||
| 101 | struct hier_part : sor< if_must< dslash, authority, path_abempty >, path_rootless, path_absolute, path_empty > {}; | ||
| 102 | struct relative_part : sor< if_must< dslash, authority, path_abempty >, path_noscheme, path_absolute, path_empty > {}; | ||
| 103 | struct relative_ref : seq< relative_part, opt_query, opt_fragment > {}; | ||
| 104 | |||
| 105 | struct URI : seq< scheme, one< ':' >, hier_part, opt_query, opt_fragment > {}; | ||
| 106 | struct URI_reference : sor< URI, relative_ref > {}; | ||
| 107 | struct absolute_URI : seq< scheme, one< ':' >, hier_part, opt_query > {}; | ||
| 108 | // clang-format on | ||
| 109 | |||
| 110 | } // namespace uri | ||
| 111 | |||
| 112 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 113 | |||
| 114 | } // namespace tao | ||
| 115 | |||
| 116 | #endif | ||
diff --git a/MoonParser/pegtl/cstream_input.hpp b/MoonParser/pegtl/cstream_input.hpp new file mode 100644 index 0000000..ad520e3 --- /dev/null +++ b/MoonParser/pegtl/cstream_input.hpp | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_CSTREAM_INPUT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_CSTREAM_INPUT_HPP | ||
| 6 | |||
| 7 | #include <cstdio> | ||
| 8 | |||
| 9 | #include "buffer_input.hpp" | ||
| 10 | #include "config.hpp" | ||
| 11 | #include "eol.hpp" | ||
| 12 | |||
| 13 | #include "internal/cstream_reader.hpp" | ||
| 14 | |||
| 15 | namespace tao | ||
| 16 | { | ||
| 17 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 18 | { | ||
| 19 | template< typename Eol = eol::lf_crlf > | ||
| 20 | struct cstream_input | ||
| 21 | : buffer_input< internal::cstream_reader, Eol > | ||
| 22 | { | ||
| 23 | template< typename T > | ||
| 24 | cstream_input( std::FILE* in_stream, const std::size_t in_maximum, T&& in_source ) | ||
| 25 | : buffer_input< internal::cstream_reader, Eol >( std::forward< T >( in_source ), in_maximum, in_stream ) | ||
| 26 | { | ||
| 27 | } | ||
| 28 | }; | ||
| 29 | |||
| 30 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 31 | |||
| 32 | } // namespace tao | ||
| 33 | |||
| 34 | #endif | ||
diff --git a/MoonParser/pegtl/eol.hpp b/MoonParser/pegtl/eol.hpp new file mode 100644 index 0000000..ca3e604 --- /dev/null +++ b/MoonParser/pegtl/eol.hpp | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_EOL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_EOL_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | #include <utility> | ||
| 9 | |||
| 10 | #include "config.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | using eol_pair = std::pair< bool, std::size_t >; | ||
| 17 | |||
| 18 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 19 | |||
| 20 | } // namespace tao | ||
| 21 | |||
| 22 | #include "internal/cr_crlf_eol.hpp" | ||
| 23 | #include "internal/cr_eol.hpp" | ||
| 24 | #include "internal/crlf_eol.hpp" | ||
| 25 | #include "internal/lf_crlf_eol.hpp" | ||
| 26 | #include "internal/lf_eol.hpp" | ||
| 27 | |||
| 28 | #include "internal/eol.hpp" | ||
| 29 | |||
| 30 | namespace tao | ||
| 31 | { | ||
| 32 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 33 | { | ||
| 34 | inline namespace ascii | ||
| 35 | { | ||
| 36 | // this is both a rule and a pseudo-namespace for eol::cr, ... | ||
| 37 | struct eol : internal::eol | ||
| 38 | { | ||
| 39 | // clang-format off | ||
| 40 | struct cr : internal::cr_eol {}; | ||
| 41 | struct cr_crlf : internal::cr_crlf_eol {}; | ||
| 42 | struct crlf : internal::crlf_eol {}; | ||
| 43 | struct lf : internal::lf_eol {}; | ||
| 44 | struct lf_crlf : internal::lf_crlf_eol {}; | ||
| 45 | // clang-format on | ||
| 46 | }; | ||
| 47 | |||
| 48 | } // namespace ascii | ||
| 49 | |||
| 50 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 51 | |||
| 52 | } // namespace tao | ||
| 53 | |||
| 54 | #endif | ||
diff --git a/MoonParser/pegtl/file_input.hpp b/MoonParser/pegtl/file_input.hpp new file mode 100644 index 0000000..625d491 --- /dev/null +++ b/MoonParser/pegtl/file_input.hpp | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | // Copyright (c) 2015-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_FILE_INPUT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_FILE_INPUT_HPP | ||
| 6 | |||
| 7 | #include "config.hpp" | ||
| 8 | #include "eol.hpp" | ||
| 9 | #include "tracking_mode.hpp" | ||
| 10 | |||
| 11 | #if defined( __unix__ ) || ( defined( __APPLE__ ) && defined( __MACH__ ) ) | ||
| 12 | #include <unistd.h> // Required for _POSIX_MAPPED_FILES | ||
| 13 | #endif | ||
| 14 | |||
| 15 | #if defined( _POSIX_MAPPED_FILES ) | ||
| 16 | #include "mmap_input.hpp" | ||
| 17 | #else | ||
| 18 | #include "read_input.hpp" | ||
| 19 | #endif | ||
| 20 | |||
| 21 | namespace tao | ||
| 22 | { | ||
| 23 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | { | ||
| 25 | #if defined( _POSIX_MAPPED_FILES ) | ||
| 26 | template< tracking_mode P = tracking_mode::IMMEDIATE, typename Eol = eol::lf_crlf > | ||
| 27 | using file_input = mmap_input< P, Eol >; | ||
| 28 | #else | ||
| 29 | template< tracking_mode P = tracking_mode::IMMEDIATE, typename Eol = eol::lf_crlf > | ||
| 30 | using file_input = read_input< P, Eol >; | ||
| 31 | #endif | ||
| 32 | |||
| 33 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 34 | |||
| 35 | } // namespace tao | ||
| 36 | |||
| 37 | #endif | ||
diff --git a/MoonParser/pegtl/input_error.hpp b/MoonParser/pegtl/input_error.hpp new file mode 100644 index 0000000..605ce4d --- /dev/null +++ b/MoonParser/pegtl/input_error.hpp | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INPUT_ERROR_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INPUT_ERROR_HPP | ||
| 6 | |||
| 7 | #include <cerrno> | ||
| 8 | #include <sstream> | ||
| 9 | #include <stdexcept> | ||
| 10 | |||
| 11 | #include "config.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | struct input_error | ||
| 18 | : std::runtime_error | ||
| 19 | { | ||
| 20 | input_error( const std::string& message, const int in_errorno ) | ||
| 21 | : std::runtime_error( message ), | ||
| 22 | errorno( in_errorno ) | ||
| 23 | { | ||
| 24 | } | ||
| 25 | |||
| 26 | int errorno; | ||
| 27 | }; | ||
| 28 | |||
| 29 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 30 | |||
| 31 | } // namespace tao | ||
| 32 | |||
| 33 | #define TAOCPP_PEGTL_THROW_INPUT_ERROR( MESSAGE ) \ | ||
| 34 | do { \ | ||
| 35 | const int errorno = errno; \ | ||
| 36 | std::ostringstream oss; \ | ||
| 37 | oss << "pegtl: " << MESSAGE << " errno " << errorno; \ | ||
| 38 | throw tao::TAOCPP_PEGTL_NAMESPACE::input_error( oss.str(), errorno ); \ | ||
| 39 | } while( false ) | ||
| 40 | |||
| 41 | #endif | ||
diff --git a/MoonParser/pegtl/internal/action.hpp b/MoonParser/pegtl/internal/action.hpp new file mode 100644 index 0000000..933bffe --- /dev/null +++ b/MoonParser/pegtl/internal/action.hpp | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_ACTION_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_ACTION_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "duseltronik.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | #include "skip_control.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< template< typename... > class Action, typename... Rules > | ||
| 25 | struct action | ||
| 26 | { | ||
| 27 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rules... >; | ||
| 28 | |||
| 29 | template< apply_mode A, | ||
| 30 | rewind_mode M, | ||
| 31 | template< typename... > class, | ||
| 32 | template< typename... > class Control, | ||
| 33 | typename Input, | ||
| 34 | typename... States > | ||
| 35 | static bool match( Input& in, States&&... st ) | ||
| 36 | { | ||
| 37 | return duseltronik< seq< Rules... >, A, M, Action, Control >::match( in, st... ); | ||
| 38 | } | ||
| 39 | }; | ||
| 40 | |||
| 41 | template< template< typename... > class Action, typename... Rules > | ||
| 42 | struct skip_control< action< Action, Rules... > > : std::true_type | ||
| 43 | { | ||
| 44 | }; | ||
| 45 | |||
| 46 | } // namespace internal | ||
| 47 | |||
| 48 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 49 | |||
| 50 | } // namespace tao | ||
| 51 | |||
| 52 | #endif | ||
diff --git a/MoonParser/pegtl/internal/action_input.hpp b/MoonParser/pegtl/internal/action_input.hpp new file mode 100644 index 0000000..db48950 --- /dev/null +++ b/MoonParser/pegtl/internal/action_input.hpp | |||
| @@ -0,0 +1,108 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_ACTION_INPUT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_ACTION_INPUT_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | #include <string> | ||
| 9 | |||
| 10 | #include "iterator.hpp" | ||
| 11 | |||
| 12 | #include "../config.hpp" | ||
| 13 | #include "../position.hpp" | ||
| 14 | |||
| 15 | namespace tao | ||
| 16 | { | ||
| 17 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 18 | { | ||
| 19 | namespace internal | ||
| 20 | { | ||
| 21 | inline const char* begin_c_ptr( const char* p ) noexcept | ||
| 22 | { | ||
| 23 | return p; | ||
| 24 | } | ||
| 25 | |||
| 26 | inline const char* begin_c_ptr( const iterator& it ) noexcept | ||
| 27 | { | ||
| 28 | return it.data; | ||
| 29 | } | ||
| 30 | |||
| 31 | template< typename Input > | ||
| 32 | class action_input | ||
| 33 | { | ||
| 34 | public: | ||
| 35 | using input_t = Input; | ||
| 36 | using iterator_t = typename Input::iterator_t; | ||
| 37 | |||
| 38 | action_input( const iterator_t& in_begin, const Input& in_input ) noexcept | ||
| 39 | : m_begin( in_begin ), | ||
| 40 | m_input( in_input ) | ||
| 41 | { | ||
| 42 | } | ||
| 43 | |||
| 44 | action_input( const action_input& ) = delete; | ||
| 45 | action_input& operator=( const action_input& ) = delete; | ||
| 46 | |||
| 47 | const iterator_t& iterator() const noexcept | ||
| 48 | { | ||
| 49 | return m_begin; | ||
| 50 | } | ||
| 51 | |||
| 52 | const Input& input() const noexcept | ||
| 53 | { | ||
| 54 | return m_input; | ||
| 55 | } | ||
| 56 | |||
| 57 | const char* begin() const noexcept | ||
| 58 | { | ||
| 59 | return begin_c_ptr( iterator() ); | ||
| 60 | } | ||
| 61 | |||
| 62 | const char* end() const noexcept | ||
| 63 | { | ||
| 64 | return input().current(); | ||
| 65 | } | ||
| 66 | |||
| 67 | bool empty() const noexcept | ||
| 68 | { | ||
| 69 | return begin() == end(); | ||
| 70 | } | ||
| 71 | |||
| 72 | std::size_t size() const noexcept | ||
| 73 | { | ||
| 74 | return std::size_t( end() - begin() ); | ||
| 75 | } | ||
| 76 | |||
| 77 | std::string string() const | ||
| 78 | { | ||
| 79 | return std::string( begin(), end() ); | ||
| 80 | } | ||
| 81 | |||
| 82 | char peek_char( const std::size_t offset = 0 ) const noexcept | ||
| 83 | { | ||
| 84 | return begin()[ offset ]; | ||
| 85 | } | ||
| 86 | |||
| 87 | unsigned char peek_byte( const std::size_t offset = 0 ) const noexcept | ||
| 88 | { | ||
| 89 | return static_cast< unsigned char >( peek_char( offset ) ); | ||
| 90 | } | ||
| 91 | |||
| 92 | TAOCPP_PEGTL_NAMESPACE::position position() const noexcept | ||
| 93 | { | ||
| 94 | return input().position( iterator() ); // NOTE: Not efficient with LAZY inputs. | ||
| 95 | } | ||
| 96 | |||
| 97 | protected: | ||
| 98 | const iterator_t m_begin; | ||
| 99 | const Input& m_input; | ||
| 100 | }; | ||
| 101 | |||
| 102 | } // namespace internal | ||
| 103 | |||
| 104 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 105 | |||
| 106 | } // namespace tao | ||
| 107 | |||
| 108 | #endif | ||
diff --git a/MoonParser/pegtl/internal/alnum.hpp b/MoonParser/pegtl/internal/alnum.hpp new file mode 100644 index 0000000..cdad330 --- /dev/null +++ b/MoonParser/pegtl/internal/alnum.hpp | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_ALNUM_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_ALNUM_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "peek_char.hpp" | ||
| 10 | #include "ranges.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | namespace internal | ||
| 17 | { | ||
| 18 | using alnum = ranges< peek_char, 'a', 'z', 'A', 'Z', '0', '9' >; | ||
| 19 | |||
| 20 | } // namespace internal | ||
| 21 | |||
| 22 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 23 | |||
| 24 | } // namespace tao | ||
| 25 | |||
| 26 | #endif | ||
diff --git a/MoonParser/pegtl/internal/alpha.hpp b/MoonParser/pegtl/internal/alpha.hpp new file mode 100644 index 0000000..d696ca2 --- /dev/null +++ b/MoonParser/pegtl/internal/alpha.hpp | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_ALPHA_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_ALPHA_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "peek_char.hpp" | ||
| 10 | #include "ranges.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | namespace internal | ||
| 17 | { | ||
| 18 | using alpha = ranges< peek_char, 'a', 'z', 'A', 'Z' >; | ||
| 19 | |||
| 20 | } // namespace internal | ||
| 21 | |||
| 22 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 23 | |||
| 24 | } // namespace tao | ||
| 25 | |||
| 26 | #endif | ||
diff --git a/MoonParser/pegtl/internal/any.hpp b/MoonParser/pegtl/internal/any.hpp new file mode 100644 index 0000000..aebe239 --- /dev/null +++ b/MoonParser/pegtl/internal/any.hpp | |||
| @@ -0,0 +1,68 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_ANY_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_ANY_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "peek_char.hpp" | ||
| 10 | #include "skip_control.hpp" | ||
| 11 | |||
| 12 | #include "../analysis/generic.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace internal | ||
| 19 | { | ||
| 20 | template< typename Peek > | ||
| 21 | struct any; | ||
| 22 | |||
| 23 | template<> | ||
| 24 | struct any< peek_char > | ||
| 25 | { | ||
| 26 | using analyze_t = analysis::generic< analysis::rule_type::ANY >; | ||
| 27 | |||
| 28 | template< typename Input > | ||
| 29 | static bool match( Input& in ) | ||
| 30 | { | ||
| 31 | if( !in.empty() ) { | ||
| 32 | in.bump(); | ||
| 33 | return true; | ||
| 34 | } | ||
| 35 | return false; | ||
| 36 | } | ||
| 37 | }; | ||
| 38 | |||
| 39 | template< typename Peek > | ||
| 40 | struct any | ||
| 41 | { | ||
| 42 | using analyze_t = analysis::generic< analysis::rule_type::ANY >; | ||
| 43 | |||
| 44 | template< typename Input > | ||
| 45 | static bool match( Input& in ) | ||
| 46 | { | ||
| 47 | if( !in.empty() ) { | ||
| 48 | if( const auto t = Peek::peek( in ) ) { | ||
| 49 | in.bump( t.size ); | ||
| 50 | return true; | ||
| 51 | } | ||
| 52 | } | ||
| 53 | return false; | ||
| 54 | } | ||
| 55 | }; | ||
| 56 | |||
| 57 | template< typename Peek > | ||
| 58 | struct skip_control< any< Peek > > : std::true_type | ||
| 59 | { | ||
| 60 | }; | ||
| 61 | |||
| 62 | } // namespace internal | ||
| 63 | |||
| 64 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 65 | |||
| 66 | } // namespace tao | ||
| 67 | |||
| 68 | #endif | ||
diff --git a/MoonParser/pegtl/internal/apply.hpp b/MoonParser/pegtl/internal/apply.hpp new file mode 100644 index 0000000..4e70255 --- /dev/null +++ b/MoonParser/pegtl/internal/apply.hpp | |||
| @@ -0,0 +1,79 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_APPLY_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_APPLY_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | #include "trivial.hpp" | ||
| 11 | |||
| 12 | #include "../analysis/counted.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace internal | ||
| 19 | { | ||
| 20 | template< apply_mode A, typename... Actions > | ||
| 21 | struct apply_impl; | ||
| 22 | |||
| 23 | template< typename... Actions > | ||
| 24 | struct apply_impl< apply_mode::ACTION, Actions... > | ||
| 25 | { | ||
| 26 | template< typename Input, typename... States > | ||
| 27 | static bool match( Input& in, States&&... st ) | ||
| 28 | { | ||
| 29 | using action_t = typename Input::action_t; | ||
| 30 | const action_t i2( in.iterator(), in ); // No data -- range is from begin to begin. | ||
| 31 | #ifdef __cpp_fold_expressions | ||
| 32 | ( Actions::apply( i2, st... ), ... ); | ||
| 33 | #else | ||
| 34 | using swallow = bool[]; | ||
| 35 | (void)swallow{ ( Actions::apply( i2, st... ), true )..., true }; | ||
| 36 | #endif | ||
| 37 | return true; | ||
| 38 | } | ||
| 39 | }; | ||
| 40 | |||
| 41 | template< typename... Actions > | ||
| 42 | struct apply_impl< apply_mode::NOTHING, Actions... > | ||
| 43 | { | ||
| 44 | template< typename Input, typename... States > | ||
| 45 | static bool match( Input&, States&&... ) | ||
| 46 | { | ||
| 47 | return true; | ||
| 48 | } | ||
| 49 | }; | ||
| 50 | |||
| 51 | template< typename... Actions > | ||
| 52 | struct apply | ||
| 53 | { | ||
| 54 | using analyze_t = analysis::counted< analysis::rule_type::ANY, 0 >; | ||
| 55 | |||
| 56 | template< apply_mode A, | ||
| 57 | rewind_mode M, | ||
| 58 | template< typename... > class Action, | ||
| 59 | template< typename... > class Control, | ||
| 60 | typename Input, | ||
| 61 | typename... States > | ||
| 62 | static bool match( Input& in, States&&... st ) | ||
| 63 | { | ||
| 64 | return apply_impl< A, Actions... >::match( in, st... ); | ||
| 65 | } | ||
| 66 | }; | ||
| 67 | |||
| 68 | template< typename... Actions > | ||
| 69 | struct skip_control< apply< Actions... > > : std::true_type | ||
| 70 | { | ||
| 71 | }; | ||
| 72 | |||
| 73 | } // namespace internal | ||
| 74 | |||
| 75 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 76 | |||
| 77 | } // namespace tao | ||
| 78 | |||
| 79 | #endif | ||
diff --git a/MoonParser/pegtl/internal/apply0.hpp b/MoonParser/pegtl/internal/apply0.hpp new file mode 100644 index 0000000..c8aa7aa --- /dev/null +++ b/MoonParser/pegtl/internal/apply0.hpp | |||
| @@ -0,0 +1,77 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_APPLY0_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_APPLY0_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | #include "trivial.hpp" | ||
| 11 | |||
| 12 | #include "../analysis/counted.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace internal | ||
| 19 | { | ||
| 20 | template< apply_mode A, typename... Actions > | ||
| 21 | struct apply0_impl; | ||
| 22 | |||
| 23 | template< typename... Actions > | ||
| 24 | struct apply0_impl< apply_mode::ACTION, Actions... > | ||
| 25 | { | ||
| 26 | template< typename... States > | ||
| 27 | static bool match( States&&... st ) | ||
| 28 | { | ||
| 29 | #ifdef __cpp_fold_expressions | ||
| 30 | ( Actions::apply0( st... ), ... ); | ||
| 31 | #else | ||
| 32 | using swallow = bool[]; | ||
| 33 | (void)swallow{ ( Actions::apply0( st... ), true )..., true }; | ||
| 34 | #endif | ||
| 35 | return true; | ||
| 36 | } | ||
| 37 | }; | ||
| 38 | |||
| 39 | template< typename... Actions > | ||
| 40 | struct apply0_impl< apply_mode::NOTHING, Actions... > | ||
| 41 | { | ||
| 42 | template< typename... States > | ||
| 43 | static bool match( States&&... ) | ||
| 44 | { | ||
| 45 | return true; | ||
| 46 | } | ||
| 47 | }; | ||
| 48 | |||
| 49 | template< typename... Actions > | ||
| 50 | struct apply0 | ||
| 51 | { | ||
| 52 | using analyze_t = analysis::counted< analysis::rule_type::ANY, 0 >; | ||
| 53 | |||
| 54 | template< apply_mode A, | ||
| 55 | rewind_mode M, | ||
| 56 | template< typename... > class Action, | ||
| 57 | template< typename... > class Control, | ||
| 58 | typename Input, | ||
| 59 | typename... States > | ||
| 60 | static bool match( Input&, States&&... st ) | ||
| 61 | { | ||
| 62 | return apply0_impl< A, Actions... >::match( st... ); | ||
| 63 | } | ||
| 64 | }; | ||
| 65 | |||
| 66 | template< typename... Actions > | ||
| 67 | struct skip_control< apply0< Actions... > > : std::true_type | ||
| 68 | { | ||
| 69 | }; | ||
| 70 | |||
| 71 | } // namespace internal | ||
| 72 | |||
| 73 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 74 | |||
| 75 | } // namespace tao | ||
| 76 | |||
| 77 | #endif | ||
diff --git a/MoonParser/pegtl/internal/at.hpp b/MoonParser/pegtl/internal/at.hpp new file mode 100644 index 0000000..d5bb455 --- /dev/null +++ b/MoonParser/pegtl/internal/at.hpp | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_AT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_AT_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "rule_conjunction.hpp" | ||
| 10 | #include "skip_control.hpp" | ||
| 11 | #include "trivial.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< typename... Rules > | ||
| 25 | struct at; | ||
| 26 | |||
| 27 | template<> | ||
| 28 | struct at<> | ||
| 29 | : trivial< true > | ||
| 30 | { | ||
| 31 | }; | ||
| 32 | |||
| 33 | template< typename... Rules > | ||
| 34 | struct at | ||
| 35 | { | ||
| 36 | using analyze_t = analysis::generic< analysis::rule_type::OPT, Rules... >; | ||
| 37 | |||
| 38 | template< apply_mode, | ||
| 39 | rewind_mode, | ||
| 40 | template< typename... > class Action, | ||
| 41 | template< typename... > class Control, | ||
| 42 | typename Input, | ||
| 43 | typename... States > | ||
| 44 | static bool match( Input& in, States&&... st ) | ||
| 45 | { | ||
| 46 | const auto m = in.template mark< rewind_mode::REQUIRED >(); | ||
| 47 | return rule_conjunction< Rules... >::template match< apply_mode::NOTHING, rewind_mode::ACTIVE, Action, Control >( in, st... ); | ||
| 48 | } | ||
| 49 | }; | ||
| 50 | |||
| 51 | template< typename... Rules > | ||
| 52 | struct skip_control< at< Rules... > > : std::true_type | ||
| 53 | { | ||
| 54 | }; | ||
| 55 | |||
| 56 | } // namespace internal | ||
| 57 | |||
| 58 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 59 | |||
| 60 | } // namespace tao | ||
| 61 | |||
| 62 | #endif | ||
diff --git a/MoonParser/pegtl/internal/bof.hpp b/MoonParser/pegtl/internal/bof.hpp new file mode 100644 index 0000000..8a1dde7 --- /dev/null +++ b/MoonParser/pegtl/internal/bof.hpp | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_BOF_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_BOF_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | #include "../analysis/generic.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | struct bof | ||
| 20 | { | ||
| 21 | using analyze_t = analysis::generic< analysis::rule_type::OPT >; | ||
| 22 | |||
| 23 | template< typename Input > | ||
| 24 | static bool match( Input& in ) noexcept | ||
| 25 | { | ||
| 26 | return in.byte() == 0; | ||
| 27 | } | ||
| 28 | }; | ||
| 29 | |||
| 30 | template<> | ||
| 31 | struct skip_control< bof > : std::true_type | ||
| 32 | { | ||
| 33 | }; | ||
| 34 | |||
| 35 | } // namespace internal | ||
| 36 | |||
| 37 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 38 | |||
| 39 | } // namespace tao | ||
| 40 | |||
| 41 | #endif | ||
diff --git a/MoonParser/pegtl/internal/bol.hpp b/MoonParser/pegtl/internal/bol.hpp new file mode 100644 index 0000000..bf3e33f --- /dev/null +++ b/MoonParser/pegtl/internal/bol.hpp | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_BOL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_BOL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | #include "../analysis/generic.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | struct bol | ||
| 20 | { | ||
| 21 | using analyze_t = analysis::generic< analysis::rule_type::OPT >; | ||
| 22 | |||
| 23 | template< typename Input > | ||
| 24 | static bool match( Input& in ) noexcept | ||
| 25 | { | ||
| 26 | return in.byte_in_line() == 0; | ||
| 27 | } | ||
| 28 | }; | ||
| 29 | |||
| 30 | template<> | ||
| 31 | struct skip_control< bol > : std::true_type | ||
| 32 | { | ||
| 33 | }; | ||
| 34 | |||
| 35 | } // namespace internal | ||
| 36 | |||
| 37 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 38 | |||
| 39 | } // namespace tao | ||
| 40 | |||
| 41 | #endif | ||
diff --git a/MoonParser/pegtl/internal/bump_help.hpp b/MoonParser/pegtl/internal/bump_help.hpp new file mode 100644 index 0000000..577870e --- /dev/null +++ b/MoonParser/pegtl/internal/bump_help.hpp | |||
| @@ -0,0 +1,64 @@ | |||
| 1 | // Copyright (c) 2015-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_BUMP_UTIL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_BUMP_UTIL_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | #include <type_traits> | ||
| 9 | |||
| 10 | #include "../config.hpp" | ||
| 11 | |||
| 12 | #include "result_on_found.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace internal | ||
| 19 | { | ||
| 20 | template< bool > | ||
| 21 | struct bump_impl; | ||
| 22 | |||
| 23 | template<> | ||
| 24 | struct bump_impl< true > | ||
| 25 | { | ||
| 26 | template< typename Input > | ||
| 27 | static void bump( Input& in, const std::size_t count ) noexcept | ||
| 28 | { | ||
| 29 | in.bump( count ); | ||
| 30 | } | ||
| 31 | }; | ||
| 32 | |||
| 33 | template<> | ||
| 34 | struct bump_impl< false > | ||
| 35 | { | ||
| 36 | template< typename Input > | ||
| 37 | static void bump( Input& in, const std::size_t count ) noexcept | ||
| 38 | { | ||
| 39 | in.bump_in_this_line( count ); | ||
| 40 | } | ||
| 41 | }; | ||
| 42 | |||
| 43 | template< bool... > | ||
| 44 | struct bool_list | ||
| 45 | { | ||
| 46 | }; | ||
| 47 | |||
| 48 | template< bool... Bs > | ||
| 49 | using bool_and = std::is_same< bool_list< Bs..., true >, bool_list< true, Bs... > >; | ||
| 50 | |||
| 51 | template< result_on_found R, typename Input, typename Char, Char... Cs > | ||
| 52 | void bump_help( Input& in, const std::size_t count ) noexcept | ||
| 53 | { | ||
| 54 | using eol_t = typename Input::eol_t; | ||
| 55 | bump_impl< bool_and< ( Cs != eol_t::ch )... >::value != bool( R ) >::bump( in, count ); | ||
| 56 | } | ||
| 57 | |||
| 58 | } // namespace internal | ||
| 59 | |||
| 60 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 61 | |||
| 62 | } // namespace tao | ||
| 63 | |||
| 64 | #endif | ||
diff --git a/MoonParser/pegtl/internal/bump_impl.hpp b/MoonParser/pegtl/internal/bump_impl.hpp new file mode 100644 index 0000000..6ab9005 --- /dev/null +++ b/MoonParser/pegtl/internal/bump_impl.hpp | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_BUMP_IMPL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_BUMP_IMPL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "iterator.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | inline void bump( iterator& iter, const std::size_t count, const int ch ) noexcept | ||
| 18 | { | ||
| 19 | for( std::size_t i = 0; i < count; ++i ) { | ||
| 20 | if( iter.data[ i ] == ch ) { | ||
| 21 | ++iter.line; | ||
| 22 | iter.byte_in_line = 0; | ||
| 23 | } | ||
| 24 | else { | ||
| 25 | ++iter.byte_in_line; | ||
| 26 | } | ||
| 27 | } | ||
| 28 | iter.byte += count; | ||
| 29 | iter.data += count; | ||
| 30 | } | ||
| 31 | |||
| 32 | inline void bump_in_this_line( iterator& iter, const std::size_t count ) noexcept | ||
| 33 | { | ||
| 34 | iter.data += count; | ||
| 35 | iter.byte += count; | ||
| 36 | iter.byte_in_line += count; | ||
| 37 | } | ||
| 38 | |||
| 39 | inline void bump_to_next_line( iterator& iter, const std::size_t count ) noexcept | ||
| 40 | { | ||
| 41 | ++iter.line; | ||
| 42 | iter.byte += count; | ||
| 43 | iter.byte_in_line = 0; | ||
| 44 | iter.data += count; | ||
| 45 | } | ||
| 46 | |||
| 47 | } // namespace internal | ||
| 48 | |||
| 49 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 50 | |||
| 51 | } // namespace tao | ||
| 52 | |||
| 53 | #endif | ||
diff --git a/MoonParser/pegtl/internal/bytes.hpp b/MoonParser/pegtl/internal/bytes.hpp new file mode 100644 index 0000000..c180a68 --- /dev/null +++ b/MoonParser/pegtl/internal/bytes.hpp | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_BYTES_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_BYTES_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | #include "../analysis/counted.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | template< unsigned Num > | ||
| 20 | struct bytes | ||
| 21 | { | ||
| 22 | using analyze_t = analysis::counted< analysis::rule_type::ANY, Num >; | ||
| 23 | |||
| 24 | template< typename Input > | ||
| 25 | static bool match( Input& in ) | ||
| 26 | { | ||
| 27 | if( in.size( Num ) >= Num ) { | ||
| 28 | in.bump( Num ); | ||
| 29 | return true; | ||
| 30 | } | ||
| 31 | return false; | ||
| 32 | } | ||
| 33 | }; | ||
| 34 | |||
| 35 | template< unsigned Num > | ||
| 36 | struct skip_control< bytes< Num > > : std::true_type | ||
| 37 | { | ||
| 38 | }; | ||
| 39 | |||
| 40 | } // namespace internal | ||
| 41 | |||
| 42 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 43 | |||
| 44 | } // namespace tao | ||
| 45 | |||
| 46 | #endif | ||
diff --git a/MoonParser/pegtl/internal/control.hpp b/MoonParser/pegtl/internal/control.hpp new file mode 100644 index 0000000..16fab5c --- /dev/null +++ b/MoonParser/pegtl/internal/control.hpp | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_CONTROL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_CONTROL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "duseltronik.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | #include "skip_control.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< template< typename... > class Control, typename... Rules > | ||
| 25 | struct control | ||
| 26 | { | ||
| 27 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rules... >; | ||
| 28 | |||
| 29 | template< apply_mode A, | ||
| 30 | rewind_mode M, | ||
| 31 | template< typename... > class Action, | ||
| 32 | template< typename... > class, | ||
| 33 | typename Input, | ||
| 34 | typename... States > | ||
| 35 | static bool match( Input& in, States&&... st ) | ||
| 36 | { | ||
| 37 | return duseltronik< seq< Rules... >, A, M, Action, Control >::match( in, st... ); | ||
| 38 | } | ||
| 39 | }; | ||
| 40 | |||
| 41 | template< template< typename... > class Control, typename... Rules > | ||
| 42 | struct skip_control< control< Control, Rules... > > : std::true_type | ||
| 43 | { | ||
| 44 | }; | ||
| 45 | |||
| 46 | } // namespace internal | ||
| 47 | |||
| 48 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 49 | |||
| 50 | } // namespace tao | ||
| 51 | |||
| 52 | #endif | ||
diff --git a/MoonParser/pegtl/internal/cr_crlf_eol.hpp b/MoonParser/pegtl/internal/cr_crlf_eol.hpp new file mode 100644 index 0000000..ebfc75d --- /dev/null +++ b/MoonParser/pegtl/internal/cr_crlf_eol.hpp | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_CR_CRLF_EOL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_CR_CRLF_EOL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | namespace internal | ||
| 14 | { | ||
| 15 | struct cr_crlf_eol | ||
| 16 | { | ||
| 17 | static constexpr int ch = '\r'; | ||
| 18 | |||
| 19 | template< typename Input > | ||
| 20 | static eol_pair match( Input& in ) | ||
| 21 | { | ||
| 22 | eol_pair p = { false, in.size( 2 ) }; | ||
| 23 | if( p.second ) { | ||
| 24 | if( in.peek_char() == '\r' ) { | ||
| 25 | in.bump_to_next_line( 1 + ( ( p.second > 1 ) && ( in.peek_char( 1 ) == '\n' ) ) ); | ||
| 26 | p.first = true; | ||
| 27 | } | ||
| 28 | } | ||
| 29 | return p; | ||
| 30 | } | ||
| 31 | }; | ||
| 32 | |||
| 33 | } // namespace internal | ||
| 34 | |||
| 35 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 36 | |||
| 37 | } // namespace tao | ||
| 38 | |||
| 39 | #endif | ||
diff --git a/MoonParser/pegtl/internal/cr_eol.hpp b/MoonParser/pegtl/internal/cr_eol.hpp new file mode 100644 index 0000000..79388eb --- /dev/null +++ b/MoonParser/pegtl/internal/cr_eol.hpp | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_CR_EOL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_CR_EOL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | namespace internal | ||
| 14 | { | ||
| 15 | struct cr_eol | ||
| 16 | { | ||
| 17 | static constexpr int ch = '\r'; | ||
| 18 | |||
| 19 | template< typename Input > | ||
| 20 | static eol_pair match( Input& in ) | ||
| 21 | { | ||
| 22 | eol_pair p = { false, in.size( 1 ) }; | ||
| 23 | if( p.second ) { | ||
| 24 | if( in.peek_char() == '\r' ) { | ||
| 25 | in.bump_to_next_line(); | ||
| 26 | p.first = true; | ||
| 27 | } | ||
| 28 | } | ||
| 29 | return p; | ||
| 30 | } | ||
| 31 | }; | ||
| 32 | |||
| 33 | } // namespace internal | ||
| 34 | |||
| 35 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 36 | |||
| 37 | } // namespace tao | ||
| 38 | |||
| 39 | #endif | ||
diff --git a/MoonParser/pegtl/internal/crlf_eol.hpp b/MoonParser/pegtl/internal/crlf_eol.hpp new file mode 100644 index 0000000..621b6b3 --- /dev/null +++ b/MoonParser/pegtl/internal/crlf_eol.hpp | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_CRLF_EOL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_CRLF_EOL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | namespace internal | ||
| 14 | { | ||
| 15 | struct crlf_eol | ||
| 16 | { | ||
| 17 | static constexpr int ch = '\n'; | ||
| 18 | |||
| 19 | template< typename Input > | ||
| 20 | static eol_pair match( Input& in ) | ||
| 21 | { | ||
| 22 | eol_pair p = { false, in.size( 2 ) }; | ||
| 23 | if( p.second > 1 ) { | ||
| 24 | if( ( in.peek_char() == '\r' ) && ( in.peek_char( 1 ) == '\n' ) ) { | ||
| 25 | in.bump_to_next_line( 2 ); | ||
| 26 | p.first = true; | ||
| 27 | } | ||
| 28 | } | ||
| 29 | return p; | ||
| 30 | } | ||
| 31 | }; | ||
| 32 | |||
| 33 | } // namespace internal | ||
| 34 | |||
| 35 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 36 | |||
| 37 | } // namespace tao | ||
| 38 | |||
| 39 | #endif | ||
diff --git a/MoonParser/pegtl/internal/cstream_reader.hpp b/MoonParser/pegtl/internal/cstream_reader.hpp new file mode 100644 index 0000000..c1670bf --- /dev/null +++ b/MoonParser/pegtl/internal/cstream_reader.hpp | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_CSTREAM_READER_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_CSTREAM_READER_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | #include <cstdio> | ||
| 9 | |||
| 10 | #include "../config.hpp" | ||
| 11 | #include "../input_error.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | struct cstream_reader | ||
| 20 | { | ||
| 21 | explicit cstream_reader( std::FILE* s ) noexcept | ||
| 22 | : m_cstream( s ) | ||
| 23 | { | ||
| 24 | } | ||
| 25 | |||
| 26 | std::size_t operator()( char* buffer, const std::size_t length ) | ||
| 27 | { | ||
| 28 | if( const auto r = std::fread( buffer, 1, length, m_cstream ) ) { | ||
| 29 | return r; | ||
| 30 | } | ||
| 31 | if( std::feof( m_cstream ) != 0 ) { | ||
| 32 | return 0; | ||
| 33 | } | ||
| 34 | // Please contact us if you know how to provoke the following exception. | ||
| 35 | // The example on cppreference.com doesn't work, at least not on macOS. | ||
| 36 | TAOCPP_PEGTL_THROW_INPUT_ERROR( "error in fread() from cstream" ); // LCOV_EXCL_LINE | ||
| 37 | } | ||
| 38 | |||
| 39 | std::FILE* m_cstream; | ||
| 40 | }; | ||
| 41 | |||
| 42 | } // namespace internal | ||
| 43 | |||
| 44 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 45 | |||
| 46 | } // namespace tao | ||
| 47 | |||
| 48 | #endif | ||
diff --git a/MoonParser/pegtl/internal/cstring_reader.hpp b/MoonParser/pegtl/internal/cstring_reader.hpp new file mode 100644 index 0000000..ff8c11e --- /dev/null +++ b/MoonParser/pegtl/internal/cstring_reader.hpp | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_CSTRING_READER_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_CSTRING_READER_HPP | ||
| 6 | |||
| 7 | #include <cassert> | ||
| 8 | #include <cstddef> | ||
| 9 | |||
| 10 | #include "../config.hpp" | ||
| 11 | #include "../input_error.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | struct cstring_reader | ||
| 20 | { | ||
| 21 | explicit cstring_reader( const char* zero_terminated ) noexcept | ||
| 22 | : m_cstring( zero_terminated ) | ||
| 23 | { | ||
| 24 | assert( m_cstring ); | ||
| 25 | } | ||
| 26 | |||
| 27 | std::size_t operator()( char* buffer, const std::size_t length ) noexcept | ||
| 28 | { | ||
| 29 | std::size_t i = 0; | ||
| 30 | char c; | ||
| 31 | |||
| 32 | while( ( i < length ) && ( ( c = m_cstring[ i ] ) != 0 ) ) { | ||
| 33 | *buffer++ = c; | ||
| 34 | ++i; | ||
| 35 | } | ||
| 36 | m_cstring += i; | ||
| 37 | return i; | ||
| 38 | } | ||
| 39 | |||
| 40 | const char* m_cstring; | ||
| 41 | }; | ||
| 42 | |||
| 43 | } // namespace internal | ||
| 44 | |||
| 45 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 46 | |||
| 47 | } // namespace tao | ||
| 48 | |||
| 49 | #endif | ||
diff --git a/MoonParser/pegtl/internal/demangle.hpp b/MoonParser/pegtl/internal/demangle.hpp new file mode 100644 index 0000000..64efe6f --- /dev/null +++ b/MoonParser/pegtl/internal/demangle.hpp | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_DEMANGLE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_DEMANGLE_HPP | ||
| 6 | |||
| 7 | #include <string> | ||
| 8 | #include <typeinfo> | ||
| 9 | |||
| 10 | #include "../config.hpp" | ||
| 11 | |||
| 12 | #if defined( __GLIBCXX__ ) | ||
| 13 | #include "demangle_cxxabi.hpp" | ||
| 14 | #elif defined( __has_include ) | ||
| 15 | // clang-format off | ||
| 16 | #if __has_include( <cxxabi.h> ) | ||
| 17 | // clang-format on | ||
| 18 | #include "demangle_cxxabi.hpp" | ||
| 19 | #else | ||
| 20 | #include "demangle_nop.hpp" | ||
| 21 | #endif | ||
| 22 | #else | ||
| 23 | #include "demangle_nop.hpp" | ||
| 24 | #endif | ||
| 25 | |||
| 26 | namespace tao | ||
| 27 | { | ||
| 28 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 29 | { | ||
| 30 | namespace internal | ||
| 31 | { | ||
| 32 | template< typename T > | ||
| 33 | std::string demangle() | ||
| 34 | { | ||
| 35 | return demangle( typeid( T ).name() ); | ||
| 36 | } | ||
| 37 | |||
| 38 | } // namespace internal | ||
| 39 | |||
| 40 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 41 | |||
| 42 | } // namespace tao | ||
| 43 | |||
| 44 | #endif | ||
diff --git a/MoonParser/pegtl/internal/demangle_cxxabi.hpp b/MoonParser/pegtl/internal/demangle_cxxabi.hpp new file mode 100644 index 0000000..aba72f9 --- /dev/null +++ b/MoonParser/pegtl/internal/demangle_cxxabi.hpp | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_DEMANGLE_CXXABI_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_DEMANGLE_CXXABI_HPP | ||
| 6 | |||
| 7 | #include <cstdlib> | ||
| 8 | #include <cxxabi.h> | ||
| 9 | #include <memory> | ||
| 10 | #include <string> | ||
| 11 | |||
| 12 | #include "../config.hpp" | ||
| 13 | |||
| 14 | #include "demangle_sanitise.hpp" | ||
| 15 | |||
| 16 | namespace tao | ||
| 17 | { | ||
| 18 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 19 | { | ||
| 20 | namespace internal | ||
| 21 | { | ||
| 22 | inline std::string demangle( const char* symbol ) | ||
| 23 | { | ||
| 24 | const std::unique_ptr< char, decltype( &std::free ) > demangled( abi::__cxa_demangle( symbol, nullptr, nullptr, nullptr ), &std::free ); | ||
| 25 | if( !demangled ) { | ||
| 26 | return symbol; | ||
| 27 | } | ||
| 28 | std::string result( demangled.get() ); | ||
| 29 | #ifdef TAOCPP_PEGTL_PRETTY_DEMANGLE | ||
| 30 | demangle_sanitise_chars( result ); | ||
| 31 | #endif | ||
| 32 | return result; | ||
| 33 | } | ||
| 34 | |||
| 35 | } // namespace internal | ||
| 36 | |||
| 37 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 38 | |||
| 39 | } // namespace tao | ||
| 40 | |||
| 41 | #endif | ||
diff --git a/MoonParser/pegtl/internal/demangle_nop.hpp b/MoonParser/pegtl/internal/demangle_nop.hpp new file mode 100644 index 0000000..70bf3ec --- /dev/null +++ b/MoonParser/pegtl/internal/demangle_nop.hpp | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_DEMANGLE_NOP_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_DEMANGLE_NOP_HPP | ||
| 6 | |||
| 7 | #include <string> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | inline std::string demangle( const char* symbol ) | ||
| 18 | { | ||
| 19 | return symbol; | ||
| 20 | } | ||
| 21 | |||
| 22 | } // namespace internal | ||
| 23 | |||
| 24 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 25 | |||
| 26 | } // namespace tao | ||
| 27 | |||
| 28 | #endif | ||
diff --git a/MoonParser/pegtl/internal/demangle_sanitise.hpp b/MoonParser/pegtl/internal/demangle_sanitise.hpp new file mode 100644 index 0000000..f869ea6 --- /dev/null +++ b/MoonParser/pegtl/internal/demangle_sanitise.hpp | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_DEMANGLE_SANITISE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_DEMANGLE_SANITISE_HPP | ||
| 6 | |||
| 7 | #include <string> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | inline void demangle_sanitise_chars( std::string& s ) | ||
| 18 | { | ||
| 19 | std::string::size_type p; | ||
| 20 | while( ( p = s.find( "(char)" ) ) != std::string::npos ) { | ||
| 21 | int c = 0; | ||
| 22 | std::string::size_type q; | ||
| 23 | for( q = p + 6; ( q < s.size() ) && ( s[ q ] >= '0' ) && ( s[ q ] <= '9' ); ++q ) { | ||
| 24 | c *= 10; | ||
| 25 | c += s[ q ] - '0'; | ||
| 26 | } | ||
| 27 | if( c == '\'' ) { | ||
| 28 | s.replace( p, q - p, "'\\''" ); | ||
| 29 | } | ||
| 30 | else if( c == '\\' ) { | ||
| 31 | s.replace( p, q - p, "'\\\\'" ); | ||
| 32 | } | ||
| 33 | else if( ( c < 32 ) || ( c > 126 ) ) { | ||
| 34 | s.replace( p, 6, std::string() ); | ||
| 35 | } | ||
| 36 | else { | ||
| 37 | s.replace( p, q - p, std::string( 1, '\'' ) + char( c ) + '\'' ); | ||
| 38 | } | ||
| 39 | } | ||
| 40 | } | ||
| 41 | |||
| 42 | } // namespace internal | ||
| 43 | |||
| 44 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 45 | |||
| 46 | } // namespace tao | ||
| 47 | |||
| 48 | #endif | ||
diff --git a/MoonParser/pegtl/internal/disable.hpp b/MoonParser/pegtl/internal/disable.hpp new file mode 100644 index 0000000..19ccb1e --- /dev/null +++ b/MoonParser/pegtl/internal/disable.hpp | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_DISABLE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_DISABLE_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "duseltronik.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | #include "skip_control.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< typename... Rules > | ||
| 25 | struct disable | ||
| 26 | { | ||
| 27 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rules... >; | ||
| 28 | |||
| 29 | template< apply_mode, | ||
| 30 | rewind_mode M, | ||
| 31 | template< typename... > class Action, | ||
| 32 | template< typename... > class Control, | ||
| 33 | typename Input, | ||
| 34 | typename... States > | ||
| 35 | static bool match( Input& in, States&&... st ) | ||
| 36 | { | ||
| 37 | return duseltronik< seq< Rules... >, apply_mode::NOTHING, M, Action, Control >::match( in, st... ); | ||
| 38 | } | ||
| 39 | }; | ||
| 40 | |||
| 41 | template< typename... Rules > | ||
| 42 | struct skip_control< disable< Rules... > > : std::true_type | ||
| 43 | { | ||
| 44 | }; | ||
| 45 | |||
| 46 | } // namespace internal | ||
| 47 | |||
| 48 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 49 | |||
| 50 | } // namespace tao | ||
| 51 | |||
| 52 | #endif | ||
diff --git a/MoonParser/pegtl/internal/discard.hpp b/MoonParser/pegtl/internal/discard.hpp new file mode 100644 index 0000000..9aac60f --- /dev/null +++ b/MoonParser/pegtl/internal/discard.hpp | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_DISCARD_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_DISCARD_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | #include "../analysis/generic.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | struct discard | ||
| 20 | { | ||
| 21 | using analyze_t = analysis::generic< analysis::rule_type::OPT >; | ||
| 22 | |||
| 23 | template< typename Input > | ||
| 24 | static bool match( Input& in ) | ||
| 25 | { | ||
| 26 | in.discard(); | ||
| 27 | return true; | ||
| 28 | } | ||
| 29 | }; | ||
| 30 | |||
| 31 | template<> | ||
| 32 | struct skip_control< discard > : std::true_type | ||
| 33 | { | ||
| 34 | }; | ||
| 35 | |||
| 36 | } // namespace internal | ||
| 37 | |||
| 38 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 39 | |||
| 40 | } // namespace tao | ||
| 41 | |||
| 42 | #endif | ||
diff --git a/MoonParser/pegtl/internal/dusel_mode.hpp b/MoonParser/pegtl/internal/dusel_mode.hpp new file mode 100644 index 0000000..df757aa --- /dev/null +++ b/MoonParser/pegtl/internal/dusel_mode.hpp | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_DUSEL_MODE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_DUSEL_MODE_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | enum class dusel_mode : char | ||
| 14 | { | ||
| 15 | NOTHING = 0, | ||
| 16 | CONTROL = 1, | ||
| 17 | CONTROL_AND_APPLY = 2, | ||
| 18 | CONTROL_AND_APPLY0 = 3 | ||
| 19 | }; | ||
| 20 | |||
| 21 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 22 | |||
| 23 | } // namespace tao | ||
| 24 | |||
| 25 | #endif | ||
diff --git a/MoonParser/pegtl/internal/duseltronik.hpp b/MoonParser/pegtl/internal/duseltronik.hpp new file mode 100644 index 0000000..23a6e1f --- /dev/null +++ b/MoonParser/pegtl/internal/duseltronik.hpp | |||
| @@ -0,0 +1,114 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_DUSELTRONIK_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_DUSELTRONIK_HPP | ||
| 6 | |||
| 7 | #include "../apply_mode.hpp" | ||
| 8 | #include "../config.hpp" | ||
| 9 | #include "../rewind_mode.hpp" | ||
| 10 | |||
| 11 | #include "dusel_mode.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | template< typename Rule, | ||
| 20 | apply_mode A, | ||
| 21 | rewind_mode M, | ||
| 22 | template< typename... > class Action, | ||
| 23 | template< typename... > class Control, | ||
| 24 | dusel_mode = dusel_mode::NOTHING > | ||
| 25 | struct duseltronik; | ||
| 26 | |||
| 27 | template< typename Rule, | ||
| 28 | apply_mode A, | ||
| 29 | rewind_mode M, | ||
| 30 | template< typename... > class Action, | ||
| 31 | template< typename... > class Control > | ||
| 32 | struct duseltronik< Rule, A, M, Action, Control, dusel_mode::NOTHING > | ||
| 33 | { | ||
| 34 | template< typename Input, typename... States > | ||
| 35 | static auto match( Input& in, States&&... st ) -> decltype( Rule::template match< A, M, Action, Control >( in, st... ), true ) | ||
| 36 | { | ||
| 37 | return Rule::template match< A, M, Action, Control >( in, st... ); | ||
| 38 | } | ||
| 39 | |||
| 40 | // NOTE: The additional "int = 0" is a work-around for missing expression SFINAE in VS2015. | ||
| 41 | |||
| 42 | template< typename Input, typename... States, int = 0 > | ||
| 43 | static auto match( Input& in, States&&... ) -> decltype( Rule::match( in ), true ) | ||
| 44 | { | ||
| 45 | return Rule::match( in ); | ||
| 46 | } | ||
| 47 | }; | ||
| 48 | |||
| 49 | template< typename Rule, | ||
| 50 | apply_mode A, | ||
| 51 | rewind_mode M, | ||
| 52 | template< typename... > class Action, | ||
| 53 | template< typename... > class Control > | ||
| 54 | struct duseltronik< Rule, A, M, Action, Control, dusel_mode::CONTROL > | ||
| 55 | { | ||
| 56 | template< typename Input, typename... States > | ||
| 57 | static bool match( Input& in, States&&... st ) | ||
| 58 | { | ||
| 59 | Control< Rule >::start( const_cast< const Input& >( in ), st... ); | ||
| 60 | |||
| 61 | if( duseltronik< Rule, A, M, Action, Control, dusel_mode::NOTHING >::match( in, st... ) ) { | ||
| 62 | Control< Rule >::success( const_cast< const Input& >( in ), st... ); | ||
| 63 | return true; | ||
| 64 | } | ||
| 65 | Control< Rule >::failure( const_cast< const Input& >( in ), st... ); | ||
| 66 | return false; | ||
| 67 | } | ||
| 68 | }; | ||
| 69 | |||
| 70 | template< typename Rule, | ||
| 71 | apply_mode A, | ||
| 72 | rewind_mode M, | ||
| 73 | template< typename... > class Action, | ||
| 74 | template< typename... > class Control > | ||
| 75 | struct duseltronik< Rule, A, M, Action, Control, dusel_mode::CONTROL_AND_APPLY > | ||
| 76 | { | ||
| 77 | template< typename Input, typename... States > | ||
| 78 | static bool match( Input& in, States&&... st ) | ||
| 79 | { | ||
| 80 | auto m = in.template mark< rewind_mode::REQUIRED >(); | ||
| 81 | |||
| 82 | if( duseltronik< Rule, A, rewind_mode::ACTIVE, Action, Control, dusel_mode::CONTROL >::match( in, st... ) ) { | ||
| 83 | Control< Rule >::template apply< Action >( m.iterator(), const_cast< const Input& >( in ), st... ); | ||
| 84 | return m( true ); | ||
| 85 | } | ||
| 86 | return false; | ||
| 87 | } | ||
| 88 | }; | ||
| 89 | |||
| 90 | template< typename Rule, | ||
| 91 | apply_mode A, | ||
| 92 | rewind_mode M, | ||
| 93 | template< typename... > class Action, | ||
| 94 | template< typename... > class Control > | ||
| 95 | struct duseltronik< Rule, A, M, Action, Control, dusel_mode::CONTROL_AND_APPLY0 > | ||
| 96 | { | ||
| 97 | template< typename Input, typename... States > | ||
| 98 | static bool match( Input& in, States&&... st ) | ||
| 99 | { | ||
| 100 | if( duseltronik< Rule, A, M, Action, Control, dusel_mode::CONTROL >::match( in, st... ) ) { | ||
| 101 | Control< Rule >::template apply0< Action >( const_cast< const Input& >( in ), st... ); | ||
| 102 | return true; | ||
| 103 | } | ||
| 104 | return false; | ||
| 105 | } | ||
| 106 | }; | ||
| 107 | |||
| 108 | } // namespace internal | ||
| 109 | |||
| 110 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 111 | |||
| 112 | } // namespace tao | ||
| 113 | |||
| 114 | #endif | ||
diff --git a/MoonParser/pegtl/internal/enable.hpp b/MoonParser/pegtl/internal/enable.hpp new file mode 100644 index 0000000..c01268c --- /dev/null +++ b/MoonParser/pegtl/internal/enable.hpp | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_ENABLE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_ENABLE_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "duseltronik.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | #include "skip_control.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< typename... Rules > | ||
| 25 | struct enable | ||
| 26 | { | ||
| 27 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rules... >; | ||
| 28 | |||
| 29 | template< apply_mode, | ||
| 30 | rewind_mode M, | ||
| 31 | template< typename... > class Action, | ||
| 32 | template< typename... > class Control, | ||
| 33 | typename Input, | ||
| 34 | typename... States > | ||
| 35 | static bool match( Input& in, States&&... st ) | ||
| 36 | { | ||
| 37 | return duseltronik< seq< Rules... >, apply_mode::ACTION, M, Action, Control >::match( in, st... ); | ||
| 38 | } | ||
| 39 | }; | ||
| 40 | |||
| 41 | template< typename... Rules > | ||
| 42 | struct skip_control< enable< Rules... > > : std::true_type | ||
| 43 | { | ||
| 44 | }; | ||
| 45 | |||
| 46 | } // namespace internal | ||
| 47 | |||
| 48 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 49 | |||
| 50 | } // namespace tao | ||
| 51 | |||
| 52 | #endif | ||
diff --git a/MoonParser/pegtl/internal/eof.hpp b/MoonParser/pegtl/internal/eof.hpp new file mode 100644 index 0000000..a702fa6 --- /dev/null +++ b/MoonParser/pegtl/internal/eof.hpp | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_EOF_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_EOF_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | #include "../analysis/generic.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | struct eof | ||
| 20 | { | ||
| 21 | using analyze_t = analysis::generic< analysis::rule_type::OPT >; | ||
| 22 | |||
| 23 | template< typename Input > | ||
| 24 | static bool match( Input& in ) | ||
| 25 | { | ||
| 26 | return in.empty(); | ||
| 27 | } | ||
| 28 | }; | ||
| 29 | |||
| 30 | template<> | ||
| 31 | struct skip_control< eof > : std::true_type | ||
| 32 | { | ||
| 33 | }; | ||
| 34 | |||
| 35 | } // namespace internal | ||
| 36 | |||
| 37 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 38 | |||
| 39 | } // namespace tao | ||
| 40 | |||
| 41 | #endif | ||
diff --git a/MoonParser/pegtl/internal/eol.hpp b/MoonParser/pegtl/internal/eol.hpp new file mode 100644 index 0000000..bfd43c2 --- /dev/null +++ b/MoonParser/pegtl/internal/eol.hpp | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_EOL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_EOL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | #include "../analysis/generic.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | struct eol | ||
| 20 | { | ||
| 21 | using analyze_t = analysis::generic< analysis::rule_type::ANY >; | ||
| 22 | |||
| 23 | template< typename Input > | ||
| 24 | static bool match( Input& in ) | ||
| 25 | { | ||
| 26 | using eol_t = typename Input::eol_t; | ||
| 27 | return eol_t::match( in ).first; | ||
| 28 | } | ||
| 29 | }; | ||
| 30 | |||
| 31 | template<> | ||
| 32 | struct skip_control< eol > : std::true_type | ||
| 33 | { | ||
| 34 | }; | ||
| 35 | |||
| 36 | } // namespace internal | ||
| 37 | |||
| 38 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 39 | |||
| 40 | } // namespace tao | ||
| 41 | |||
| 42 | #endif | ||
diff --git a/MoonParser/pegtl/internal/eolf.hpp b/MoonParser/pegtl/internal/eolf.hpp new file mode 100644 index 0000000..168311c --- /dev/null +++ b/MoonParser/pegtl/internal/eolf.hpp | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_EOLF_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_EOLF_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | #include "../analysis/generic.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | struct eolf | ||
| 20 | { | ||
| 21 | using analyze_t = analysis::generic< analysis::rule_type::OPT >; | ||
| 22 | |||
| 23 | template< typename Input > | ||
| 24 | static bool match( Input& in ) | ||
| 25 | { | ||
| 26 | using eol_t = typename Input::eol_t; | ||
| 27 | const auto p = eol_t::match( in ); | ||
| 28 | return p.first || ( !p.second ); | ||
| 29 | } | ||
| 30 | }; | ||
| 31 | |||
| 32 | template<> | ||
| 33 | struct skip_control< eolf > : std::true_type | ||
| 34 | { | ||
| 35 | }; | ||
| 36 | |||
| 37 | } // namespace internal | ||
| 38 | |||
| 39 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 40 | |||
| 41 | } // namespace tao | ||
| 42 | |||
| 43 | #endif | ||
diff --git a/MoonParser/pegtl/internal/file_mapper.hpp b/MoonParser/pegtl/internal/file_mapper.hpp new file mode 100644 index 0000000..800b9df --- /dev/null +++ b/MoonParser/pegtl/internal/file_mapper.hpp | |||
| @@ -0,0 +1,91 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_FILE_MAPPER_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_FILE_MAPPER_HPP | ||
| 6 | |||
| 7 | #include <sys/mman.h> | ||
| 8 | #include <unistd.h> | ||
| 9 | |||
| 10 | #include "../config.hpp" | ||
| 11 | |||
| 12 | #include "file_opener.hpp" | ||
| 13 | |||
| 14 | #include "../input_error.hpp" | ||
| 15 | |||
| 16 | namespace tao | ||
| 17 | { | ||
| 18 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 19 | { | ||
| 20 | namespace internal | ||
| 21 | { | ||
| 22 | class file_mapper | ||
| 23 | { | ||
| 24 | public: | ||
| 25 | explicit file_mapper( const char* filename ) | ||
| 26 | : file_mapper( file_opener( filename ) ) | ||
| 27 | { | ||
| 28 | } | ||
| 29 | |||
| 30 | explicit file_mapper( const file_opener& reader ) | ||
| 31 | : m_size( reader.size() ), | ||
| 32 | m_data( static_cast< const char* >(::mmap( nullptr, m_size, PROT_READ, MAP_PRIVATE, reader.m_fd, 0 ) ) ) | ||
| 33 | { | ||
| 34 | if( m_size && ( intptr_t( m_data ) == -1 ) ) { | ||
| 35 | TAOCPP_PEGTL_THROW_INPUT_ERROR( "unable to mmap() file " << reader.m_source << " descriptor " << reader.m_fd ); | ||
| 36 | } | ||
| 37 | } | ||
| 38 | |||
| 39 | ~file_mapper() noexcept | ||
| 40 | { | ||
| 41 | ::munmap( const_cast< char* >( m_data ), m_size ); // Legacy C interface requires pointer-to-mutable but does not write through the pointer. | ||
| 42 | } | ||
| 43 | |||
| 44 | file_mapper( const file_mapper& ) = delete; | ||
| 45 | void operator=( const file_mapper& ) = delete; | ||
| 46 | |||
| 47 | bool empty() const noexcept | ||
| 48 | { | ||
| 49 | return m_size == 0; | ||
| 50 | } | ||
| 51 | |||
| 52 | std::size_t size() const noexcept | ||
| 53 | { | ||
| 54 | return m_size; | ||
| 55 | } | ||
| 56 | |||
| 57 | using iterator = const char*; | ||
| 58 | using const_iterator = const char*; | ||
| 59 | |||
| 60 | iterator data() const noexcept | ||
| 61 | { | ||
| 62 | return m_data; | ||
| 63 | } | ||
| 64 | |||
| 65 | iterator begin() const noexcept | ||
| 66 | { | ||
| 67 | return m_data; | ||
| 68 | } | ||
| 69 | |||
| 70 | iterator end() const noexcept | ||
| 71 | { | ||
| 72 | return m_data + m_size; | ||
| 73 | } | ||
| 74 | |||
| 75 | std::string string() const | ||
| 76 | { | ||
| 77 | return std::string( m_data, m_size ); | ||
| 78 | } | ||
| 79 | |||
| 80 | private: | ||
| 81 | const std::size_t m_size; | ||
| 82 | const char* const m_data; | ||
| 83 | }; | ||
| 84 | |||
| 85 | } // namespace internal | ||
| 86 | |||
| 87 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 88 | |||
| 89 | } // namespace tao | ||
| 90 | |||
| 91 | #endif | ||
diff --git a/MoonParser/pegtl/internal/file_opener.hpp b/MoonParser/pegtl/internal/file_opener.hpp new file mode 100644 index 0000000..0b1ad6d --- /dev/null +++ b/MoonParser/pegtl/internal/file_opener.hpp | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_FILE_OPENER_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_FILE_OPENER_HPP | ||
| 6 | |||
| 7 | #include <fcntl.h> | ||
| 8 | #include <sys/stat.h> | ||
| 9 | #include <sys/types.h> | ||
| 10 | #include <unistd.h> | ||
| 11 | |||
| 12 | #include <utility> | ||
| 13 | |||
| 14 | #include "../config.hpp" | ||
| 15 | #include "../input_error.hpp" | ||
| 16 | |||
| 17 | namespace tao | ||
| 18 | { | ||
| 19 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 20 | { | ||
| 21 | namespace internal | ||
| 22 | { | ||
| 23 | struct file_opener | ||
| 24 | { | ||
| 25 | explicit file_opener( const char* filename ) | ||
| 26 | : m_source( filename ), | ||
| 27 | m_fd( open() ) | ||
| 28 | { | ||
| 29 | } | ||
| 30 | |||
| 31 | ~file_opener() noexcept | ||
| 32 | { | ||
| 33 | ::close( m_fd ); | ||
| 34 | } | ||
| 35 | |||
| 36 | file_opener( const file_opener& ) = delete; | ||
| 37 | void operator=( const file_opener& ) = delete; | ||
| 38 | |||
| 39 | std::size_t size() const | ||
| 40 | { | ||
| 41 | struct stat st; | ||
| 42 | errno = 0; | ||
| 43 | if(::fstat( m_fd, &st ) < 0 ) { | ||
| 44 | TAOCPP_PEGTL_THROW_INPUT_ERROR( "unable to fstat() file " << m_source << " descriptor " << m_fd ); | ||
| 45 | } | ||
| 46 | return std::size_t( st.st_size ); | ||
| 47 | } | ||
| 48 | |||
| 49 | const char* const m_source; | ||
| 50 | const int m_fd; | ||
| 51 | |||
| 52 | private: | ||
| 53 | int open() const | ||
| 54 | { | ||
| 55 | errno = 0; | ||
| 56 | const int fd = ::open( m_source, O_RDONLY ); | ||
| 57 | if( fd >= 0 ) { | ||
| 58 | return fd; | ||
| 59 | } | ||
| 60 | TAOCPP_PEGTL_THROW_INPUT_ERROR( "unable to open() file " << m_source << " for reading" ); | ||
| 61 | } | ||
| 62 | }; | ||
| 63 | |||
| 64 | } // namespace internal | ||
| 65 | |||
| 66 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 67 | |||
| 68 | } // namespace tao | ||
| 69 | |||
| 70 | #endif | ||
diff --git a/MoonParser/pegtl/internal/file_reader.hpp b/MoonParser/pegtl/internal/file_reader.hpp new file mode 100644 index 0000000..9bcdf97 --- /dev/null +++ b/MoonParser/pegtl/internal/file_reader.hpp | |||
| @@ -0,0 +1,96 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_FILE_READER_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_FILE_READER_HPP | ||
| 6 | |||
| 7 | #include <cstdio> | ||
| 8 | #include <memory> | ||
| 9 | #include <string> | ||
| 10 | #include <utility> | ||
| 11 | |||
| 12 | #include "../config.hpp" | ||
| 13 | #include "../input_error.hpp" | ||
| 14 | |||
| 15 | namespace tao | ||
| 16 | { | ||
| 17 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 18 | { | ||
| 19 | namespace internal | ||
| 20 | { | ||
| 21 | struct file_close | ||
| 22 | { | ||
| 23 | void operator()( FILE* f ) const | ||
| 24 | { | ||
| 25 | std::fclose( f ); | ||
| 26 | } | ||
| 27 | }; | ||
| 28 | |||
| 29 | class file_reader | ||
| 30 | { | ||
| 31 | public: | ||
| 32 | explicit file_reader( const char* filename ) | ||
| 33 | : m_source( filename ), | ||
| 34 | m_file( open() ) | ||
| 35 | { | ||
| 36 | } | ||
| 37 | |||
| 38 | file_reader( const file_reader& ) = delete; | ||
| 39 | void operator=( const file_reader& ) = delete; | ||
| 40 | |||
| 41 | std::size_t size() const | ||
| 42 | { | ||
| 43 | errno = 0; | ||
| 44 | if( std::fseek( m_file.get(), 0, SEEK_END ) != 0 ) { | ||
| 45 | TAOCPP_PEGTL_THROW_INPUT_ERROR( "unable to fseek() to end of file " << m_source ); // LCOV_EXCL_LINE | ||
| 46 | } | ||
| 47 | errno = 0; | ||
| 48 | const auto s = std::ftell( m_file.get() ); | ||
| 49 | if( s < 0 ) { | ||
| 50 | TAOCPP_PEGTL_THROW_INPUT_ERROR( "unable to ftell() file size of file " << m_source ); // LCOV_EXCL_LINE | ||
| 51 | } | ||
| 52 | errno = 0; | ||
| 53 | if( std::fseek( m_file.get(), 0, SEEK_SET ) != 0 ) { | ||
| 54 | TAOCPP_PEGTL_THROW_INPUT_ERROR( "unable to fseek() to beginning of file " << m_source ); // LCOV_EXCL_LINE | ||
| 55 | } | ||
| 56 | return std::size_t( s ); | ||
| 57 | } | ||
| 58 | |||
| 59 | std::string read() const | ||
| 60 | { | ||
| 61 | std::string nrv; | ||
| 62 | nrv.resize( size() ); | ||
| 63 | errno = 0; | ||
| 64 | if( ( nrv.size() != 0 ) && ( std::fread( &nrv[ 0 ], nrv.size(), 1, m_file.get() ) != 1 ) ) { | ||
| 65 | TAOCPP_PEGTL_THROW_INPUT_ERROR( "unable to fread() file " << m_source << " size " << nrv.size() ); // LCOV_EXCL_LINE | ||
| 66 | } | ||
| 67 | return nrv; | ||
| 68 | } | ||
| 69 | |||
| 70 | private: | ||
| 71 | const char* const m_source; | ||
| 72 | const std::unique_ptr< std::FILE, file_close > m_file; | ||
| 73 | |||
| 74 | std::FILE* open() const | ||
| 75 | { | ||
| 76 | errno = 0; | ||
| 77 | #if defined( _MSC_VER ) | ||
| 78 | std::FILE* file; | ||
| 79 | if(::fopen_s( &file, m_source, "rb" ) == 0 ) | ||
| 80 | #else | ||
| 81 | if( auto* file = std::fopen( m_source, "rb" ) ) | ||
| 82 | #endif | ||
| 83 | { | ||
| 84 | return file; | ||
| 85 | } | ||
| 86 | TAOCPP_PEGTL_THROW_INPUT_ERROR( "unable to fopen() file " << m_source << " for reading" ); | ||
| 87 | } | ||
| 88 | }; | ||
| 89 | |||
| 90 | } // namespace internal | ||
| 91 | |||
| 92 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 93 | |||
| 94 | } // namespace tao | ||
| 95 | |||
| 96 | #endif | ||
diff --git a/MoonParser/pegtl/internal/has_apply0.hpp b/MoonParser/pegtl/internal/has_apply0.hpp new file mode 100644 index 0000000..01ef7f9 --- /dev/null +++ b/MoonParser/pegtl/internal/has_apply0.hpp | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_HAS_APPLY0_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_HAS_APPLY0_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | template< typename... S > | ||
| 18 | struct type_list | ||
| 19 | { | ||
| 20 | }; | ||
| 21 | |||
| 22 | template< typename A, typename L, typename = void > | ||
| 23 | struct has_apply0 : std::false_type | ||
| 24 | { | ||
| 25 | }; | ||
| 26 | |||
| 27 | template< typename A, typename... S > | ||
| 28 | struct has_apply0< A, type_list< S... >, decltype( A::apply0( std::declval< S >()... ), void() ) > : std::true_type | ||
| 29 | { | ||
| 30 | }; | ||
| 31 | |||
| 32 | } // namespace internal | ||
| 33 | |||
| 34 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 35 | |||
| 36 | } // namespace tao | ||
| 37 | |||
| 38 | #endif | ||
diff --git a/MoonParser/pegtl/internal/identifier.hpp b/MoonParser/pegtl/internal/identifier.hpp new file mode 100644 index 0000000..1ee4571 --- /dev/null +++ b/MoonParser/pegtl/internal/identifier.hpp | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_IDENTIFIER_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_IDENTIFIER_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "peek_char.hpp" | ||
| 10 | #include "ranges.hpp" | ||
| 11 | #include "seq.hpp" | ||
| 12 | #include "star.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace internal | ||
| 19 | { | ||
| 20 | using identifier_first = ranges< peek_char, 'a', 'z', 'A', 'Z', '_' >; | ||
| 21 | using identifier_other = ranges< peek_char, 'a', 'z', 'A', 'Z', '0', '9', '_' >; | ||
| 22 | using identifier = seq< identifier_first, star< identifier_other > >; | ||
| 23 | |||
| 24 | } // namespace internal | ||
| 25 | |||
| 26 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 27 | |||
| 28 | } // namespace tao | ||
| 29 | |||
| 30 | #endif | ||
diff --git a/MoonParser/pegtl/internal/if_apply.hpp b/MoonParser/pegtl/internal/if_apply.hpp new file mode 100644 index 0000000..1e6bb99 --- /dev/null +++ b/MoonParser/pegtl/internal/if_apply.hpp | |||
| @@ -0,0 +1,90 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_IF_APPLY_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_IF_APPLY_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | template< apply_mode A, typename Rule, typename... Actions > | ||
| 18 | struct if_apply_impl; | ||
| 19 | |||
| 20 | template< typename Rule, typename... Actions > | ||
| 21 | struct if_apply_impl< apply_mode::ACTION, Rule, Actions... > | ||
| 22 | { | ||
| 23 | template< rewind_mode, | ||
| 24 | template< typename... > class Action, | ||
| 25 | template< typename... > class Control, | ||
| 26 | typename Input, | ||
| 27 | typename... States > | ||
| 28 | static bool match( Input& in, States&&... st ) | ||
| 29 | { | ||
| 30 | using action_t = typename Input::action_t; | ||
| 31 | |||
| 32 | auto m = in.template mark< rewind_mode::REQUIRED >(); | ||
| 33 | |||
| 34 | if( Control< Rule >::template match< apply_mode::ACTION, rewind_mode::ACTIVE, Action, Control >( in, st... ) ) { | ||
| 35 | const action_t i2( m.iterator(), in ); | ||
| 36 | #ifdef __cpp_fold_expressions | ||
| 37 | ( Actions::apply( i2, st... ), ... ); | ||
| 38 | #else | ||
| 39 | using swallow = bool[]; | ||
| 40 | (void)swallow{ ( Actions::apply( i2, st... ), true )..., true }; | ||
| 41 | #endif | ||
| 42 | return m( true ); | ||
| 43 | } | ||
| 44 | return false; | ||
| 45 | } | ||
| 46 | }; | ||
| 47 | |||
| 48 | template< typename Rule, typename... Actions > | ||
| 49 | struct if_apply_impl< apply_mode::NOTHING, Rule, Actions... > | ||
| 50 | { | ||
| 51 | template< rewind_mode M, | ||
| 52 | template< typename... > class Action, | ||
| 53 | template< typename... > class Control, | ||
| 54 | typename Input, | ||
| 55 | typename... States > | ||
| 56 | static bool match( Input& in, States&&... st ) | ||
| 57 | { | ||
| 58 | return Control< Rule >::template match< apply_mode::NOTHING, M, Action, Control >( in, st... ); | ||
| 59 | } | ||
| 60 | }; | ||
| 61 | |||
| 62 | template< typename Rule, typename... Actions > | ||
| 63 | struct if_apply | ||
| 64 | { | ||
| 65 | using analyze_t = typename Rule::analyze_t; | ||
| 66 | |||
| 67 | template< apply_mode A, | ||
| 68 | rewind_mode M, | ||
| 69 | template< typename... > class Action, | ||
| 70 | template< typename... > class Control, | ||
| 71 | typename Input, | ||
| 72 | typename... States > | ||
| 73 | static bool match( Input& in, States&&... st ) | ||
| 74 | { | ||
| 75 | return if_apply_impl< A, Rule, Actions... >::template match< M, Action, Control >( in, st... ); | ||
| 76 | } | ||
| 77 | }; | ||
| 78 | |||
| 79 | template< typename Rule, typename... Actions > | ||
| 80 | struct skip_control< if_apply< Rule, Actions... > > : std::true_type | ||
| 81 | { | ||
| 82 | }; | ||
| 83 | |||
| 84 | } // namespace internal | ||
| 85 | |||
| 86 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 87 | |||
| 88 | } // namespace tao | ||
| 89 | |||
| 90 | #endif | ||
diff --git a/MoonParser/pegtl/internal/if_must.hpp b/MoonParser/pegtl/internal/if_must.hpp new file mode 100644 index 0000000..2a56d7e --- /dev/null +++ b/MoonParser/pegtl/internal/if_must.hpp | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_IF_MUST_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_IF_MUST_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "must.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | namespace internal | ||
| 17 | { | ||
| 18 | template< typename Cond, typename... Thens > | ||
| 19 | using if_must = seq< Cond, must< Thens... > >; | ||
| 20 | |||
| 21 | } // namespace internal | ||
| 22 | |||
| 23 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | |||
| 25 | } // namespace tao | ||
| 26 | |||
| 27 | #endif | ||
diff --git a/MoonParser/pegtl/internal/if_must_else.hpp b/MoonParser/pegtl/internal/if_must_else.hpp new file mode 100644 index 0000000..2ccb205 --- /dev/null +++ b/MoonParser/pegtl/internal/if_must_else.hpp | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_IF_MUST_ELSE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_IF_MUST_ELSE_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "if_then_else.hpp" | ||
| 10 | #include "must.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | namespace internal | ||
| 17 | { | ||
| 18 | template< typename Cond, typename Then, typename Else > | ||
| 19 | using if_must_else = if_then_else< Cond, must< Then >, must< Else > >; | ||
| 20 | |||
| 21 | } // namespace internal | ||
| 22 | |||
| 23 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | |||
| 25 | } // namespace tao | ||
| 26 | |||
| 27 | #endif | ||
diff --git a/MoonParser/pegtl/internal/if_then_else.hpp b/MoonParser/pegtl/internal/if_then_else.hpp new file mode 100644 index 0000000..e55831f --- /dev/null +++ b/MoonParser/pegtl/internal/if_then_else.hpp | |||
| @@ -0,0 +1,59 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_IF_THEN_ELSE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_IF_THEN_ELSE_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "not_at.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | #include "skip_control.hpp" | ||
| 12 | #include "sor.hpp" | ||
| 13 | |||
| 14 | #include "../apply_mode.hpp" | ||
| 15 | #include "../rewind_mode.hpp" | ||
| 16 | |||
| 17 | #include "../analysis/generic.hpp" | ||
| 18 | |||
| 19 | namespace tao | ||
| 20 | { | ||
| 21 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 22 | { | ||
| 23 | namespace internal | ||
| 24 | { | ||
| 25 | template< typename Cond, typename Then, typename Else > | ||
| 26 | struct if_then_else | ||
| 27 | { | ||
| 28 | using analyze_t = analysis::generic< analysis::rule_type::SOR, seq< Cond, Then >, seq< not_at< Cond >, Else > >; | ||
| 29 | |||
| 30 | template< apply_mode A, | ||
| 31 | rewind_mode M, | ||
| 32 | template< typename... > class Action, | ||
| 33 | template< typename... > class Control, | ||
| 34 | typename Input, | ||
| 35 | typename... States > | ||
| 36 | static bool match( Input& in, States&&... st ) | ||
| 37 | { | ||
| 38 | auto m = in.template mark< M >(); | ||
| 39 | using m_t = decltype( m ); | ||
| 40 | |||
| 41 | if( Control< Cond >::template match< A, rewind_mode::REQUIRED, Action, Control >( in, st... ) ) { | ||
| 42 | return m( Control< Then >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ); | ||
| 43 | } | ||
| 44 | return m( Control< Else >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ); | ||
| 45 | } | ||
| 46 | }; | ||
| 47 | |||
| 48 | template< typename Cond, typename Then, typename Else > | ||
| 49 | struct skip_control< if_then_else< Cond, Then, Else > > : std::true_type | ||
| 50 | { | ||
| 51 | }; | ||
| 52 | |||
| 53 | } // namespace internal | ||
| 54 | |||
| 55 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 56 | |||
| 57 | } // namespace tao | ||
| 58 | |||
| 59 | #endif | ||
diff --git a/MoonParser/pegtl/internal/input_pair.hpp b/MoonParser/pegtl/internal/input_pair.hpp new file mode 100644 index 0000000..de4e6ba --- /dev/null +++ b/MoonParser/pegtl/internal/input_pair.hpp | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_INPUT_PAIR_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_INPUT_PAIR_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | namespace internal | ||
| 14 | { | ||
| 15 | template< typename Data > | ||
| 16 | struct input_pair | ||
| 17 | { | ||
| 18 | Data data; | ||
| 19 | unsigned char size; | ||
| 20 | |||
| 21 | using data_t = Data; | ||
| 22 | |||
| 23 | explicit operator bool() const noexcept | ||
| 24 | { | ||
| 25 | return size > 0; | ||
| 26 | } | ||
| 27 | }; | ||
| 28 | |||
| 29 | } // namespace internal | ||
| 30 | |||
| 31 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 32 | |||
| 33 | } // namespace tao | ||
| 34 | |||
| 35 | #endif | ||
diff --git a/MoonParser/pegtl/internal/integer_sequence.hpp b/MoonParser/pegtl/internal/integer_sequence.hpp new file mode 100644 index 0000000..cdcf20d --- /dev/null +++ b/MoonParser/pegtl/internal/integer_sequence.hpp | |||
| @@ -0,0 +1,85 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_INTEGER_SEQUENCE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_INTEGER_SEQUENCE_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | #include <type_traits> | ||
| 9 | #include <utility> | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | template< typename T, T... Ns > | ||
| 18 | struct integer_sequence | ||
| 19 | { | ||
| 20 | using value_type = T; | ||
| 21 | |||
| 22 | static constexpr std::size_t size() noexcept | ||
| 23 | { | ||
| 24 | return sizeof...( Ns ); | ||
| 25 | } | ||
| 26 | }; | ||
| 27 | |||
| 28 | template< std::size_t... Ns > | ||
| 29 | using index_sequence = integer_sequence< std::size_t, Ns... >; | ||
| 30 | |||
| 31 | template< typename, std::size_t, bool > | ||
| 32 | struct double_up; | ||
| 33 | |||
| 34 | template< typename T, T... Ns, std::size_t N > | ||
| 35 | struct double_up< integer_sequence< T, Ns... >, N, false > | ||
| 36 | { | ||
| 37 | using type = integer_sequence< T, Ns..., ( N + Ns )... >; | ||
| 38 | }; | ||
| 39 | |||
| 40 | template< typename T, T... Ns, std::size_t N > | ||
| 41 | struct double_up< integer_sequence< T, Ns... >, N, true > | ||
| 42 | { | ||
| 43 | using type = integer_sequence< T, Ns..., ( N + Ns )..., 2 * N >; | ||
| 44 | }; | ||
| 45 | |||
| 46 | template< typename T, T N, typename = void > | ||
| 47 | struct generate_sequence; | ||
| 48 | |||
| 49 | template< typename T, T N > | ||
| 50 | using generate_sequence_t = typename generate_sequence< T, N >::type; | ||
| 51 | |||
| 52 | template< typename T, T N, typename > | ||
| 53 | struct generate_sequence | ||
| 54 | : double_up< generate_sequence_t< T, N / 2 >, N / 2, N % 2 == 1 > | ||
| 55 | { | ||
| 56 | }; | ||
| 57 | |||
| 58 | template< typename T, T N > | ||
| 59 | struct generate_sequence< T, N, typename std::enable_if< ( N == 0 ) >::type > | ||
| 60 | { | ||
| 61 | using type = integer_sequence< T >; | ||
| 62 | }; | ||
| 63 | |||
| 64 | template< typename T, T N > | ||
| 65 | struct generate_sequence< T, N, typename std::enable_if< ( N == 1 ) >::type > | ||
| 66 | { | ||
| 67 | using type = integer_sequence< T, 0 >; | ||
| 68 | }; | ||
| 69 | |||
| 70 | template< typename T, T N > | ||
| 71 | using make_integer_sequence = generate_sequence_t< T, N >; | ||
| 72 | |||
| 73 | template< std::size_t N > | ||
| 74 | using make_index_sequence = make_integer_sequence< std::size_t, N >; | ||
| 75 | |||
| 76 | template< typename... Ts > | ||
| 77 | using index_sequence_for = make_index_sequence< sizeof...( Ts ) >; | ||
| 78 | |||
| 79 | } // namespace internal | ||
| 80 | |||
| 81 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 82 | |||
| 83 | } // namespace tao | ||
| 84 | |||
| 85 | #endif | ||
diff --git a/MoonParser/pegtl/internal/istream_reader.hpp b/MoonParser/pegtl/internal/istream_reader.hpp new file mode 100644 index 0000000..8509080 --- /dev/null +++ b/MoonParser/pegtl/internal/istream_reader.hpp | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_ISTREAM_READER_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_ISTREAM_READER_HPP | ||
| 6 | |||
| 7 | #include <istream> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | #include "../input_error.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | namespace internal | ||
| 17 | { | ||
| 18 | struct istream_reader | ||
| 19 | { | ||
| 20 | explicit istream_reader( std::istream& s ) noexcept | ||
| 21 | : m_istream( s ) | ||
| 22 | { | ||
| 23 | } | ||
| 24 | |||
| 25 | std::size_t operator()( char* buffer, const std::size_t length ) | ||
| 26 | { | ||
| 27 | m_istream.read( buffer, std::streamsize( length ) ); | ||
| 28 | |||
| 29 | if( const auto r = m_istream.gcount() ) { | ||
| 30 | return std::size_t( r ); | ||
| 31 | } | ||
| 32 | if( m_istream.eof() ) { | ||
| 33 | return 0; | ||
| 34 | } | ||
| 35 | TAOCPP_PEGTL_THROW_INPUT_ERROR( "error in istream.read()" ); | ||
| 36 | } | ||
| 37 | |||
| 38 | std::istream& m_istream; | ||
| 39 | }; | ||
| 40 | |||
| 41 | } // namespace internal | ||
| 42 | |||
| 43 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 44 | |||
| 45 | } // namespace tao | ||
| 46 | |||
| 47 | #endif | ||
diff --git a/MoonParser/pegtl/internal/istring.hpp b/MoonParser/pegtl/internal/istring.hpp new file mode 100644 index 0000000..3ed2835 --- /dev/null +++ b/MoonParser/pegtl/internal/istring.hpp | |||
| @@ -0,0 +1,107 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_ISTRING_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_ISTRING_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | #include "bump_help.hpp" | ||
| 12 | #include "result_on_found.hpp" | ||
| 13 | #include "skip_control.hpp" | ||
| 14 | #include "trivial.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/counted.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< char C > | ||
| 25 | using is_alpha = std::integral_constant< bool, ( ( 'a' <= C ) && ( C <= 'z' ) ) || ( ( 'A' <= C ) && ( C <= 'Z' ) ) >; | ||
| 26 | |||
| 27 | template< char C, bool A = is_alpha< C >::value > | ||
| 28 | struct ichar_equal; | ||
| 29 | |||
| 30 | template< char C > | ||
| 31 | struct ichar_equal< C, true > | ||
| 32 | { | ||
| 33 | static bool match( const char c ) noexcept | ||
| 34 | { | ||
| 35 | return ( C | 0x20 ) == ( c | 0x20 ); | ||
| 36 | } | ||
| 37 | }; | ||
| 38 | |||
| 39 | template< char C > | ||
| 40 | struct ichar_equal< C, false > | ||
| 41 | { | ||
| 42 | static bool match( const char c ) noexcept | ||
| 43 | { | ||
| 44 | return c == C; | ||
| 45 | } | ||
| 46 | }; | ||
| 47 | |||
| 48 | template< char... Cs > | ||
| 49 | struct istring_equal; | ||
| 50 | |||
| 51 | template<> | ||
| 52 | struct istring_equal<> | ||
| 53 | { | ||
| 54 | static bool match( const char* ) noexcept | ||
| 55 | { | ||
| 56 | return true; | ||
| 57 | } | ||
| 58 | }; | ||
| 59 | |||
| 60 | template< char C, char... Cs > | ||
| 61 | struct istring_equal< C, Cs... > | ||
| 62 | { | ||
| 63 | static bool match( const char* r ) noexcept | ||
| 64 | { | ||
| 65 | return ichar_equal< C >::match( *r ) && istring_equal< Cs... >::match( r + 1 ); | ||
| 66 | } | ||
| 67 | }; | ||
| 68 | |||
| 69 | template< char... Cs > | ||
| 70 | struct istring; | ||
| 71 | |||
| 72 | template<> | ||
| 73 | struct istring<> | ||
| 74 | : trivial< true > | ||
| 75 | { | ||
| 76 | }; | ||
| 77 | |||
| 78 | template< char... Cs > | ||
| 79 | struct istring | ||
| 80 | { | ||
| 81 | using analyze_t = analysis::counted< analysis::rule_type::ANY, sizeof...( Cs ) >; | ||
| 82 | |||
| 83 | template< typename Input > | ||
| 84 | static bool match( Input& in ) | ||
| 85 | { | ||
| 86 | if( in.size( sizeof...( Cs ) ) >= sizeof...( Cs ) ) { | ||
| 87 | if( istring_equal< Cs... >::match( in.current() ) ) { | ||
| 88 | bump_help< result_on_found::SUCCESS, Input, char, Cs... >( in, sizeof...( Cs ) ); | ||
| 89 | return true; | ||
| 90 | } | ||
| 91 | } | ||
| 92 | return false; | ||
| 93 | } | ||
| 94 | }; | ||
| 95 | |||
| 96 | template< char... Cs > | ||
| 97 | struct skip_control< istring< Cs... > > : std::true_type | ||
| 98 | { | ||
| 99 | }; | ||
| 100 | |||
| 101 | } // namespace internal | ||
| 102 | |||
| 103 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 104 | |||
| 105 | } // namespace tao | ||
| 106 | |||
| 107 | #endif | ||
diff --git a/MoonParser/pegtl/internal/iterator.hpp b/MoonParser/pegtl/internal/iterator.hpp new file mode 100644 index 0000000..4179738 --- /dev/null +++ b/MoonParser/pegtl/internal/iterator.hpp | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_ITERATOR_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_ITERATOR_HPP | ||
| 6 | |||
| 7 | #include <cstdlib> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | struct iterator | ||
| 18 | { | ||
| 19 | iterator() noexcept = default; | ||
| 20 | |||
| 21 | explicit iterator( const char* in_data ) noexcept | ||
| 22 | : data( in_data ), | ||
| 23 | byte( 0 ), | ||
| 24 | line( 1 ), | ||
| 25 | byte_in_line( 0 ) | ||
| 26 | { | ||
| 27 | } | ||
| 28 | |||
| 29 | iterator( const char* in_data, const std::size_t in_byte, const std::size_t in_line, const std::size_t in_byte_in_line ) noexcept | ||
| 30 | : data( in_data ), | ||
| 31 | byte( in_byte ), | ||
| 32 | line( in_line ), | ||
| 33 | byte_in_line( in_byte_in_line ) | ||
| 34 | { | ||
| 35 | } | ||
| 36 | |||
| 37 | iterator( const iterator& ) = default; | ||
| 38 | iterator& operator=( const iterator& ) = default; | ||
| 39 | |||
| 40 | const char* data; | ||
| 41 | |||
| 42 | std::size_t byte; | ||
| 43 | std::size_t line; | ||
| 44 | std::size_t byte_in_line; | ||
| 45 | }; | ||
| 46 | |||
| 47 | } // namespace internal | ||
| 48 | |||
| 49 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 50 | |||
| 51 | } // namespace tao | ||
| 52 | |||
| 53 | #endif | ||
diff --git a/MoonParser/pegtl/internal/lf_crlf_eol.hpp b/MoonParser/pegtl/internal/lf_crlf_eol.hpp new file mode 100644 index 0000000..90b5b03 --- /dev/null +++ b/MoonParser/pegtl/internal/lf_crlf_eol.hpp | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_LF_CRLF_EOL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_LF_CRLF_EOL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | namespace internal | ||
| 14 | { | ||
| 15 | struct lf_crlf_eol | ||
| 16 | { | ||
| 17 | static constexpr int ch = '\n'; | ||
| 18 | |||
| 19 | template< typename Input > | ||
| 20 | static eol_pair match( Input& in ) | ||
| 21 | { | ||
| 22 | eol_pair p = { false, in.size( 2 ) }; | ||
| 23 | if( p.second ) { | ||
| 24 | const auto a = in.peek_char(); | ||
| 25 | if( a == '\n' ) { | ||
| 26 | in.bump_to_next_line(); | ||
| 27 | p.first = true; | ||
| 28 | } | ||
| 29 | else if( ( a == '\r' ) && ( p.second > 1 ) && ( in.peek_char( 1 ) == '\n' ) ) { | ||
| 30 | in.bump_to_next_line( 2 ); | ||
| 31 | p.first = true; | ||
| 32 | } | ||
| 33 | } | ||
| 34 | return p; | ||
| 35 | } | ||
| 36 | }; | ||
| 37 | |||
| 38 | } // namespace internal | ||
| 39 | |||
| 40 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 41 | |||
| 42 | } // namespace tao | ||
| 43 | |||
| 44 | #endif | ||
diff --git a/MoonParser/pegtl/internal/lf_eol.hpp b/MoonParser/pegtl/internal/lf_eol.hpp new file mode 100644 index 0000000..438b8f0 --- /dev/null +++ b/MoonParser/pegtl/internal/lf_eol.hpp | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_LF_EOL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_LF_EOL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | namespace internal | ||
| 14 | { | ||
| 15 | struct lf_eol | ||
| 16 | { | ||
| 17 | static constexpr int ch = '\n'; | ||
| 18 | |||
| 19 | template< typename Input > | ||
| 20 | static eol_pair match( Input& in ) | ||
| 21 | { | ||
| 22 | eol_pair p = { false, in.size( 1 ) }; | ||
| 23 | if( p.second ) { | ||
| 24 | if( in.peek_char() == '\n' ) { | ||
| 25 | in.bump_to_next_line(); | ||
| 26 | p.first = true; | ||
| 27 | } | ||
| 28 | } | ||
| 29 | return p; | ||
| 30 | } | ||
| 31 | }; | ||
| 32 | |||
| 33 | } // namespace internal | ||
| 34 | |||
| 35 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 36 | |||
| 37 | } // namespace tao | ||
| 38 | |||
| 39 | #endif | ||
diff --git a/MoonParser/pegtl/internal/list.hpp b/MoonParser/pegtl/internal/list.hpp new file mode 100644 index 0000000..1a812fb --- /dev/null +++ b/MoonParser/pegtl/internal/list.hpp | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_LIST_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_LIST_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "seq.hpp" | ||
| 10 | #include "star.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | namespace internal | ||
| 17 | { | ||
| 18 | template< typename Rule, typename Sep > | ||
| 19 | using list = seq< Rule, star< Sep, Rule > >; | ||
| 20 | |||
| 21 | } // namespace internal | ||
| 22 | |||
| 23 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | |||
| 25 | } // namespace tao | ||
| 26 | |||
| 27 | #endif | ||
diff --git a/MoonParser/pegtl/internal/list_must.hpp b/MoonParser/pegtl/internal/list_must.hpp new file mode 100644 index 0000000..9b60311 --- /dev/null +++ b/MoonParser/pegtl/internal/list_must.hpp | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_LIST_MUST_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_LIST_MUST_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "must.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | #include "star.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | template< typename Rule, typename Sep > | ||
| 20 | using list_must = seq< Rule, star< Sep, must< Rule > > >; | ||
| 21 | |||
| 22 | } // namespace internal | ||
| 23 | |||
| 24 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 25 | |||
| 26 | } // namespace tao | ||
| 27 | |||
| 28 | #endif | ||
diff --git a/MoonParser/pegtl/internal/list_tail.hpp b/MoonParser/pegtl/internal/list_tail.hpp new file mode 100644 index 0000000..dd7b920 --- /dev/null +++ b/MoonParser/pegtl/internal/list_tail.hpp | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_LIST_TAIL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_LIST_TAIL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "list.hpp" | ||
| 10 | #include "opt.hpp" | ||
| 11 | #include "seq.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | template< typename Rule, typename Sep > | ||
| 20 | using list_tail = seq< list< Rule, Sep >, opt< Sep > >; | ||
| 21 | |||
| 22 | } // namespace internal | ||
| 23 | |||
| 24 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 25 | |||
| 26 | } // namespace tao | ||
| 27 | |||
| 28 | #endif | ||
diff --git a/MoonParser/pegtl/internal/list_tail_pad.hpp b/MoonParser/pegtl/internal/list_tail_pad.hpp new file mode 100644 index 0000000..0f3ebf6 --- /dev/null +++ b/MoonParser/pegtl/internal/list_tail_pad.hpp | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_LIST_TAIL_PAD_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_LIST_TAIL_PAD_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "list.hpp" | ||
| 10 | #include "opt.hpp" | ||
| 11 | #include "pad.hpp" | ||
| 12 | #include "seq.hpp" | ||
| 13 | #include "star.hpp" | ||
| 14 | |||
| 15 | namespace tao | ||
| 16 | { | ||
| 17 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 18 | { | ||
| 19 | namespace internal | ||
| 20 | { | ||
| 21 | template< typename Rule, typename Sep, typename Pad > | ||
| 22 | using list_tail_pad = seq< list< Rule, pad< Sep, Pad > >, opt< star< Pad >, Sep > >; | ||
| 23 | |||
| 24 | } // namespace internal | ||
| 25 | |||
| 26 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 27 | |||
| 28 | } // namespace tao | ||
| 29 | |||
| 30 | #endif | ||
diff --git a/MoonParser/pegtl/internal/marker.hpp b/MoonParser/pegtl/internal/marker.hpp new file mode 100644 index 0000000..76cba0e --- /dev/null +++ b/MoonParser/pegtl/internal/marker.hpp | |||
| @@ -0,0 +1,93 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_MARKER_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_MARKER_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | #include "../rewind_mode.hpp" | ||
| 9 | |||
| 10 | namespace tao | ||
| 11 | { | ||
| 12 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 13 | { | ||
| 14 | namespace internal | ||
| 15 | { | ||
| 16 | template< typename Iterator, rewind_mode M > | ||
| 17 | class marker | ||
| 18 | { | ||
| 19 | public: | ||
| 20 | static constexpr rewind_mode next_rewind_mode = M; | ||
| 21 | |||
| 22 | explicit marker( const Iterator& ) noexcept | ||
| 23 | { | ||
| 24 | } | ||
| 25 | |||
| 26 | marker( marker&& ) noexcept | ||
| 27 | { | ||
| 28 | } | ||
| 29 | |||
| 30 | marker( const marker& ) = delete; | ||
| 31 | void operator=( const marker& ) = delete; | ||
| 32 | |||
| 33 | bool operator()( const bool result ) const noexcept | ||
| 34 | { | ||
| 35 | return result; | ||
| 36 | } | ||
| 37 | }; | ||
| 38 | |||
| 39 | template< typename Iterator > | ||
| 40 | class marker< Iterator, rewind_mode::REQUIRED > | ||
| 41 | { | ||
| 42 | public: | ||
| 43 | static constexpr rewind_mode next_rewind_mode = rewind_mode::ACTIVE; | ||
| 44 | |||
| 45 | explicit marker( Iterator& i ) noexcept | ||
| 46 | : m_saved( i ), | ||
| 47 | m_input( &i ) | ||
| 48 | { | ||
| 49 | } | ||
| 50 | |||
| 51 | marker( marker&& i ) noexcept | ||
| 52 | : m_saved( i.m_saved ), | ||
| 53 | m_input( i.m_input ) | ||
| 54 | { | ||
| 55 | i.m_input = nullptr; | ||
| 56 | } | ||
| 57 | |||
| 58 | ~marker() noexcept | ||
| 59 | { | ||
| 60 | if( m_input != nullptr ) { | ||
| 61 | ( *m_input ) = m_saved; | ||
| 62 | } | ||
| 63 | } | ||
| 64 | |||
| 65 | marker( const marker& ) = delete; | ||
| 66 | void operator=( const marker& ) = delete; | ||
| 67 | |||
| 68 | bool operator()( const bool result ) noexcept | ||
| 69 | { | ||
| 70 | if( result ) { | ||
| 71 | m_input = nullptr; | ||
| 72 | return true; | ||
| 73 | } | ||
| 74 | return false; | ||
| 75 | } | ||
| 76 | |||
| 77 | const Iterator& iterator() const noexcept | ||
| 78 | { | ||
| 79 | return m_saved; | ||
| 80 | } | ||
| 81 | |||
| 82 | private: | ||
| 83 | const Iterator m_saved; | ||
| 84 | Iterator* m_input; | ||
| 85 | }; | ||
| 86 | |||
| 87 | } // namespace internal | ||
| 88 | |||
| 89 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 90 | |||
| 91 | } // namespace tao | ||
| 92 | |||
| 93 | #endif | ||
diff --git a/MoonParser/pegtl/internal/minus.hpp b/MoonParser/pegtl/internal/minus.hpp new file mode 100644 index 0000000..88242e5 --- /dev/null +++ b/MoonParser/pegtl/internal/minus.hpp | |||
| @@ -0,0 +1,69 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_MINUS_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_MINUS_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | #include "../apply_mode.hpp" | ||
| 12 | #include "../memory_input.hpp" | ||
| 13 | #include "../rewind_mode.hpp" | ||
| 14 | |||
| 15 | namespace tao | ||
| 16 | { | ||
| 17 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 18 | { | ||
| 19 | namespace internal | ||
| 20 | { | ||
| 21 | inline const char* source_pointer( const char* source ) noexcept | ||
| 22 | { | ||
| 23 | return source; | ||
| 24 | } | ||
| 25 | |||
| 26 | inline const char* source_pointer( const std::string& source ) noexcept | ||
| 27 | { | ||
| 28 | return source.c_str(); | ||
| 29 | } | ||
| 30 | |||
| 31 | template< typename R, typename S > | ||
| 32 | struct minus | ||
| 33 | { | ||
| 34 | using analyze_t = typename R::analyze_t; // NOTE: S is currently ignored for analyze(). | ||
| 35 | |||
| 36 | template< apply_mode A, | ||
| 37 | rewind_mode, | ||
| 38 | template< typename... > class Action, | ||
| 39 | template< typename... > class Control, | ||
| 40 | typename Input, | ||
| 41 | typename... States > | ||
| 42 | static bool match( Input& in, States&&... st ) | ||
| 43 | { | ||
| 44 | auto m = in.template mark< rewind_mode::REQUIRED >(); | ||
| 45 | |||
| 46 | if( !Control< R >::template match< A, rewind_mode::ACTIVE, Action, Control >( in, st... ) ) { | ||
| 47 | return false; | ||
| 48 | } | ||
| 49 | memory_input< tracking_mode::LAZY, typename Input::eol_t, const char* > i2( m.iterator(), in.current(), source_pointer( in.source() ) ); | ||
| 50 | |||
| 51 | if( !Control< S >::template match< apply_mode::NOTHING, rewind_mode::ACTIVE, Action, Control >( i2, st... ) ) { | ||
| 52 | return m( true ); | ||
| 53 | } | ||
| 54 | return m( !i2.empty() ); | ||
| 55 | } | ||
| 56 | }; | ||
| 57 | |||
| 58 | template< typename R, typename S > | ||
| 59 | struct skip_control< minus< R, S > > : std::true_type | ||
| 60 | { | ||
| 61 | }; | ||
| 62 | |||
| 63 | } // namespace internal | ||
| 64 | |||
| 65 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 66 | |||
| 67 | } // namespace tao | ||
| 68 | |||
| 69 | #endif | ||
diff --git a/MoonParser/pegtl/internal/must.hpp b/MoonParser/pegtl/internal/must.hpp new file mode 100644 index 0000000..4ac9920 --- /dev/null +++ b/MoonParser/pegtl/internal/must.hpp | |||
| @@ -0,0 +1,79 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_MUST_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_MUST_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "raise.hpp" | ||
| 10 | #include "rule_conjunction.hpp" | ||
| 11 | #include "skip_control.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | // The general case applies must<> to each of the | ||
| 25 | // rules in the 'Rules' parameter pack individually. | ||
| 26 | |||
| 27 | template< typename... Rules > | ||
| 28 | struct must | ||
| 29 | { | ||
| 30 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rules... >; | ||
| 31 | |||
| 32 | template< apply_mode A, | ||
| 33 | rewind_mode M, | ||
| 34 | template< typename... > class Action, | ||
| 35 | template< typename... > class Control, | ||
| 36 | typename Input, | ||
| 37 | typename... States > | ||
| 38 | static bool match( Input& in, States&&... st ) | ||
| 39 | { | ||
| 40 | return rule_conjunction< must< Rules >... >::template match< A, M, Action, Control >( in, st... ); | ||
| 41 | } | ||
| 42 | }; | ||
| 43 | |||
| 44 | // While in theory the implementation for a single rule could | ||
| 45 | // be simplified to must< Rule > = sor< Rule, raise< Rule > >, this | ||
| 46 | // would result in some unnecessary run-time overhead. | ||
| 47 | |||
| 48 | template< typename Rule > | ||
| 49 | struct must< Rule > | ||
| 50 | { | ||
| 51 | using analyze_t = typename Rule::analyze_t; | ||
| 52 | |||
| 53 | template< apply_mode A, | ||
| 54 | rewind_mode, | ||
| 55 | template< typename... > class Action, | ||
| 56 | template< typename... > class Control, | ||
| 57 | typename Input, | ||
| 58 | typename... States > | ||
| 59 | static bool match( Input& in, States&&... st ) | ||
| 60 | { | ||
| 61 | if( !Control< Rule >::template match< A, rewind_mode::DONTCARE, Action, Control >( in, st... ) ) { | ||
| 62 | raise< Rule >::template match< A, rewind_mode::DONTCARE, Action, Control >( in, st... ); | ||
| 63 | } | ||
| 64 | return true; | ||
| 65 | } | ||
| 66 | }; | ||
| 67 | |||
| 68 | template< typename... Rules > | ||
| 69 | struct skip_control< must< Rules... > > : std::true_type | ||
| 70 | { | ||
| 71 | }; | ||
| 72 | |||
| 73 | } // namespace internal | ||
| 74 | |||
| 75 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 76 | |||
| 77 | } // namespace tao | ||
| 78 | |||
| 79 | #endif | ||
diff --git a/MoonParser/pegtl/internal/not_at.hpp b/MoonParser/pegtl/internal/not_at.hpp new file mode 100644 index 0000000..ed80c56 --- /dev/null +++ b/MoonParser/pegtl/internal/not_at.hpp | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_NOT_AT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_NOT_AT_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "rule_conjunction.hpp" | ||
| 10 | #include "skip_control.hpp" | ||
| 11 | #include "trivial.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< typename... Rules > | ||
| 25 | struct not_at; | ||
| 26 | |||
| 27 | template<> | ||
| 28 | struct not_at<> | ||
| 29 | : trivial< false > | ||
| 30 | { | ||
| 31 | }; | ||
| 32 | |||
| 33 | template< typename... Rules > | ||
| 34 | struct not_at | ||
| 35 | { | ||
| 36 | using analyze_t = analysis::generic< analysis::rule_type::OPT, Rules... >; | ||
| 37 | |||
| 38 | template< apply_mode, | ||
| 39 | rewind_mode, | ||
| 40 | template< typename... > class Action, | ||
| 41 | template< typename... > class Control, | ||
| 42 | typename Input, | ||
| 43 | typename... States > | ||
| 44 | static bool match( Input& in, States&&... st ) | ||
| 45 | { | ||
| 46 | const auto m = in.template mark< rewind_mode::REQUIRED >(); | ||
| 47 | return !rule_conjunction< Rules... >::template match< apply_mode::NOTHING, rewind_mode::ACTIVE, Action, Control >( in, st... ); | ||
| 48 | } | ||
| 49 | }; | ||
| 50 | |||
| 51 | template< typename... Rules > | ||
| 52 | struct skip_control< not_at< Rules... > > : std::true_type | ||
| 53 | { | ||
| 54 | }; | ||
| 55 | |||
| 56 | } // namespace internal | ||
| 57 | |||
| 58 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 59 | |||
| 60 | } // namespace tao | ||
| 61 | |||
| 62 | #endif | ||
diff --git a/MoonParser/pegtl/internal/one.hpp b/MoonParser/pegtl/internal/one.hpp new file mode 100644 index 0000000..a3941eb --- /dev/null +++ b/MoonParser/pegtl/internal/one.hpp | |||
| @@ -0,0 +1,81 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_ONE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_ONE_HPP | ||
| 6 | |||
| 7 | #include <algorithm> | ||
| 8 | #include <utility> | ||
| 9 | |||
| 10 | #include "../config.hpp" | ||
| 11 | |||
| 12 | #include "bump_help.hpp" | ||
| 13 | #include "result_on_found.hpp" | ||
| 14 | #include "skip_control.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< typename Char > | ||
| 25 | bool contains( const Char c, const std::initializer_list< Char >& l ) noexcept | ||
| 26 | { | ||
| 27 | return std::find( l.begin(), l.end(), c ) != l.end(); | ||
| 28 | } | ||
| 29 | |||
| 30 | template< result_on_found R, typename Peek, typename Peek::data_t... Cs > | ||
| 31 | struct one | ||
| 32 | { | ||
| 33 | using analyze_t = analysis::generic< analysis::rule_type::ANY >; | ||
| 34 | |||
| 35 | template< typename Input > | ||
| 36 | static bool match( Input& in ) | ||
| 37 | { | ||
| 38 | if( !in.empty() ) { | ||
| 39 | if( const auto t = Peek::peek( in ) ) { | ||
| 40 | if( contains( t.data, { Cs... } ) == bool( R ) ) { | ||
| 41 | bump_help< R, Input, typename Peek::data_t, Cs... >( in, t.size ); | ||
| 42 | return true; | ||
| 43 | } | ||
| 44 | } | ||
| 45 | } | ||
| 46 | return false; | ||
| 47 | } | ||
| 48 | }; | ||
| 49 | |||
| 50 | template< result_on_found R, typename Peek, typename Peek::data_t C > | ||
| 51 | struct one< R, Peek, C > | ||
| 52 | { | ||
| 53 | using analyze_t = analysis::generic< analysis::rule_type::ANY >; | ||
| 54 | |||
| 55 | template< typename Input > | ||
| 56 | static bool match( Input& in ) | ||
| 57 | { | ||
| 58 | if( !in.empty() ) { | ||
| 59 | if( const auto t = Peek::peek( in ) ) { | ||
| 60 | if( ( t.data == C ) == bool( R ) ) { | ||
| 61 | bump_help< R, Input, typename Peek::data_t, C >( in, t.size ); | ||
| 62 | return true; | ||
| 63 | } | ||
| 64 | } | ||
| 65 | } | ||
| 66 | return false; | ||
| 67 | } | ||
| 68 | }; | ||
| 69 | |||
| 70 | template< result_on_found R, typename Peek, typename Peek::data_t... Cs > | ||
| 71 | struct skip_control< one< R, Peek, Cs... > > : std::true_type | ||
| 72 | { | ||
| 73 | }; | ||
| 74 | |||
| 75 | } // namespace internal | ||
| 76 | |||
| 77 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 78 | |||
| 79 | } // namespace tao | ||
| 80 | |||
| 81 | #endif | ||
diff --git a/MoonParser/pegtl/internal/opt.hpp b/MoonParser/pegtl/internal/opt.hpp new file mode 100644 index 0000000..a897443 --- /dev/null +++ b/MoonParser/pegtl/internal/opt.hpp | |||
| @@ -0,0 +1,67 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_OPT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_OPT_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | #include "duseltronik.hpp" | ||
| 12 | #include "seq.hpp" | ||
| 13 | #include "skip_control.hpp" | ||
| 14 | #include "trivial.hpp" | ||
| 15 | |||
| 16 | #include "../apply_mode.hpp" | ||
| 17 | #include "../rewind_mode.hpp" | ||
| 18 | |||
| 19 | #include "../analysis/generic.hpp" | ||
| 20 | |||
| 21 | namespace tao | ||
| 22 | { | ||
| 23 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | { | ||
| 25 | namespace internal | ||
| 26 | { | ||
| 27 | template< typename... Rules > | ||
| 28 | struct opt; | ||
| 29 | |||
| 30 | template<> | ||
| 31 | struct opt<> | ||
| 32 | : trivial< true > | ||
| 33 | { | ||
| 34 | }; | ||
| 35 | |||
| 36 | template< typename... Rules > | ||
| 37 | struct opt | ||
| 38 | { | ||
| 39 | using analyze_t = analysis::generic< analysis::rule_type::OPT, Rules... >; | ||
| 40 | |||
| 41 | template< apply_mode A, | ||
| 42 | rewind_mode, | ||
| 43 | template< typename... > class Action, | ||
| 44 | template< typename... > class Control, | ||
| 45 | typename Input, | ||
| 46 | typename... States > | ||
| 47 | static bool match( Input& in, States&&... st ) | ||
| 48 | { | ||
| 49 | if( !in.empty() ) { | ||
| 50 | duseltronik< seq< Rules... >, A, rewind_mode::REQUIRED, Action, Control >::match( in, st... ); | ||
| 51 | } | ||
| 52 | return true; | ||
| 53 | } | ||
| 54 | }; | ||
| 55 | |||
| 56 | template< typename... Rules > | ||
| 57 | struct skip_control< opt< Rules... > > : std::true_type | ||
| 58 | { | ||
| 59 | }; | ||
| 60 | |||
| 61 | } // namespace internal | ||
| 62 | |||
| 63 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 64 | |||
| 65 | } // namespace tao | ||
| 66 | |||
| 67 | #endif | ||
diff --git a/MoonParser/pegtl/internal/pad.hpp b/MoonParser/pegtl/internal/pad.hpp new file mode 100644 index 0000000..fcb6e4f --- /dev/null +++ b/MoonParser/pegtl/internal/pad.hpp | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_PAD_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_PAD_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "seq.hpp" | ||
| 10 | #include "star.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | namespace internal | ||
| 17 | { | ||
| 18 | template< typename Rule, typename Pad1, typename Pad2 = Pad1 > | ||
| 19 | using pad = seq< star< Pad1 >, Rule, star< Pad2 > >; | ||
| 20 | |||
| 21 | } // namespace internal | ||
| 22 | |||
| 23 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | |||
| 25 | } // namespace tao | ||
| 26 | |||
| 27 | #endif | ||
diff --git a/MoonParser/pegtl/internal/pad_opt.hpp b/MoonParser/pegtl/internal/pad_opt.hpp new file mode 100644 index 0000000..4b7d400 --- /dev/null +++ b/MoonParser/pegtl/internal/pad_opt.hpp | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_PAD_OPT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_PAD_OPT_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "opt.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | #include "star.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | template< typename Rule, typename Pad > | ||
| 20 | using pad_opt = seq< star< Pad >, opt< Rule, star< Pad > > >; | ||
| 21 | |||
| 22 | } // namespace internal | ||
| 23 | |||
| 24 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 25 | |||
| 26 | } // namespace tao | ||
| 27 | |||
| 28 | #endif | ||
diff --git a/MoonParser/pegtl/internal/peek_char.hpp b/MoonParser/pegtl/internal/peek_char.hpp new file mode 100644 index 0000000..064e6da --- /dev/null +++ b/MoonParser/pegtl/internal/peek_char.hpp | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_PEEK_CHAR_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_PEEK_CHAR_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | |||
| 9 | #include "input_pair.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | struct peek_char | ||
| 18 | { | ||
| 19 | using data_t = char; | ||
| 20 | using pair_t = input_pair< char >; | ||
| 21 | |||
| 22 | template< typename Input > | ||
| 23 | static pair_t peek( Input& in, const std::size_t o = 0 ) | ||
| 24 | { | ||
| 25 | return { in.peek_char( o ), 1 }; | ||
| 26 | } | ||
| 27 | }; | ||
| 28 | |||
| 29 | } // namespace internal | ||
| 30 | |||
| 31 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 32 | |||
| 33 | } // namespace tao | ||
| 34 | |||
| 35 | #endif | ||
diff --git a/MoonParser/pegtl/internal/peek_utf16.hpp b/MoonParser/pegtl/internal/peek_utf16.hpp new file mode 100644 index 0000000..a643b1f --- /dev/null +++ b/MoonParser/pegtl/internal/peek_utf16.hpp | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_PEEK_UTF16_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_PEEK_UTF16_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | #include "input_pair.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | struct peek_utf16 | ||
| 20 | { | ||
| 21 | using data_t = char32_t; | ||
| 22 | using pair_t = input_pair< char32_t >; | ||
| 23 | |||
| 24 | using short_t = std::make_unsigned< char16_t >::type; | ||
| 25 | |||
| 26 | static_assert( sizeof( short_t ) == 2, "expected size 2 for 16bit value" ); | ||
| 27 | static_assert( sizeof( char16_t ) == 2, "expected size 2 for 16bit value" ); | ||
| 28 | |||
| 29 | template< typename Input > | ||
| 30 | static pair_t peek( Input& in ) | ||
| 31 | { | ||
| 32 | const std::size_t s = in.size( 4 ); | ||
| 33 | if( s >= 2 ) { | ||
| 34 | const char32_t t = *reinterpret_cast< const short_t* >( in.current() ); | ||
| 35 | if( ( t < 0xd800 ) || ( t > 0xdbff ) || ( s < 4 ) ) { | ||
| 36 | return { t, 2 }; | ||
| 37 | } | ||
| 38 | const char32_t u = *reinterpret_cast< const short_t* >( in.current() + 2 ); | ||
| 39 | if( ( u < 0xdc00 ) || ( u > 0xdfff ) ) { | ||
| 40 | return { t, 2 }; | ||
| 41 | } | ||
| 42 | return { ( ( ( t & 0x03ff ) << 10 ) | ( u & 0x03ff ) ) + 0x10000, 4 }; | ||
| 43 | } | ||
| 44 | return { 0, 0 }; | ||
| 45 | } | ||
| 46 | }; | ||
| 47 | |||
| 48 | } // namespace internal | ||
| 49 | |||
| 50 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 51 | |||
| 52 | } // namespace tao | ||
| 53 | |||
| 54 | #endif | ||
diff --git a/MoonParser/pegtl/internal/peek_utf32.hpp b/MoonParser/pegtl/internal/peek_utf32.hpp new file mode 100644 index 0000000..f082064 --- /dev/null +++ b/MoonParser/pegtl/internal/peek_utf32.hpp | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_PEEK_UTF32_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_PEEK_UTF32_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | #include "input_pair.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | struct peek_utf32 | ||
| 20 | { | ||
| 21 | using data_t = char32_t; | ||
| 22 | using pair_t = input_pair< char32_t >; | ||
| 23 | |||
| 24 | static_assert( sizeof( char32_t ) == 4, "expected size 4 for 32bit value" ); | ||
| 25 | |||
| 26 | template< typename Input > | ||
| 27 | static pair_t peek( Input& in ) | ||
| 28 | { | ||
| 29 | const std::size_t s = in.size( 4 ); | ||
| 30 | if( s >= 4 ) { | ||
| 31 | const char32_t t = *reinterpret_cast< const char32_t* >( in.current() ); | ||
| 32 | if( ( 0 <= t ) && ( t <= 0x10ffff ) ) { | ||
| 33 | return { t, 4 }; | ||
| 34 | } | ||
| 35 | } | ||
| 36 | return { 0, 0 }; | ||
| 37 | } | ||
| 38 | }; | ||
| 39 | |||
| 40 | } // namespace internal | ||
| 41 | |||
| 42 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 43 | |||
| 44 | } // namespace tao | ||
| 45 | |||
| 46 | #endif | ||
diff --git a/MoonParser/pegtl/internal/peek_utf8.hpp b/MoonParser/pegtl/internal/peek_utf8.hpp new file mode 100644 index 0000000..9ea0a0e --- /dev/null +++ b/MoonParser/pegtl/internal/peek_utf8.hpp | |||
| @@ -0,0 +1,88 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_PEEK_UTF8_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_PEEK_UTF8_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "input_pair.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | struct peek_utf8 | ||
| 18 | { | ||
| 19 | using data_t = char32_t; | ||
| 20 | using pair_t = input_pair< char32_t >; | ||
| 21 | |||
| 22 | template< typename Input > | ||
| 23 | static pair_t peek( Input& in ) | ||
| 24 | { | ||
| 25 | char32_t c0 = in.peek_byte(); | ||
| 26 | |||
| 27 | if( ( c0 & 0x80 ) == 0 ) { | ||
| 28 | return { c0, 1 }; | ||
| 29 | } | ||
| 30 | if( ( c0 & 0xE0 ) == 0xC0 ) { | ||
| 31 | if( in.size( 2 ) >= 2 ) { | ||
| 32 | const char32_t c1 = in.peek_byte( 1 ); | ||
| 33 | if( ( c1 & 0xC0 ) == 0x80 ) { | ||
| 34 | c0 &= 0x1F; | ||
| 35 | c0 <<= 6; | ||
| 36 | c0 |= ( c1 & 0x3F ); | ||
| 37 | if( c0 >= 0x80 ) { | ||
| 38 | return { c0, 2 }; | ||
| 39 | } | ||
| 40 | } | ||
| 41 | } | ||
| 42 | } | ||
| 43 | else if( ( c0 & 0xF0 ) == 0xE0 ) { | ||
| 44 | if( in.size( 3 ) >= 3 ) { | ||
| 45 | const char32_t c1 = in.peek_byte( 1 ); | ||
| 46 | const char32_t c2 = in.peek_byte( 2 ); | ||
| 47 | if( ( ( c1 & 0xC0 ) == 0x80 ) && ( ( c2 & 0xC0 ) == 0x80 ) ) { | ||
| 48 | c0 &= 0x0F; | ||
| 49 | c0 <<= 6; | ||
| 50 | c0 |= ( c1 & 0x3F ); | ||
| 51 | c0 <<= 6; | ||
| 52 | c0 |= ( c2 & 0x3F ); | ||
| 53 | if( c0 >= 0x800 ) { | ||
| 54 | return { c0, 3 }; | ||
| 55 | } | ||
| 56 | } | ||
| 57 | } | ||
| 58 | } | ||
| 59 | else if( ( c0 & 0xF8 ) == 0xF0 ) { | ||
| 60 | if( in.size( 4 ) >= 4 ) { | ||
| 61 | const char32_t c1 = in.peek_byte( 1 ); | ||
| 62 | const char32_t c2 = in.peek_byte( 2 ); | ||
| 63 | const char32_t c3 = in.peek_byte( 3 ); | ||
| 64 | if( ( ( c1 & 0xC0 ) == 0x80 ) && ( ( c2 & 0xC0 ) == 0x80 ) && ( ( c3 & 0xC0 ) == 0x80 ) ) { | ||
| 65 | c0 &= 0x07; | ||
| 66 | c0 <<= 6; | ||
| 67 | c0 |= ( c1 & 0x3F ); | ||
| 68 | c0 <<= 6; | ||
| 69 | c0 |= ( c2 & 0x3F ); | ||
| 70 | c0 <<= 6; | ||
| 71 | c0 |= ( c3 & 0x3F ); | ||
| 72 | if( c0 >= 0x10000 && c0 <= 0x10FFFF ) { | ||
| 73 | return { c0, 4 }; | ||
| 74 | } | ||
| 75 | } | ||
| 76 | } | ||
| 77 | } | ||
| 78 | return { 0, 0 }; | ||
| 79 | } | ||
| 80 | }; | ||
| 81 | |||
| 82 | } // namespace internal | ||
| 83 | |||
| 84 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 85 | |||
| 86 | } // namespace tao | ||
| 87 | |||
| 88 | #endif | ||
diff --git a/MoonParser/pegtl/internal/pegtl_string.hpp b/MoonParser/pegtl/internal/pegtl_string.hpp new file mode 100644 index 0000000..7c27fd8 --- /dev/null +++ b/MoonParser/pegtl/internal/pegtl_string.hpp | |||
| @@ -0,0 +1,98 @@ | |||
| 1 | // Copyright (c) 2015-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_TAOCPP_PEGTL_STRING_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_TAOCPP_PEGTL_STRING_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | #include <type_traits> | ||
| 9 | |||
| 10 | #include "../ascii.hpp" | ||
| 11 | #include "../config.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | // Inspired by https://github.com/irrequietus/typestring | ||
| 18 | // Rewritten and reduced to what is needed for the PEGTL | ||
| 19 | // and to work with Visual Studio 2015. | ||
| 20 | |||
| 21 | namespace internal | ||
| 22 | { | ||
| 23 | template< typename, typename, typename, typename, typename, typename, typename, typename > | ||
| 24 | struct string_join; | ||
| 25 | |||
| 26 | template< template< char... > class S, char... C0s, char... C1s, char... C2s, char... C3s, char... C4s, char... C5s, char... C6s, char... C7s > | ||
| 27 | struct string_join< S< C0s... >, S< C1s... >, S< C2s... >, S< C3s... >, S< C4s... >, S< C5s... >, S< C6s... >, S< C7s... > > | ||
| 28 | { | ||
| 29 | using type = S< C0s..., C1s..., C2s..., C3s..., C4s..., C5s..., C6s..., C7s... >; | ||
| 30 | }; | ||
| 31 | |||
| 32 | template< template< char... > class S, char, bool > | ||
| 33 | struct string_at | ||
| 34 | { | ||
| 35 | using type = S<>; | ||
| 36 | }; | ||
| 37 | |||
| 38 | template< template< char... > class S, char C > | ||
| 39 | struct string_at< S, C, true > | ||
| 40 | { | ||
| 41 | using type = S< C >; | ||
| 42 | }; | ||
| 43 | |||
| 44 | template< typename T, std::size_t S > | ||
| 45 | struct string_max_length | ||
| 46 | { | ||
| 47 | static_assert( S <= 512, "String longer than 512 (excluding terminating \\0)!" ); | ||
| 48 | using type = T; | ||
| 49 | }; | ||
| 50 | |||
| 51 | } // namespace internal | ||
| 52 | |||
| 53 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 54 | |||
| 55 | } // namespace tao | ||
| 56 | |||
| 57 | #define TAOCPP_PEGTL_INTERNAL_EMPTY() | ||
| 58 | #define TAOCPP_PEGTL_INTERNAL_DEFER( X ) X TAOCPP_PEGTL_INTERNAL_EMPTY() | ||
| 59 | #define TAOCPP_PEGTL_INTERNAL_EXPAND( ... ) __VA_ARGS__ | ||
| 60 | |||
| 61 | #define TAOCPP_PEGTL_INTERNAL_STRING_AT( S, x, n ) \ | ||
| 62 | tao::TAOCPP_PEGTL_NAMESPACE::internal::string_at< S, ( 0##n < sizeof( x ) ) ? x[ 0##n ] : 0, ( 0##n < sizeof( x ) - 1 ) >::type | ||
| 63 | |||
| 64 | #define TAOCPP_PEGTL_INTERNAL_JOIN_8( M, S, x, n ) \ | ||
| 65 | tao::TAOCPP_PEGTL_NAMESPACE::internal::string_join< TAOCPP_PEGTL_INTERNAL_DEFER( M )( S, x, n##0 ), \ | ||
| 66 | TAOCPP_PEGTL_INTERNAL_DEFER( M )( S, x, n##1 ), \ | ||
| 67 | TAOCPP_PEGTL_INTERNAL_DEFER( M )( S, x, n##2 ), \ | ||
| 68 | TAOCPP_PEGTL_INTERNAL_DEFER( M )( S, x, n##3 ), \ | ||
| 69 | TAOCPP_PEGTL_INTERNAL_DEFER( M )( S, x, n##4 ), \ | ||
| 70 | TAOCPP_PEGTL_INTERNAL_DEFER( M )( S, x, n##5 ), \ | ||
| 71 | TAOCPP_PEGTL_INTERNAL_DEFER( M )( S, x, n##6 ), \ | ||
| 72 | TAOCPP_PEGTL_INTERNAL_DEFER( M )( S, x, n##7 ) >::type | ||
| 73 | |||
| 74 | #define TAOCPP_PEGTL_INTERNAL_STRING_8( S, x, n ) \ | ||
| 75 | TAOCPP_PEGTL_INTERNAL_JOIN_8( TAOCPP_PEGTL_INTERNAL_STRING_AT, S, x, n ) | ||
| 76 | |||
| 77 | #define TAOCPP_PEGTL_INTERNAL_STRING_64( S, x, n ) \ | ||
| 78 | TAOCPP_PEGTL_INTERNAL_JOIN_8( TAOCPP_PEGTL_INTERNAL_STRING_8, S, x, n ) | ||
| 79 | |||
| 80 | #define TAOCPP_PEGTL_INTERNAL_STRING_512( S, x, n ) \ | ||
| 81 | TAOCPP_PEGTL_INTERNAL_JOIN_8( TAOCPP_PEGTL_INTERNAL_STRING_64, S, x, n ) | ||
| 82 | |||
| 83 | #define TAOCPP_PEGTL_INTERNAL_STRING( S, x ) \ | ||
| 84 | TAOCPP_PEGTL_INTERNAL_EXPAND( \ | ||
| 85 | TAOCPP_PEGTL_INTERNAL_EXPAND( \ | ||
| 86 | TAOCPP_PEGTL_INTERNAL_EXPAND( \ | ||
| 87 | tao::TAOCPP_PEGTL_NAMESPACE::internal::string_max_length< TAOCPP_PEGTL_INTERNAL_STRING_512( S, x, ), sizeof( x ) - 1 >::type ) ) ) | ||
| 88 | |||
| 89 | #define TAOCPP_PEGTL_STRING( x ) \ | ||
| 90 | TAOCPP_PEGTL_INTERNAL_STRING( tao::TAOCPP_PEGTL_NAMESPACE::ascii::string, x ) | ||
| 91 | |||
| 92 | #define TAOCPP_PEGTL_ISTRING( x ) \ | ||
| 93 | TAOCPP_PEGTL_INTERNAL_STRING( tao::TAOCPP_PEGTL_NAMESPACE::ascii::istring, x ) | ||
| 94 | |||
| 95 | #define TAOCPP_PEGTL_KEYWORD( x ) \ | ||
| 96 | TAOCPP_PEGTL_INTERNAL_STRING( tao::TAOCPP_PEGTL_NAMESPACE::ascii::keyword, x ) | ||
| 97 | |||
| 98 | #endif | ||
diff --git a/MoonParser/pegtl/internal/plus.hpp b/MoonParser/pegtl/internal/plus.hpp new file mode 100644 index 0000000..5adc1f8 --- /dev/null +++ b/MoonParser/pegtl/internal/plus.hpp | |||
| @@ -0,0 +1,61 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_PLUS_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_PLUS_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | #include "duseltronik.hpp" | ||
| 12 | #include "opt.hpp" | ||
| 13 | #include "seq.hpp" | ||
| 14 | #include "skip_control.hpp" | ||
| 15 | #include "star.hpp" | ||
| 16 | |||
| 17 | #include "../apply_mode.hpp" | ||
| 18 | #include "../rewind_mode.hpp" | ||
| 19 | |||
| 20 | #include "../analysis/generic.hpp" | ||
| 21 | |||
| 22 | namespace tao | ||
| 23 | { | ||
| 24 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 25 | { | ||
| 26 | namespace internal | ||
| 27 | { | ||
| 28 | // While plus<> could easily be implemented with | ||
| 29 | // seq< Rule, Rules ..., star< Rule, Rules ... > > we | ||
| 30 | // provide an explicit implementation to optimise away | ||
| 31 | // the otherwise created input mark. | ||
| 32 | |||
| 33 | template< typename Rule, typename... Rules > | ||
| 34 | struct plus | ||
| 35 | { | ||
| 36 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rule, Rules..., opt< plus > >; | ||
| 37 | |||
| 38 | template< apply_mode A, | ||
| 39 | rewind_mode M, | ||
| 40 | template< typename... > class Action, | ||
| 41 | template< typename... > class Control, | ||
| 42 | typename Input, | ||
| 43 | typename... States > | ||
| 44 | static bool match( Input& in, States&&... st ) | ||
| 45 | { | ||
| 46 | return duseltronik< seq< Rule, Rules... >, A, M, Action, Control >::match( in, st... ) && duseltronik< star< Rule, Rules... >, A, M, Action, Control >::match( in, st... ); | ||
| 47 | } | ||
| 48 | }; | ||
| 49 | |||
| 50 | template< typename Rule, typename... Rules > | ||
| 51 | struct skip_control< plus< Rule, Rules... > > : std::true_type | ||
| 52 | { | ||
| 53 | }; | ||
| 54 | |||
| 55 | } // namespace internal | ||
| 56 | |||
| 57 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 58 | |||
| 59 | } // namespace tao | ||
| 60 | |||
| 61 | #endif | ||
diff --git a/MoonParser/pegtl/internal/raise.hpp b/MoonParser/pegtl/internal/raise.hpp new file mode 100644 index 0000000..d183ce0 --- /dev/null +++ b/MoonParser/pegtl/internal/raise.hpp | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_RAISE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_RAISE_HPP | ||
| 6 | |||
| 7 | #include <cstdlib> | ||
| 8 | #include <type_traits> | ||
| 9 | |||
| 10 | #include "../config.hpp" | ||
| 11 | |||
| 12 | #include "skip_control.hpp" | ||
| 13 | |||
| 14 | #include "../analysis/generic.hpp" | ||
| 15 | #include "../apply_mode.hpp" | ||
| 16 | #include "../rewind_mode.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< typename T > | ||
| 25 | struct raise | ||
| 26 | { | ||
| 27 | using analyze_t = analysis::generic< analysis::rule_type::ANY >; | ||
| 28 | |||
| 29 | template< apply_mode, | ||
| 30 | rewind_mode, | ||
| 31 | template< typename... > class Action, | ||
| 32 | template< typename... > class Control, | ||
| 33 | typename Input, | ||
| 34 | typename... States > | ||
| 35 | static bool match( Input& in, States&&... st ) | ||
| 36 | { | ||
| 37 | Control< T >::raise( const_cast< const Input& >( in ), st... ); | ||
| 38 | #if defined( _MSC_VER ) | ||
| 39 | __assume( false ); // LCOV_EXCL_LINE | ||
| 40 | #else | ||
| 41 | std::abort(); // LCOV_EXCL_LINE | ||
| 42 | #endif | ||
| 43 | } | ||
| 44 | }; | ||
| 45 | |||
| 46 | template< typename T > | ||
| 47 | struct skip_control< raise< T > > : std::true_type | ||
| 48 | { | ||
| 49 | }; | ||
| 50 | |||
| 51 | } // namespace internal | ||
| 52 | |||
| 53 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 54 | |||
| 55 | } // namespace tao | ||
| 56 | |||
| 57 | #endif | ||
diff --git a/MoonParser/pegtl/internal/range.hpp b/MoonParser/pegtl/internal/range.hpp new file mode 100644 index 0000000..227595f --- /dev/null +++ b/MoonParser/pegtl/internal/range.hpp | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_RANGE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_RANGE_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "bump_help.hpp" | ||
| 10 | #include "result_on_found.hpp" | ||
| 11 | #include "skip_control.hpp" | ||
| 12 | |||
| 13 | #include "../analysis/generic.hpp" | ||
| 14 | |||
| 15 | namespace tao | ||
| 16 | { | ||
| 17 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 18 | { | ||
| 19 | namespace internal | ||
| 20 | { | ||
| 21 | template< result_on_found R, typename Peek, typename Peek::data_t Lo, typename Peek::data_t Hi > | ||
| 22 | struct range | ||
| 23 | { | ||
| 24 | using analyze_t = analysis::generic< analysis::rule_type::ANY >; | ||
| 25 | |||
| 26 | template< int Eol > | ||
| 27 | struct can_match_eol | ||
| 28 | { | ||
| 29 | static constexpr bool value = ( ( ( Lo <= Eol ) && ( Eol <= Hi ) ) == bool( R ) ); | ||
| 30 | }; | ||
| 31 | |||
| 32 | template< typename Input > | ||
| 33 | static bool match( Input& in ) | ||
| 34 | { | ||
| 35 | using eol_t = typename Input::eol_t; | ||
| 36 | |||
| 37 | if( !in.empty() ) { | ||
| 38 | if( const auto t = Peek::peek( in ) ) { | ||
| 39 | if( ( ( Lo <= t.data ) && ( t.data <= Hi ) ) == bool( R ) ) { | ||
| 40 | bump_impl< can_match_eol< eol_t::ch >::value >::bump( in, t.size ); | ||
| 41 | return true; | ||
| 42 | } | ||
| 43 | } | ||
| 44 | } | ||
| 45 | return false; | ||
| 46 | } | ||
| 47 | }; | ||
| 48 | |||
| 49 | template< result_on_found R, typename Peek, typename Peek::data_t Lo, typename Peek::data_t Hi > | ||
| 50 | struct skip_control< range< R, Peek, Lo, Hi > > : std::true_type | ||
| 51 | { | ||
| 52 | }; | ||
| 53 | |||
| 54 | } // namespace internal | ||
| 55 | |||
| 56 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 57 | |||
| 58 | } // namespace tao | ||
| 59 | |||
| 60 | #endif | ||
diff --git a/MoonParser/pegtl/internal/ranges.hpp b/MoonParser/pegtl/internal/ranges.hpp new file mode 100644 index 0000000..e3ee65c --- /dev/null +++ b/MoonParser/pegtl/internal/ranges.hpp | |||
| @@ -0,0 +1,102 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_RANGES_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_RANGES_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "bump_help.hpp" | ||
| 10 | #include "range.hpp" | ||
| 11 | #include "skip_control.hpp" | ||
| 12 | |||
| 13 | #include "../analysis/generic.hpp" | ||
| 14 | |||
| 15 | namespace tao | ||
| 16 | { | ||
| 17 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 18 | { | ||
| 19 | namespace internal | ||
| 20 | { | ||
| 21 | template< int Eol, typename Char, Char... Cs > | ||
| 22 | struct ranges_impl; | ||
| 23 | |||
| 24 | template< int Eol, typename Char > | ||
| 25 | struct ranges_impl< Eol, Char > | ||
| 26 | { | ||
| 27 | static constexpr bool can_match_eol = false; | ||
| 28 | |||
| 29 | static bool match( const Char ) noexcept | ||
| 30 | { | ||
| 31 | return false; | ||
| 32 | } | ||
| 33 | }; | ||
| 34 | |||
| 35 | template< int Eol, typename Char, Char Eq > | ||
| 36 | struct ranges_impl< Eol, Char, Eq > | ||
| 37 | { | ||
| 38 | static constexpr bool can_match_eol = ( Eq == Eol ); | ||
| 39 | |||
| 40 | static bool match( const Char c ) noexcept | ||
| 41 | { | ||
| 42 | return c == Eq; | ||
| 43 | } | ||
| 44 | }; | ||
| 45 | |||
| 46 | template< int Eol, typename Char, Char Lo, Char Hi, Char... Cs > | ||
| 47 | struct ranges_impl< Eol, Char, Lo, Hi, Cs... > | ||
| 48 | { | ||
| 49 | static constexpr bool can_match_eol = ( ( ( Lo <= Eol ) && ( Eol <= Hi ) ) || ranges_impl< Eol, Char, Cs... >::can_match_eol ); | ||
| 50 | |||
| 51 | static bool match( const Char c ) noexcept | ||
| 52 | { | ||
| 53 | return ( ( Lo <= c ) && ( c <= Hi ) ) || ranges_impl< Eol, Char, Cs... >::match( c ); | ||
| 54 | } | ||
| 55 | }; | ||
| 56 | |||
| 57 | template< typename Peek, typename Peek::data_t... Cs > | ||
| 58 | struct ranges | ||
| 59 | { | ||
| 60 | using analyze_t = analysis::generic< analysis::rule_type::ANY >; | ||
| 61 | |||
| 62 | template< int Eol > | ||
| 63 | struct can_match_eol | ||
| 64 | { | ||
| 65 | static constexpr bool value = ranges_impl< Eol, typename Peek::data_t, Cs... >::can_match_eol; | ||
| 66 | }; | ||
| 67 | |||
| 68 | template< typename Input > | ||
| 69 | static bool match( Input& in ) | ||
| 70 | { | ||
| 71 | using eol_t = typename Input::eol_t; | ||
| 72 | |||
| 73 | if( !in.empty() ) { | ||
| 74 | if( const auto t = Peek::peek( in ) ) { | ||
| 75 | if( ranges_impl< eol_t::ch, typename Peek::data_t, Cs... >::match( t.data ) ) { | ||
| 76 | bump_impl< can_match_eol< eol_t::ch >::value >::bump( in, t.size ); | ||
| 77 | return true; | ||
| 78 | } | ||
| 79 | } | ||
| 80 | } | ||
| 81 | return false; | ||
| 82 | } | ||
| 83 | }; | ||
| 84 | |||
| 85 | template< typename Peek, typename Peek::data_t Lo, typename Peek::data_t Hi > | ||
| 86 | struct ranges< Peek, Lo, Hi > | ||
| 87 | : range< result_on_found::SUCCESS, Peek, Lo, Hi > | ||
| 88 | { | ||
| 89 | }; | ||
| 90 | |||
| 91 | template< typename Peek, typename Peek::data_t... Cs > | ||
| 92 | struct skip_control< ranges< Peek, Cs... > > : std::true_type | ||
| 93 | { | ||
| 94 | }; | ||
| 95 | |||
| 96 | } // namespace internal | ||
| 97 | |||
| 98 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 99 | |||
| 100 | } // namespace tao | ||
| 101 | |||
| 102 | #endif | ||
diff --git a/MoonParser/pegtl/internal/rep.hpp b/MoonParser/pegtl/internal/rep.hpp new file mode 100644 index 0000000..df66ee2 --- /dev/null +++ b/MoonParser/pegtl/internal/rep.hpp | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_REP_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_REP_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "rule_conjunction.hpp" | ||
| 10 | #include "skip_control.hpp" | ||
| 11 | #include "trivial.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/counted.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< unsigned Num, typename... Rules > | ||
| 25 | struct rep; | ||
| 26 | |||
| 27 | template< unsigned Num > | ||
| 28 | struct rep< Num > | ||
| 29 | : trivial< true > | ||
| 30 | { | ||
| 31 | }; | ||
| 32 | |||
| 33 | template< typename Rule, typename... Rules > | ||
| 34 | struct rep< 0, Rule, Rules... > | ||
| 35 | : trivial< true > | ||
| 36 | { | ||
| 37 | }; | ||
| 38 | |||
| 39 | template< unsigned Num, typename... Rules > | ||
| 40 | struct rep | ||
| 41 | { | ||
| 42 | using analyze_t = analysis::counted< analysis::rule_type::SEQ, Num, Rules... >; | ||
| 43 | |||
| 44 | template< apply_mode A, | ||
| 45 | rewind_mode M, | ||
| 46 | template< typename... > class Action, | ||
| 47 | template< typename... > class Control, | ||
| 48 | typename Input, | ||
| 49 | typename... States > | ||
| 50 | static bool match( Input& in, States&&... st ) | ||
| 51 | { | ||
| 52 | auto m = in.template mark< M >(); | ||
| 53 | using m_t = decltype( m ); | ||
| 54 | |||
| 55 | for( unsigned i = 0; i != Num; ++i ) { | ||
| 56 | if( !rule_conjunction< Rules... >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ) { | ||
| 57 | return false; | ||
| 58 | } | ||
| 59 | } | ||
| 60 | return m( true ); | ||
| 61 | } | ||
| 62 | }; | ||
| 63 | |||
| 64 | template< unsigned Num, typename... Rules > | ||
| 65 | struct skip_control< rep< Num, Rules... > > : std::true_type | ||
| 66 | { | ||
| 67 | }; | ||
| 68 | |||
| 69 | } // namespace internal | ||
| 70 | |||
| 71 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 72 | |||
| 73 | } // namespace tao | ||
| 74 | |||
| 75 | #endif | ||
diff --git a/MoonParser/pegtl/internal/rep_min.hpp b/MoonParser/pegtl/internal/rep_min.hpp new file mode 100644 index 0000000..f5e61da --- /dev/null +++ b/MoonParser/pegtl/internal/rep_min.hpp | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_REP_MIN_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_REP_MIN_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "rep.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | #include "star.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | template< unsigned Min, typename Rule, typename... Rules > | ||
| 20 | using rep_min = seq< rep< Min, Rule, Rules... >, star< Rule, Rules... > >; | ||
| 21 | |||
| 22 | } // namespace internal | ||
| 23 | |||
| 24 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 25 | |||
| 26 | } // namespace tao | ||
| 27 | |||
| 28 | #endif | ||
diff --git a/MoonParser/pegtl/internal/rep_min_max.hpp b/MoonParser/pegtl/internal/rep_min_max.hpp new file mode 100644 index 0000000..7463398 --- /dev/null +++ b/MoonParser/pegtl/internal/rep_min_max.hpp | |||
| @@ -0,0 +1,88 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_REP_MIN_MAX_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_REP_MIN_MAX_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | #include "duseltronik.hpp" | ||
| 12 | #include "not_at.hpp" | ||
| 13 | #include "rule_conjunction.hpp" | ||
| 14 | #include "seq.hpp" | ||
| 15 | #include "skip_control.hpp" | ||
| 16 | #include "trivial.hpp" | ||
| 17 | |||
| 18 | #include "../apply_mode.hpp" | ||
| 19 | #include "../rewind_mode.hpp" | ||
| 20 | |||
| 21 | #include "../analysis/counted.hpp" | ||
| 22 | |||
| 23 | namespace tao | ||
| 24 | { | ||
| 25 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 26 | { | ||
| 27 | namespace internal | ||
| 28 | { | ||
| 29 | template< unsigned Min, unsigned Max, typename... Rules > | ||
| 30 | struct rep_min_max; | ||
| 31 | |||
| 32 | template< unsigned Min, unsigned Max > | ||
| 33 | struct rep_min_max< Min, Max > | ||
| 34 | : trivial< false > | ||
| 35 | { | ||
| 36 | static_assert( Min <= Max, "invalid rep_min_max rule (maximum number of repetitions smaller than minimum)" ); | ||
| 37 | }; | ||
| 38 | |||
| 39 | template< typename Rule, typename... Rules > | ||
| 40 | struct rep_min_max< 0, 0, Rule, Rules... > | ||
| 41 | : not_at< Rule, Rules... > | ||
| 42 | { | ||
| 43 | }; | ||
| 44 | |||
| 45 | template< unsigned Min, unsigned Max, typename... Rules > | ||
| 46 | struct rep_min_max | ||
| 47 | { | ||
| 48 | using analyze_t = analysis::counted< analysis::rule_type::SEQ, Min, Rules... >; | ||
| 49 | |||
| 50 | static_assert( Min <= Max, "invalid rep_min_max rule (maximum number of repetitions smaller than minimum)" ); | ||
| 51 | |||
| 52 | template< apply_mode A, | ||
| 53 | rewind_mode M, | ||
| 54 | template< typename... > class Action, | ||
| 55 | template< typename... > class Control, | ||
| 56 | typename Input, | ||
| 57 | typename... States > | ||
| 58 | static bool match( Input& in, States&&... st ) | ||
| 59 | { | ||
| 60 | auto m = in.template mark< M >(); | ||
| 61 | using m_t = decltype( m ); | ||
| 62 | |||
| 63 | for( unsigned i = 0; i != Min; ++i ) { | ||
| 64 | if( !rule_conjunction< Rules... >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ) { | ||
| 65 | return false; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | for( unsigned i = Min; i != Max; ++i ) { | ||
| 69 | if( !duseltronik< seq< Rules... >, A, rewind_mode::REQUIRED, Action, Control >::match( in, st... ) ) { | ||
| 70 | return m( true ); | ||
| 71 | } | ||
| 72 | } | ||
| 73 | return m( duseltronik< not_at< Rules... >, A, m_t::next_rewind_mode, Action, Control >::match( in, st... ) ); // NOTE that not_at<> will always rewind. | ||
| 74 | } | ||
| 75 | }; | ||
| 76 | |||
| 77 | template< unsigned Min, unsigned Max, typename... Rules > | ||
| 78 | struct skip_control< rep_min_max< Min, Max, Rules... > > : std::true_type | ||
| 79 | { | ||
| 80 | }; | ||
| 81 | |||
| 82 | } // namespace internal | ||
| 83 | |||
| 84 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 85 | |||
| 86 | } // namespace tao | ||
| 87 | |||
| 88 | #endif | ||
diff --git a/MoonParser/pegtl/internal/rep_opt.hpp b/MoonParser/pegtl/internal/rep_opt.hpp new file mode 100644 index 0000000..55bcd47 --- /dev/null +++ b/MoonParser/pegtl/internal/rep_opt.hpp | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_REP_OPT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_REP_OPT_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "duseltronik.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | #include "skip_control.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< unsigned Max, typename... Rules > | ||
| 25 | struct rep_opt | ||
| 26 | { | ||
| 27 | using analyze_t = analysis::generic< analysis::rule_type::OPT, Rules... >; | ||
| 28 | |||
| 29 | template< apply_mode A, | ||
| 30 | rewind_mode, | ||
| 31 | template< typename... > class Action, | ||
| 32 | template< typename... > class Control, | ||
| 33 | typename Input, | ||
| 34 | typename... States > | ||
| 35 | static bool match( Input& in, States&&... st ) | ||
| 36 | { | ||
| 37 | for( unsigned i = 0; ( i != Max ) && duseltronik< seq< Rules... >, A, rewind_mode::REQUIRED, Action, Control >::match( in, st... ); ++i ) { | ||
| 38 | } | ||
| 39 | return true; | ||
| 40 | } | ||
| 41 | }; | ||
| 42 | |||
| 43 | template< unsigned Max, typename... Rules > | ||
| 44 | struct skip_control< rep_opt< Max, Rules... > > : std::true_type | ||
| 45 | { | ||
| 46 | }; | ||
| 47 | |||
| 48 | } // namespace internal | ||
| 49 | |||
| 50 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 51 | |||
| 52 | } // namespace tao | ||
| 53 | |||
| 54 | #endif | ||
diff --git a/MoonParser/pegtl/internal/require.hpp b/MoonParser/pegtl/internal/require.hpp new file mode 100644 index 0000000..0506356 --- /dev/null +++ b/MoonParser/pegtl/internal/require.hpp | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_REQUIRE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_REQUIRE_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | #include "trivial.hpp" | ||
| 11 | |||
| 12 | #include "../analysis/generic.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | namespace internal | ||
| 19 | { | ||
| 20 | template< unsigned Amount > | ||
| 21 | struct require; | ||
| 22 | |||
| 23 | template<> | ||
| 24 | struct require< 0 > | ||
| 25 | : trivial< true > | ||
| 26 | { | ||
| 27 | }; | ||
| 28 | |||
| 29 | template< unsigned Amount > | ||
| 30 | struct require | ||
| 31 | { | ||
| 32 | using analyze_t = analysis::generic< analysis::rule_type::OPT >; | ||
| 33 | |||
| 34 | template< typename Input > | ||
| 35 | static bool match( Input& in ) | ||
| 36 | { | ||
| 37 | return in.size( Amount ) >= Amount; | ||
| 38 | } | ||
| 39 | }; | ||
| 40 | |||
| 41 | template< unsigned Amount > | ||
| 42 | struct skip_control< require< Amount > > : std::true_type | ||
| 43 | { | ||
| 44 | }; | ||
| 45 | |||
| 46 | } // namespace internal | ||
| 47 | |||
| 48 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 49 | |||
| 50 | } // namespace tao | ||
| 51 | |||
| 52 | #endif | ||
diff --git a/MoonParser/pegtl/internal/result_on_found.hpp b/MoonParser/pegtl/internal/result_on_found.hpp new file mode 100644 index 0000000..e41f35c --- /dev/null +++ b/MoonParser/pegtl/internal/result_on_found.hpp | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_RESULT_ON_FOUND_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_RESULT_ON_FOUND_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | namespace internal | ||
| 14 | { | ||
| 15 | enum class result_on_found : bool | ||
| 16 | { | ||
| 17 | SUCCESS = true, | ||
| 18 | FAILURE = false | ||
| 19 | }; | ||
| 20 | |||
| 21 | } // namespace internal | ||
| 22 | |||
| 23 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | |||
| 25 | } // namespace tao | ||
| 26 | |||
| 27 | #endif | ||
diff --git a/MoonParser/pegtl/internal/rule_conjunction.hpp b/MoonParser/pegtl/internal/rule_conjunction.hpp new file mode 100644 index 0000000..2eb41e2 --- /dev/null +++ b/MoonParser/pegtl/internal/rule_conjunction.hpp | |||
| @@ -0,0 +1,63 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_RULE_CONJUNCTION_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_RULE_CONJUNCTION_HPP | ||
| 6 | |||
| 7 | #include "../apply_mode.hpp" | ||
| 8 | #include "../config.hpp" | ||
| 9 | #include "../rewind_mode.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | template< typename... Rules > | ||
| 18 | struct rule_conjunction; | ||
| 19 | |||
| 20 | template<> | ||
| 21 | struct rule_conjunction<> | ||
| 22 | { | ||
| 23 | template< apply_mode A, | ||
| 24 | rewind_mode M, | ||
| 25 | template< typename... > class Action, | ||
| 26 | template< typename... > class Control, | ||
| 27 | typename Input, | ||
| 28 | typename... States > | ||
| 29 | static bool match( Input&, States&&... ) | ||
| 30 | { | ||
| 31 | return true; | ||
| 32 | } | ||
| 33 | }; | ||
| 34 | |||
| 35 | template< typename... Rules > | ||
| 36 | struct rule_conjunction | ||
| 37 | { | ||
| 38 | template< apply_mode A, | ||
| 39 | rewind_mode M, | ||
| 40 | template< typename... > class Action, | ||
| 41 | template< typename... > class Control, | ||
| 42 | typename Input, | ||
| 43 | typename... States > | ||
| 44 | static bool match( Input& in, States&&... st ) | ||
| 45 | { | ||
| 46 | #ifdef __cpp_fold_expressions | ||
| 47 | return ( Control< Rules >::template match< A, M, Action, Control >( in, st... ) && ... ); | ||
| 48 | #else | ||
| 49 | bool result = true; | ||
| 50 | using swallow = bool[]; | ||
| 51 | (void)swallow{ result = result && Control< Rules >::template match< A, M, Action, Control >( in, st... )... }; | ||
| 52 | return result; | ||
| 53 | #endif | ||
| 54 | } | ||
| 55 | }; | ||
| 56 | |||
| 57 | } // namespace internal | ||
| 58 | |||
| 59 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 60 | |||
| 61 | } // namespace tao | ||
| 62 | |||
| 63 | #endif | ||
diff --git a/MoonParser/pegtl/internal/rules.hpp b/MoonParser/pegtl/internal/rules.hpp new file mode 100644 index 0000000..91725ae --- /dev/null +++ b/MoonParser/pegtl/internal/rules.hpp | |||
| @@ -0,0 +1,61 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_RULES_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_RULES_HPP | ||
| 6 | |||
| 7 | #include "action.hpp" | ||
| 8 | #include "alnum.hpp" | ||
| 9 | #include "alpha.hpp" | ||
| 10 | #include "any.hpp" | ||
| 11 | #include "apply.hpp" | ||
| 12 | #include "apply0.hpp" | ||
| 13 | #include "at.hpp" | ||
| 14 | #include "bof.hpp" | ||
| 15 | #include "bol.hpp" | ||
| 16 | #include "bytes.hpp" | ||
| 17 | #include "control.hpp" | ||
| 18 | #include "disable.hpp" | ||
| 19 | #include "discard.hpp" | ||
| 20 | #include "enable.hpp" | ||
| 21 | #include "eof.hpp" | ||
| 22 | #include "eol.hpp" | ||
| 23 | #include "eolf.hpp" | ||
| 24 | #include "identifier.hpp" | ||
| 25 | #include "if_apply.hpp" | ||
| 26 | #include "if_must.hpp" | ||
| 27 | #include "if_must_else.hpp" | ||
| 28 | #include "if_then_else.hpp" | ||
| 29 | #include "istring.hpp" | ||
| 30 | #include "list.hpp" | ||
| 31 | #include "list_must.hpp" | ||
| 32 | #include "list_tail.hpp" | ||
| 33 | #include "list_tail_pad.hpp" | ||
| 34 | #include "minus.hpp" | ||
| 35 | #include "must.hpp" | ||
| 36 | #include "not_at.hpp" | ||
| 37 | #include "one.hpp" | ||
| 38 | #include "opt.hpp" | ||
| 39 | #include "pad.hpp" | ||
| 40 | #include "pad_opt.hpp" | ||
| 41 | #include "plus.hpp" | ||
| 42 | #include "raise.hpp" | ||
| 43 | #include "range.hpp" | ||
| 44 | #include "ranges.hpp" | ||
| 45 | #include "rep.hpp" | ||
| 46 | #include "rep_min.hpp" | ||
| 47 | #include "rep_min_max.hpp" | ||
| 48 | #include "rep_opt.hpp" | ||
| 49 | #include "require.hpp" | ||
| 50 | #include "seq.hpp" | ||
| 51 | #include "skip_control.hpp" | ||
| 52 | #include "sor.hpp" | ||
| 53 | #include "star.hpp" | ||
| 54 | #include "star_must.hpp" | ||
| 55 | #include "state.hpp" | ||
| 56 | #include "string.hpp" | ||
| 57 | #include "trivial.hpp" | ||
| 58 | #include "try_catch_type.hpp" | ||
| 59 | #include "until.hpp" | ||
| 60 | |||
| 61 | #endif | ||
diff --git a/MoonParser/pegtl/internal/seq.hpp b/MoonParser/pegtl/internal/seq.hpp new file mode 100644 index 0000000..f99cc7c --- /dev/null +++ b/MoonParser/pegtl/internal/seq.hpp | |||
| @@ -0,0 +1,80 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_SEQ_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_SEQ_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "rule_conjunction.hpp" | ||
| 10 | #include "skip_control.hpp" | ||
| 11 | #include "trivial.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< typename... Rules > | ||
| 25 | struct seq; | ||
| 26 | |||
| 27 | template<> | ||
| 28 | struct seq<> | ||
| 29 | : trivial< true > | ||
| 30 | { | ||
| 31 | }; | ||
| 32 | |||
| 33 | template< typename Rule > | ||
| 34 | struct seq< Rule > | ||
| 35 | { | ||
| 36 | using analyze_t = typename Rule::analyze_t; | ||
| 37 | |||
| 38 | template< apply_mode A, | ||
| 39 | rewind_mode M, | ||
| 40 | template< typename... > class Action, | ||
| 41 | template< typename... > class Control, | ||
| 42 | typename Input, | ||
| 43 | typename... States > | ||
| 44 | static bool match( Input& in, States&&... st ) | ||
| 45 | { | ||
| 46 | return Control< Rule >::template match< A, M, Action, Control >( in, st... ); | ||
| 47 | } | ||
| 48 | }; | ||
| 49 | |||
| 50 | template< typename... Rules > | ||
| 51 | struct seq | ||
| 52 | { | ||
| 53 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rules... >; | ||
| 54 | |||
| 55 | template< apply_mode A, | ||
| 56 | rewind_mode M, | ||
| 57 | template< typename... > class Action, | ||
| 58 | template< typename... > class Control, | ||
| 59 | typename Input, | ||
| 60 | typename... States > | ||
| 61 | static bool match( Input& in, States&&... st ) | ||
| 62 | { | ||
| 63 | auto m = in.template mark< M >(); | ||
| 64 | using m_t = decltype( m ); | ||
| 65 | return m( rule_conjunction< Rules... >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ); | ||
| 66 | } | ||
| 67 | }; | ||
| 68 | |||
| 69 | template< typename... Rules > | ||
| 70 | struct skip_control< seq< Rules... > > : std::true_type | ||
| 71 | { | ||
| 72 | }; | ||
| 73 | |||
| 74 | } // namespace internal | ||
| 75 | |||
| 76 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 77 | |||
| 78 | } // namespace tao | ||
| 79 | |||
| 80 | #endif | ||
diff --git a/MoonParser/pegtl/internal/skip_control.hpp b/MoonParser/pegtl/internal/skip_control.hpp new file mode 100644 index 0000000..e40ace5 --- /dev/null +++ b/MoonParser/pegtl/internal/skip_control.hpp | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_SKIP_CONTROL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_SKIP_CONTROL_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | namespace internal | ||
| 16 | { | ||
| 17 | // This class is a simple tagging mechanism. | ||
| 18 | // By default, skip_control< Rule >::value | ||
| 19 | // is 'false'. Each internal (!) rule that should | ||
| 20 | // be hidden from the control and action class' | ||
| 21 | // callbacks simply specializes skip_control<> | ||
| 22 | // to return 'true' for the above expression. | ||
| 23 | |||
| 24 | template< typename Rule > | ||
| 25 | struct skip_control : std::false_type | ||
| 26 | { | ||
| 27 | }; | ||
| 28 | |||
| 29 | } // namespace internal | ||
| 30 | |||
| 31 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 32 | |||
| 33 | } // namespace tao | ||
| 34 | |||
| 35 | #endif | ||
diff --git a/MoonParser/pegtl/internal/sor.hpp b/MoonParser/pegtl/internal/sor.hpp new file mode 100644 index 0000000..6d85a5c --- /dev/null +++ b/MoonParser/pegtl/internal/sor.hpp | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_SOR_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_SOR_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | #include "../apply_mode.hpp" | ||
| 12 | #include "../rewind_mode.hpp" | ||
| 13 | |||
| 14 | #include "../analysis/generic.hpp" | ||
| 15 | |||
| 16 | #include "integer_sequence.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< typename... Rules > | ||
| 25 | struct sor; | ||
| 26 | |||
| 27 | template<> | ||
| 28 | struct sor<> | ||
| 29 | : trivial< false > | ||
| 30 | { | ||
| 31 | }; | ||
| 32 | |||
| 33 | template< typename... Rules > | ||
| 34 | struct sor | ||
| 35 | : sor< index_sequence_for< Rules... >, Rules... > | ||
| 36 | { | ||
| 37 | }; | ||
| 38 | |||
| 39 | template< std::size_t... Indices, typename... Rules > | ||
| 40 | struct sor< index_sequence< Indices... >, Rules... > | ||
| 41 | { | ||
| 42 | using analyze_t = analysis::generic< analysis::rule_type::SOR, Rules... >; | ||
| 43 | |||
| 44 | template< apply_mode A, | ||
| 45 | rewind_mode M, | ||
| 46 | template< typename... > class Action, | ||
| 47 | template< typename... > class Control, | ||
| 48 | typename Input, | ||
| 49 | typename... States > | ||
| 50 | static bool match( Input& in, States&&... st ) | ||
| 51 | { | ||
| 52 | #ifdef __cpp_fold_expressions | ||
| 53 | return ( Control< Rules >::template match < A, ( Indices == ( sizeof...( Rules ) - 1 ) ) ? M : rewind_mode::REQUIRED, Action, Control > ( in, st... ) || ... ); | ||
| 54 | #else | ||
| 55 | bool result = false; | ||
| 56 | using swallow = bool[]; | ||
| 57 | (void)swallow{ result = result || Control< Rules >::template match < A, ( Indices == ( sizeof...( Rules ) - 1 ) ) ? M : rewind_mode::REQUIRED, Action, Control > ( in, st... )... }; | ||
| 58 | return result; | ||
| 59 | #endif | ||
| 60 | } | ||
| 61 | }; | ||
| 62 | |||
| 63 | template< typename... Rules > | ||
| 64 | struct skip_control< sor< Rules... > > : std::true_type | ||
| 65 | { | ||
| 66 | }; | ||
| 67 | |||
| 68 | } // namespace internal | ||
| 69 | |||
| 70 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 71 | |||
| 72 | } // namespace tao | ||
| 73 | |||
| 74 | #endif | ||
diff --git a/MoonParser/pegtl/internal/star.hpp b/MoonParser/pegtl/internal/star.hpp new file mode 100644 index 0000000..854f25f --- /dev/null +++ b/MoonParser/pegtl/internal/star.hpp | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_STAR_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_STAR_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | #include "duseltronik.hpp" | ||
| 12 | #include "seq.hpp" | ||
| 13 | #include "skip_control.hpp" | ||
| 14 | |||
| 15 | #include "../apply_mode.hpp" | ||
| 16 | #include "../rewind_mode.hpp" | ||
| 17 | |||
| 18 | #include "../analysis/generic.hpp" | ||
| 19 | |||
| 20 | namespace tao | ||
| 21 | { | ||
| 22 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 23 | { | ||
| 24 | namespace internal | ||
| 25 | { | ||
| 26 | template< typename Rule, typename... Rules > | ||
| 27 | struct star | ||
| 28 | { | ||
| 29 | using analyze_t = analysis::generic< analysis::rule_type::OPT, Rule, Rules..., star >; | ||
| 30 | |||
| 31 | template< apply_mode A, | ||
| 32 | rewind_mode, | ||
| 33 | template< typename... > class Action, | ||
| 34 | template< typename... > class Control, | ||
| 35 | typename Input, | ||
| 36 | typename... States > | ||
| 37 | static bool match( Input& in, States&&... st ) | ||
| 38 | { | ||
| 39 | while( duseltronik< seq< Rule, Rules... >, A, rewind_mode::REQUIRED, Action, Control >::match( in, st... ) ) { | ||
| 40 | } | ||
| 41 | return true; | ||
| 42 | } | ||
| 43 | }; | ||
| 44 | |||
| 45 | template< typename Rule, typename... Rules > | ||
| 46 | struct skip_control< star< Rule, Rules... > > : std::true_type | ||
| 47 | { | ||
| 48 | }; | ||
| 49 | |||
| 50 | } // namespace internal | ||
| 51 | |||
| 52 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 53 | |||
| 54 | } // namespace tao | ||
| 55 | |||
| 56 | #endif | ||
diff --git a/MoonParser/pegtl/internal/star_must.hpp b/MoonParser/pegtl/internal/star_must.hpp new file mode 100644 index 0000000..baaef4f --- /dev/null +++ b/MoonParser/pegtl/internal/star_must.hpp | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_STAR_MUST_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_STAR_MUST_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "if_must.hpp" | ||
| 10 | #include "star.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | namespace internal | ||
| 17 | { | ||
| 18 | template< typename Cond, typename... Rules > | ||
| 19 | using star_must = star< if_must< Cond, Rules... > >; | ||
| 20 | |||
| 21 | } // namespace internal | ||
| 22 | |||
| 23 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | |||
| 25 | } // namespace tao | ||
| 26 | |||
| 27 | #endif | ||
diff --git a/MoonParser/pegtl/internal/state.hpp b/MoonParser/pegtl/internal/state.hpp new file mode 100644 index 0000000..7fbe921 --- /dev/null +++ b/MoonParser/pegtl/internal/state.hpp | |||
| @@ -0,0 +1,83 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_STATE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_STATE_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "duseltronik.hpp" | ||
| 10 | #include "seq.hpp" | ||
| 11 | #include "skip_control.hpp" | ||
| 12 | |||
| 13 | #include "../apply_mode.hpp" | ||
| 14 | #include "../rewind_mode.hpp" | ||
| 15 | |||
| 16 | #include "../analysis/generic.hpp" | ||
| 17 | |||
| 18 | namespace tao | ||
| 19 | { | ||
| 20 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | { | ||
| 22 | namespace internal | ||
| 23 | { | ||
| 24 | template< typename State, typename... Rules > | ||
| 25 | struct state | ||
| 26 | { | ||
| 27 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rules... >; | ||
| 28 | |||
| 29 | template< apply_mode A, | ||
| 30 | rewind_mode M, | ||
| 31 | template< typename... > class Action, | ||
| 32 | template< typename... > class Control, | ||
| 33 | typename Input, | ||
| 34 | typename... States > | ||
| 35 | static auto success( State& s, const Input& in, States&&... st ) -> decltype( s.template success< A, M, Action, Control >( in, st... ), void() ) | ||
| 36 | { | ||
| 37 | s.template success< A, M, Action, Control >( in, st... ); | ||
| 38 | } | ||
| 39 | |||
| 40 | // NOTE: The additional "int = 0" is a work-around for missing expression SFINAE in VS2015. | ||
| 41 | |||
| 42 | template< apply_mode, | ||
| 43 | rewind_mode, | ||
| 44 | template< typename... > class Action, | ||
| 45 | template< typename... > class Control, | ||
| 46 | typename Input, | ||
| 47 | typename... States, | ||
| 48 | int = 0 > | ||
| 49 | static auto success( State& s, const Input& in, States&&... st ) -> decltype( s.success( in, st... ), void() ) | ||
| 50 | { | ||
| 51 | s.success( in, st... ); | ||
| 52 | } | ||
| 53 | |||
| 54 | template< apply_mode A, | ||
| 55 | rewind_mode M, | ||
| 56 | template< typename... > class Action, | ||
| 57 | template< typename... > class Control, | ||
| 58 | typename Input, | ||
| 59 | typename... States > | ||
| 60 | static bool match( Input& in, States&&... st ) | ||
| 61 | { | ||
| 62 | State s( const_cast< const Input& >( in ), st... ); | ||
| 63 | |||
| 64 | if( duseltronik< seq< Rules... >, A, M, Action, Control >::match( in, s ) ) { | ||
| 65 | success< A, M, Action, Control >( s, in, st... ); | ||
| 66 | return true; | ||
| 67 | } | ||
| 68 | return false; | ||
| 69 | } | ||
| 70 | }; | ||
| 71 | |||
| 72 | template< typename State, typename... Rules > | ||
| 73 | struct skip_control< state< State, Rules... > > : std::true_type | ||
| 74 | { | ||
| 75 | }; | ||
| 76 | |||
| 77 | } // namespace internal | ||
| 78 | |||
| 79 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 80 | |||
| 81 | } // namespace tao | ||
| 82 | |||
| 83 | #endif | ||
diff --git a/MoonParser/pegtl/internal/string.hpp b/MoonParser/pegtl/internal/string.hpp new file mode 100644 index 0000000..75245e3 --- /dev/null +++ b/MoonParser/pegtl/internal/string.hpp | |||
| @@ -0,0 +1,68 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_STRING_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_STRING_HPP | ||
| 6 | |||
| 7 | #include <cstring> | ||
| 8 | #include <utility> | ||
| 9 | |||
| 10 | #include "../config.hpp" | ||
| 11 | |||
| 12 | #include "bump_help.hpp" | ||
| 13 | #include "result_on_found.hpp" | ||
| 14 | #include "skip_control.hpp" | ||
| 15 | #include "trivial.hpp" | ||
| 16 | |||
| 17 | #include "../analysis/counted.hpp" | ||
| 18 | |||
| 19 | namespace tao | ||
| 20 | { | ||
| 21 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 22 | { | ||
| 23 | namespace internal | ||
| 24 | { | ||
| 25 | inline bool unsafe_equals( const char* s, const std::initializer_list< char >& l ) noexcept | ||
| 26 | { | ||
| 27 | return std::memcmp( s, &*l.begin(), l.size() ) == 0; | ||
| 28 | } | ||
| 29 | |||
| 30 | template< char... Cs > | ||
| 31 | struct string; | ||
| 32 | |||
| 33 | template<> | ||
| 34 | struct string<> | ||
| 35 | : trivial< true > | ||
| 36 | { | ||
| 37 | }; | ||
| 38 | |||
| 39 | template< char... Cs > | ||
| 40 | struct string | ||
| 41 | { | ||
| 42 | using analyze_t = analysis::counted< analysis::rule_type::ANY, sizeof...( Cs ) >; | ||
| 43 | |||
| 44 | template< typename Input > | ||
| 45 | static bool match( Input& in ) | ||
| 46 | { | ||
| 47 | if( in.size( sizeof...( Cs ) ) >= sizeof...( Cs ) ) { | ||
| 48 | if( unsafe_equals( in.current(), { Cs... } ) ) { | ||
| 49 | bump_help< result_on_found::SUCCESS, Input, char, Cs... >( in, sizeof...( Cs ) ); | ||
| 50 | return true; | ||
| 51 | } | ||
| 52 | } | ||
| 53 | return false; | ||
| 54 | } | ||
| 55 | }; | ||
| 56 | |||
| 57 | template< char... Cs > | ||
| 58 | struct skip_control< string< Cs... > > : std::true_type | ||
| 59 | { | ||
| 60 | }; | ||
| 61 | |||
| 62 | } // namespace internal | ||
| 63 | |||
| 64 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 65 | |||
| 66 | } // namespace tao | ||
| 67 | |||
| 68 | #endif | ||
diff --git a/MoonParser/pegtl/internal/trivial.hpp b/MoonParser/pegtl/internal/trivial.hpp new file mode 100644 index 0000000..3416175 --- /dev/null +++ b/MoonParser/pegtl/internal/trivial.hpp | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_TRIVIAL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_TRIVIAL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "skip_control.hpp" | ||
| 10 | |||
| 11 | #include "../analysis/counted.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace internal | ||
| 18 | { | ||
| 19 | template< bool Result > | ||
| 20 | struct trivial | ||
| 21 | { | ||
| 22 | using analyze_t = analysis::counted< analysis::rule_type::ANY, unsigned( !Result ) >; | ||
| 23 | |||
| 24 | template< typename Input > | ||
| 25 | static bool match( Input& ) noexcept | ||
| 26 | { | ||
| 27 | return Result; | ||
| 28 | } | ||
| 29 | }; | ||
| 30 | |||
| 31 | template< bool Result > | ||
| 32 | struct skip_control< trivial< Result > > : std::true_type | ||
| 33 | { | ||
| 34 | }; | ||
| 35 | |||
| 36 | } // namespace internal | ||
| 37 | |||
| 38 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 39 | |||
| 40 | } // namespace tao | ||
| 41 | |||
| 42 | #endif | ||
diff --git a/MoonParser/pegtl/internal/try_catch_type.hpp b/MoonParser/pegtl/internal/try_catch_type.hpp new file mode 100644 index 0000000..83fddb4 --- /dev/null +++ b/MoonParser/pegtl/internal/try_catch_type.hpp | |||
| @@ -0,0 +1,72 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_TRY_CATCH_TYPE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_TRY_CATCH_TYPE_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "../config.hpp" | ||
| 10 | |||
| 11 | #include "duseltronik.hpp" | ||
| 12 | #include "seq.hpp" | ||
| 13 | #include "skip_control.hpp" | ||
| 14 | #include "trivial.hpp" | ||
| 15 | |||
| 16 | #include "../apply_mode.hpp" | ||
| 17 | #include "../rewind_mode.hpp" | ||
| 18 | |||
| 19 | #include "../analysis/generic.hpp" | ||
| 20 | |||
| 21 | namespace tao | ||
| 22 | { | ||
| 23 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | { | ||
| 25 | namespace internal | ||
| 26 | { | ||
| 27 | template< typename Exception, typename... Rules > | ||
| 28 | struct try_catch_type; | ||
| 29 | |||
| 30 | template< typename Exception > | ||
| 31 | struct try_catch_type< Exception > | ||
| 32 | : trivial< true > | ||
| 33 | { | ||
| 34 | }; | ||
| 35 | |||
| 36 | template< typename Exception, typename... Rules > | ||
| 37 | struct try_catch_type | ||
| 38 | { | ||
| 39 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rules... >; | ||
| 40 | |||
| 41 | template< apply_mode A, | ||
| 42 | rewind_mode M, | ||
| 43 | template< typename... > class Action, | ||
| 44 | template< typename... > class Control, | ||
| 45 | typename Input, | ||
| 46 | typename... States > | ||
| 47 | static bool match( Input& in, States&&... st ) | ||
| 48 | { | ||
| 49 | auto m = in.template mark< M >(); | ||
| 50 | using m_t = decltype( m ); | ||
| 51 | |||
| 52 | try { | ||
| 53 | return m( duseltronik< seq< Rules... >, A, m_t::next_rewind_mode, Action, Control >::match( in, st... ) ); | ||
| 54 | } | ||
| 55 | catch( const Exception& ) { | ||
| 56 | return false; | ||
| 57 | } | ||
| 58 | } | ||
| 59 | }; | ||
| 60 | |||
| 61 | template< typename Exception, typename... Rules > | ||
| 62 | struct skip_control< try_catch_type< Exception, Rules... > > : std::true_type | ||
| 63 | { | ||
| 64 | }; | ||
| 65 | |||
| 66 | } // namespace internal | ||
| 67 | |||
| 68 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 69 | |||
| 70 | } // namespace tao | ||
| 71 | |||
| 72 | #endif | ||
diff --git a/MoonParser/pegtl/internal/until.hpp b/MoonParser/pegtl/internal/until.hpp new file mode 100644 index 0000000..6a564a4 --- /dev/null +++ b/MoonParser/pegtl/internal/until.hpp | |||
| @@ -0,0 +1,91 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_UNTIL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_INTERNAL_UNTIL_HPP | ||
| 6 | |||
| 7 | #include "../config.hpp" | ||
| 8 | |||
| 9 | #include "bytes.hpp" | ||
| 10 | #include "eof.hpp" | ||
| 11 | #include "not_at.hpp" | ||
| 12 | #include "rule_conjunction.hpp" | ||
| 13 | #include "skip_control.hpp" | ||
| 14 | #include "star.hpp" | ||
| 15 | |||
| 16 | #include "../apply_mode.hpp" | ||
| 17 | #include "../rewind_mode.hpp" | ||
| 18 | |||
| 19 | #include "../analysis/generic.hpp" | ||
| 20 | |||
| 21 | namespace tao | ||
| 22 | { | ||
| 23 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | { | ||
| 25 | namespace internal | ||
| 26 | { | ||
| 27 | template< typename Cond, typename... Rules > | ||
| 28 | struct until; | ||
| 29 | |||
| 30 | template< typename Cond > | ||
| 31 | struct until< Cond > | ||
| 32 | { | ||
| 33 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, star< not_at< Cond >, not_at< eof >, bytes< 1 > >, Cond >; | ||
| 34 | |||
| 35 | template< apply_mode A, | ||
| 36 | rewind_mode M, | ||
| 37 | template< typename... > class Action, | ||
| 38 | template< typename... > class Control, | ||
| 39 | typename Input, | ||
| 40 | typename... States > | ||
| 41 | static bool match( Input& in, States&&... st ) | ||
| 42 | { | ||
| 43 | auto m = in.template mark< M >(); | ||
| 44 | |||
| 45 | while( !Control< Cond >::template match< A, rewind_mode::REQUIRED, Action, Control >( in, st... ) ) { | ||
| 46 | if( in.empty() ) { | ||
| 47 | return false; | ||
| 48 | } | ||
| 49 | in.bump(); | ||
| 50 | } | ||
| 51 | return m( true ); | ||
| 52 | } | ||
| 53 | }; | ||
| 54 | |||
| 55 | template< typename Cond, typename... Rules > | ||
| 56 | struct until | ||
| 57 | { | ||
| 58 | using analyze_t = analysis::generic< analysis::rule_type::SEQ, star< not_at< Cond >, not_at< eof >, Rules... >, Cond >; | ||
| 59 | |||
| 60 | template< apply_mode A, | ||
| 61 | rewind_mode M, | ||
| 62 | template< typename... > class Action, | ||
| 63 | template< typename... > class Control, | ||
| 64 | typename Input, | ||
| 65 | typename... States > | ||
| 66 | static bool match( Input& in, States&&... st ) | ||
| 67 | { | ||
| 68 | auto m = in.template mark< M >(); | ||
| 69 | using m_t = decltype( m ); | ||
| 70 | |||
| 71 | while( !Control< Cond >::template match< A, rewind_mode::REQUIRED, Action, Control >( in, st... ) ) { | ||
| 72 | if( in.empty() || ( !rule_conjunction< Rules... >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ) ) { | ||
| 73 | return false; | ||
| 74 | } | ||
| 75 | } | ||
| 76 | return m( true ); | ||
| 77 | } | ||
| 78 | }; | ||
| 79 | |||
| 80 | template< typename Cond, typename... Rules > | ||
| 81 | struct skip_control< until< Cond, Rules... > > : std::true_type | ||
| 82 | { | ||
| 83 | }; | ||
| 84 | |||
| 85 | } // namespace internal | ||
| 86 | |||
| 87 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 88 | |||
| 89 | } // namespace tao | ||
| 90 | |||
| 91 | #endif | ||
diff --git a/MoonParser/pegtl/istream_input.hpp b/MoonParser/pegtl/istream_input.hpp new file mode 100644 index 0000000..b0232f9 --- /dev/null +++ b/MoonParser/pegtl/istream_input.hpp | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_ISTREAM_INPUT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_ISTREAM_INPUT_HPP | ||
| 6 | |||
| 7 | #include <istream> | ||
| 8 | |||
| 9 | #include "buffer_input.hpp" | ||
| 10 | #include "config.hpp" | ||
| 11 | #include "eol.hpp" | ||
| 12 | |||
| 13 | #include "internal/istream_reader.hpp" | ||
| 14 | |||
| 15 | namespace tao | ||
| 16 | { | ||
| 17 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 18 | { | ||
| 19 | template< typename Eol = eol::lf_crlf > | ||
| 20 | struct istream_input | ||
| 21 | : buffer_input< internal::istream_reader, Eol > | ||
| 22 | { | ||
| 23 | template< typename T > | ||
| 24 | istream_input( std::istream& in_stream, const std::size_t in_maximum, T&& in_source ) | ||
| 25 | : buffer_input< internal::istream_reader, Eol >( std::forward< T >( in_source ), in_maximum, in_stream ) | ||
| 26 | { | ||
| 27 | } | ||
| 28 | }; | ||
| 29 | |||
| 30 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 31 | |||
| 32 | } // namespace tao | ||
| 33 | |||
| 34 | #endif | ||
diff --git a/MoonParser/pegtl/memory_input.hpp b/MoonParser/pegtl/memory_input.hpp new file mode 100644 index 0000000..2d7fa42 --- /dev/null +++ b/MoonParser/pegtl/memory_input.hpp | |||
| @@ -0,0 +1,285 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_MEMORY_INPUT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_MEMORY_INPUT_HPP | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | #include <cstring> | ||
| 9 | #include <string> | ||
| 10 | #include <type_traits> | ||
| 11 | #include <utility> | ||
| 12 | |||
| 13 | #include "config.hpp" | ||
| 14 | #include "eol.hpp" | ||
| 15 | #include "position.hpp" | ||
| 16 | #include "tracking_mode.hpp" | ||
| 17 | |||
| 18 | #include "internal/action_input.hpp" | ||
| 19 | #include "internal/bump_impl.hpp" | ||
| 20 | #include "internal/iterator.hpp" | ||
| 21 | #include "internal/marker.hpp" | ||
| 22 | |||
| 23 | namespace tao | ||
| 24 | { | ||
| 25 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 26 | { | ||
| 27 | namespace internal | ||
| 28 | { | ||
| 29 | template< tracking_mode, typename Eol, typename Source > | ||
| 30 | class memory_input_base; | ||
| 31 | |||
| 32 | template< typename Eol, typename Source > | ||
| 33 | class memory_input_base< tracking_mode::IMMEDIATE, Eol, Source > | ||
| 34 | { | ||
| 35 | public: | ||
| 36 | using iterator_t = internal::iterator; | ||
| 37 | |||
| 38 | template< typename T > | ||
| 39 | memory_input_base( const iterator_t& in_begin, const char* in_end, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value ) | ||
| 40 | : m_current( in_begin ), | ||
| 41 | m_end( in_end ), | ||
| 42 | m_source( std::forward< T >( in_source ) ) | ||
| 43 | { | ||
| 44 | } | ||
| 45 | |||
| 46 | template< typename T > | ||
| 47 | memory_input_base( const char* in_begin, const char* in_end, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value ) | ||
| 48 | : m_current( in_begin ), | ||
| 49 | m_end( in_end ), | ||
| 50 | m_source( std::forward< T >( in_source ) ) | ||
| 51 | { | ||
| 52 | } | ||
| 53 | |||
| 54 | memory_input_base( const memory_input_base& ) = delete; | ||
| 55 | memory_input_base operator=( const memory_input_base& ) = delete; | ||
| 56 | |||
| 57 | const char* current() const noexcept | ||
| 58 | { | ||
| 59 | return m_current.data; | ||
| 60 | } | ||
| 61 | |||
| 62 | const char* end( const std::size_t = 0 ) const noexcept | ||
| 63 | { | ||
| 64 | return m_end; | ||
| 65 | } | ||
| 66 | |||
| 67 | std::size_t byte() const noexcept | ||
| 68 | { | ||
| 69 | return m_current.byte; | ||
| 70 | } | ||
| 71 | |||
| 72 | std::size_t line() const noexcept | ||
| 73 | { | ||
| 74 | return m_current.line; | ||
| 75 | } | ||
| 76 | |||
| 77 | std::size_t byte_in_line() const noexcept | ||
| 78 | { | ||
| 79 | return m_current.byte_in_line; | ||
| 80 | } | ||
| 81 | |||
| 82 | void bump( const std::size_t in_count = 1 ) noexcept | ||
| 83 | { | ||
| 84 | internal::bump( m_current, in_count, Eol::ch ); | ||
| 85 | } | ||
| 86 | |||
| 87 | void bump_in_this_line( const std::size_t in_count = 1 ) noexcept | ||
| 88 | { | ||
| 89 | internal::bump_in_this_line( m_current, in_count ); | ||
| 90 | } | ||
| 91 | |||
| 92 | void bump_to_next_line( const std::size_t in_count = 1 ) noexcept | ||
| 93 | { | ||
| 94 | internal::bump_to_next_line( m_current, in_count ); | ||
| 95 | } | ||
| 96 | |||
| 97 | TAOCPP_PEGTL_NAMESPACE::position position( const iterator_t& it ) const | ||
| 98 | { | ||
| 99 | return TAOCPP_PEGTL_NAMESPACE::position( it, m_source ); | ||
| 100 | } | ||
| 101 | |||
| 102 | protected: | ||
| 103 | iterator_t m_current; | ||
| 104 | const char* const m_end; | ||
| 105 | const Source m_source; | ||
| 106 | }; | ||
| 107 | |||
| 108 | template< typename Eol, typename Source > | ||
| 109 | class memory_input_base< tracking_mode::LAZY, Eol, Source > | ||
| 110 | { | ||
| 111 | public: | ||
| 112 | using iterator_t = const char*; | ||
| 113 | |||
| 114 | template< typename T > | ||
| 115 | memory_input_base( const internal::iterator& in_begin, const char* in_end, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value ) | ||
| 116 | : m_begin( in_begin ), | ||
| 117 | m_current( in_begin.data ), | ||
| 118 | m_end( in_end ), | ||
| 119 | m_source( std::forward< T >( in_source ) ) | ||
| 120 | { | ||
| 121 | } | ||
| 122 | |||
| 123 | template< typename T > | ||
| 124 | memory_input_base( const char* in_begin, const char* in_end, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value ) | ||
| 125 | : m_begin( in_begin ), | ||
| 126 | m_current( in_begin ), | ||
| 127 | m_end( in_end ), | ||
| 128 | m_source( std::forward< T >( in_source ) ) | ||
| 129 | { | ||
| 130 | } | ||
| 131 | |||
| 132 | memory_input_base( const memory_input_base& ) = delete; | ||
| 133 | memory_input_base operator=( const memory_input_base& ) = delete; | ||
| 134 | |||
| 135 | const char* current() const noexcept | ||
| 136 | { | ||
| 137 | return m_current; | ||
| 138 | } | ||
| 139 | |||
| 140 | const char* end( const std::size_t = 0 ) const noexcept | ||
| 141 | { | ||
| 142 | return m_end; | ||
| 143 | } | ||
| 144 | |||
| 145 | std::size_t byte() const noexcept | ||
| 146 | { | ||
| 147 | return std::size_t( current() - m_begin.data ); | ||
| 148 | } | ||
| 149 | |||
| 150 | void bump( const std::size_t in_count = 1 ) noexcept | ||
| 151 | { | ||
| 152 | m_current += in_count; | ||
| 153 | } | ||
| 154 | |||
| 155 | void bump_in_this_line( const std::size_t in_count = 1 ) noexcept | ||
| 156 | { | ||
| 157 | m_current += in_count; | ||
| 158 | } | ||
| 159 | |||
| 160 | void bump_to_next_line( const std::size_t in_count = 1 ) noexcept | ||
| 161 | { | ||
| 162 | m_current += in_count; | ||
| 163 | } | ||
| 164 | |||
| 165 | TAOCPP_PEGTL_NAMESPACE::position position( const iterator_t it ) const | ||
| 166 | { | ||
| 167 | internal::iterator c( m_begin ); | ||
| 168 | internal::bump( c, std::size_t( it - m_begin.data ), Eol::ch ); | ||
| 169 | return TAOCPP_PEGTL_NAMESPACE::position( c, m_source ); | ||
| 170 | } | ||
| 171 | |||
| 172 | protected: | ||
| 173 | const internal::iterator m_begin; | ||
| 174 | iterator_t m_current; | ||
| 175 | const char* const m_end; | ||
| 176 | const Source m_source; | ||
| 177 | }; | ||
| 178 | |||
| 179 | } // namespace internal | ||
| 180 | |||
| 181 | template< tracking_mode P = tracking_mode::IMMEDIATE, typename Eol = eol::lf_crlf, typename Source = std::string > | ||
| 182 | class memory_input | ||
| 183 | : public internal::memory_input_base< P, Eol, Source > | ||
| 184 | { | ||
| 185 | public: | ||
| 186 | static constexpr tracking_mode tracking_mode_v = P; | ||
| 187 | |||
| 188 | using eol_t = Eol; | ||
| 189 | using source_t = Source; | ||
| 190 | |||
| 191 | using typename internal::memory_input_base< P, Eol, Source >::iterator_t; | ||
| 192 | |||
| 193 | using action_t = internal::action_input< memory_input >; | ||
| 194 | |||
| 195 | using internal::memory_input_base< P, Eol, Source >::memory_input_base; | ||
| 196 | |||
| 197 | template< typename T > | ||
| 198 | memory_input( const char* in_begin, const std::size_t in_size, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value ) | ||
| 199 | : memory_input( in_begin, in_begin + in_size, std::forward< T >( in_source ) ) | ||
| 200 | { | ||
| 201 | } | ||
| 202 | |||
| 203 | template< typename T > | ||
| 204 | memory_input( const std::string& in_string, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value ) | ||
| 205 | : memory_input( in_string.data(), in_string.size(), std::forward< T >( in_source ) ) | ||
| 206 | { | ||
| 207 | } | ||
| 208 | |||
| 209 | template< typename T > | ||
| 210 | memory_input( const char* in_begin, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value ) | ||
| 211 | : memory_input( in_begin, std::strlen( in_begin ), std::forward< T >( in_source ) ) | ||
| 212 | { | ||
| 213 | } | ||
| 214 | |||
| 215 | template< typename T > | ||
| 216 | memory_input( const char* in_begin, const char* in_end, T&& in_source, const std::size_t in_byte, const std::size_t in_line, const std::size_t in_byte_in_line ) noexcept( std::is_nothrow_constructible< Source, T&& >::value ) | ||
| 217 | : memory_input( { in_begin, in_byte, in_line, in_byte_in_line }, in_end, std::forward< T >( in_source ) ) | ||
| 218 | { | ||
| 219 | } | ||
| 220 | |||
| 221 | memory_input( const memory_input& ) = delete; | ||
| 222 | memory_input operator=( const memory_input& ) = delete; | ||
| 223 | |||
| 224 | const Source& source() const noexcept | ||
| 225 | { | ||
| 226 | return this->m_source; | ||
| 227 | } | ||
| 228 | |||
| 229 | bool empty() const noexcept | ||
| 230 | { | ||
| 231 | return this->current() == this->end(); | ||
| 232 | } | ||
| 233 | |||
| 234 | std::size_t size( const std::size_t = 0 ) const noexcept | ||
| 235 | { | ||
| 236 | return std::size_t( this->end() - this->current() ); | ||
| 237 | } | ||
| 238 | |||
| 239 | char peek_char( const std::size_t offset = 0 ) const noexcept | ||
| 240 | { | ||
| 241 | return this->current()[ offset ]; | ||
| 242 | } | ||
| 243 | |||
| 244 | unsigned char peek_byte( const std::size_t offset = 0 ) const noexcept | ||
| 245 | { | ||
| 246 | return static_cast< unsigned char >( peek_char( offset ) ); | ||
| 247 | } | ||
| 248 | |||
| 249 | iterator_t& iterator() noexcept | ||
| 250 | { | ||
| 251 | return this->m_current; | ||
| 252 | } | ||
| 253 | |||
| 254 | const iterator_t& iterator() const noexcept | ||
| 255 | { | ||
| 256 | return this->m_current; | ||
| 257 | } | ||
| 258 | |||
| 259 | using internal::memory_input_base< P, Eol, Source >::position; | ||
| 260 | |||
| 261 | TAOCPP_PEGTL_NAMESPACE::position position() const | ||
| 262 | { | ||
| 263 | return position( iterator() ); | ||
| 264 | } | ||
| 265 | |||
| 266 | void discard() const noexcept | ||
| 267 | { | ||
| 268 | } | ||
| 269 | |||
| 270 | void require( const std::size_t ) const noexcept | ||
| 271 | { | ||
| 272 | } | ||
| 273 | |||
| 274 | template< rewind_mode M > | ||
| 275 | internal::marker< iterator_t, M > mark() noexcept | ||
| 276 | { | ||
| 277 | return internal::marker< iterator_t, M >( iterator() ); | ||
| 278 | } | ||
| 279 | }; | ||
| 280 | |||
| 281 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 282 | |||
| 283 | } // namespace tao | ||
| 284 | |||
| 285 | #endif | ||
diff --git a/MoonParser/pegtl/mmap_input.hpp b/MoonParser/pegtl/mmap_input.hpp new file mode 100644 index 0000000..0a112ef --- /dev/null +++ b/MoonParser/pegtl/mmap_input.hpp | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_MMAP_INPUT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_MMAP_INPUT_HPP | ||
| 6 | |||
| 7 | #include <string> | ||
| 8 | #include <utility> | ||
| 9 | |||
| 10 | #include "config.hpp" | ||
| 11 | #include "eol.hpp" | ||
| 12 | #include "memory_input.hpp" | ||
| 13 | #include "tracking_mode.hpp" | ||
| 14 | |||
| 15 | #include "internal/file_mapper.hpp" | ||
| 16 | |||
| 17 | namespace tao | ||
| 18 | { | ||
| 19 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 20 | { | ||
| 21 | namespace internal | ||
| 22 | { | ||
| 23 | struct mmap_holder | ||
| 24 | { | ||
| 25 | const std::string filename; | ||
| 26 | const file_mapper data; | ||
| 27 | |||
| 28 | template< typename T > | ||
| 29 | mmap_holder( T&& in_filename ) | ||
| 30 | : filename( std::forward< T >( in_filename ) ), | ||
| 31 | data( filename.c_str() ) | ||
| 32 | { | ||
| 33 | } | ||
| 34 | }; | ||
| 35 | |||
| 36 | } // namespace internal | ||
| 37 | |||
| 38 | template< tracking_mode P = tracking_mode::IMMEDIATE, typename Eol = eol::lf_crlf > | ||
| 39 | struct mmap_input | ||
| 40 | : private internal::mmap_holder, | ||
| 41 | public memory_input< P, Eol, const char* > | ||
| 42 | { | ||
| 43 | template< typename T > | ||
| 44 | explicit mmap_input( T&& in_filename ) | ||
| 45 | : internal::mmap_holder( std::forward< T >( in_filename ) ), | ||
| 46 | memory_input< P, Eol, const char* >( data.begin(), data.end(), filename.c_str() ) | ||
| 47 | { | ||
| 48 | } | ||
| 49 | }; | ||
| 50 | |||
| 51 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 52 | |||
| 53 | } // namespace tao | ||
| 54 | |||
| 55 | #endif | ||
diff --git a/MoonParser/pegtl/normal.hpp b/MoonParser/pegtl/normal.hpp new file mode 100644 index 0000000..d5752d1 --- /dev/null +++ b/MoonParser/pegtl/normal.hpp | |||
| @@ -0,0 +1,81 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_NORMAL_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_NORMAL_HPP | ||
| 6 | |||
| 7 | #include "apply_mode.hpp" | ||
| 8 | #include "config.hpp" | ||
| 9 | #include "nothing.hpp" | ||
| 10 | #include "parse_error.hpp" | ||
| 11 | #include "rewind_mode.hpp" | ||
| 12 | |||
| 13 | #include "internal/demangle.hpp" | ||
| 14 | #include "internal/dusel_mode.hpp" | ||
| 15 | #include "internal/duseltronik.hpp" | ||
| 16 | #include "internal/has_apply0.hpp" | ||
| 17 | #include "internal/skip_control.hpp" | ||
| 18 | |||
| 19 | namespace tao | ||
| 20 | { | ||
| 21 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 22 | { | ||
| 23 | template< typename Rule > | ||
| 24 | struct normal | ||
| 25 | { | ||
| 26 | template< typename Input, typename... States > | ||
| 27 | static void start( const Input&, States&&... ) noexcept | ||
| 28 | { | ||
| 29 | } | ||
| 30 | |||
| 31 | template< typename Input, typename... States > | ||
| 32 | static void success( const Input&, States&&... ) noexcept | ||
| 33 | { | ||
| 34 | } | ||
| 35 | |||
| 36 | template< typename Input, typename... States > | ||
| 37 | static void failure( const Input&, States&&... ) noexcept | ||
| 38 | { | ||
| 39 | } | ||
| 40 | |||
| 41 | template< typename Input, typename... States > | ||
| 42 | static void raise( const Input& in, States&&... ) | ||
| 43 | { | ||
| 44 | throw parse_error( "parse error matching " + internal::demangle< Rule >(), in ); | ||
| 45 | } | ||
| 46 | |||
| 47 | template< template< typename... > class Action, typename Input, typename... States > | ||
| 48 | static void apply0( const Input&, States&&... st ) | ||
| 49 | { | ||
| 50 | Action< Rule >::apply0( st... ); | ||
| 51 | } | ||
| 52 | |||
| 53 | template< template< typename... > class Action, typename Iterator, typename Input, typename... States > | ||
| 54 | static void apply( const Iterator& begin, const Input& in, States&&... st ) | ||
| 55 | { | ||
| 56 | using action_t = typename Input::action_t; | ||
| 57 | const action_t action_input( begin, in ); | ||
| 58 | Action< Rule >::apply( action_input, st... ); | ||
| 59 | } | ||
| 60 | |||
| 61 | template< apply_mode A, | ||
| 62 | rewind_mode M, | ||
| 63 | template< typename... > class Action, | ||
| 64 | template< typename... > class Control, | ||
| 65 | typename Input, | ||
| 66 | typename... States > | ||
| 67 | static bool match( Input& in, States&&... st ) | ||
| 68 | { | ||
| 69 | constexpr bool use_control = !internal::skip_control< Rule >::value; | ||
| 70 | constexpr bool use_action = use_control && ( A == apply_mode::ACTION ) && ( !is_nothing< Action, Rule >::value ); | ||
| 71 | constexpr bool use_apply0 = use_action && internal::has_apply0< Action< Rule >, internal::type_list< States... > >::value; | ||
| 72 | constexpr dusel_mode mode = static_cast< dusel_mode >( static_cast< char >( use_control ) + static_cast< char >( use_action ) + static_cast< char >( use_apply0 ) ); | ||
| 73 | return internal::duseltronik< Rule, A, M, Action, Control, mode >::match( in, st... ); | ||
| 74 | } | ||
| 75 | }; | ||
| 76 | |||
| 77 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 78 | |||
| 79 | } // namespace tao | ||
| 80 | |||
| 81 | #endif | ||
diff --git a/MoonParser/pegtl/nothing.hpp b/MoonParser/pegtl/nothing.hpp new file mode 100644 index 0000000..9b121a2 --- /dev/null +++ b/MoonParser/pegtl/nothing.hpp | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_NOTHING_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_NOTHING_HPP | ||
| 6 | |||
| 7 | #include <type_traits> | ||
| 8 | |||
| 9 | #include "config.hpp" | ||
| 10 | |||
| 11 | namespace tao | ||
| 12 | { | ||
| 13 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 14 | { | ||
| 15 | template< typename Rule > | ||
| 16 | struct nothing | ||
| 17 | { | ||
| 18 | }; | ||
| 19 | |||
| 20 | template< template< typename... > class Action, typename Rule > | ||
| 21 | using is_nothing = std::is_base_of< nothing< Rule >, Action< Rule > >; | ||
| 22 | |||
| 23 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 24 | |||
| 25 | } // namespace tao | ||
| 26 | |||
| 27 | #endif | ||
diff --git a/MoonParser/pegtl/parse.hpp b/MoonParser/pegtl/parse.hpp new file mode 100644 index 0000000..c478cfa --- /dev/null +++ b/MoonParser/pegtl/parse.hpp | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_PARSE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_PARSE_HPP | ||
| 6 | |||
| 7 | #include "apply_mode.hpp" | ||
| 8 | #include "config.hpp" | ||
| 9 | #include "normal.hpp" | ||
| 10 | #include "nothing.hpp" | ||
| 11 | #include "parse_error.hpp" | ||
| 12 | #include "rewind_mode.hpp" | ||
| 13 | |||
| 14 | namespace tao | ||
| 15 | { | ||
| 16 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 17 | { | ||
| 18 | template< typename Rule, | ||
| 19 | template< typename... > class Action = nothing, | ||
| 20 | template< typename... > class Control = normal, | ||
| 21 | apply_mode A = apply_mode::ACTION, | ||
| 22 | rewind_mode M = rewind_mode::REQUIRED, | ||
| 23 | typename Input, | ||
| 24 | typename... States > | ||
| 25 | bool parse( Input&& in, States&&... st ) | ||
| 26 | { | ||
| 27 | return Control< Rule >::template match< A, M, Action, Control >( in, st... ); | ||
| 28 | } | ||
| 29 | |||
| 30 | template< typename Rule, | ||
| 31 | template< typename... > class Action = nothing, | ||
| 32 | template< typename... > class Control = normal, | ||
| 33 | apply_mode A = apply_mode::ACTION, | ||
| 34 | rewind_mode M = rewind_mode::REQUIRED, | ||
| 35 | typename Outer, | ||
| 36 | typename Input, | ||
| 37 | typename... States > | ||
| 38 | bool parse_nested( const Outer& oi, Input&& in, States&&... st ) | ||
| 39 | { | ||
| 40 | try { | ||
| 41 | return parse< Rule, Action, Control, A, M >( in, st... ); | ||
| 42 | } | ||
| 43 | catch( parse_error& e ) { | ||
| 44 | e.positions.push_back( oi.position() ); | ||
| 45 | throw; | ||
| 46 | } | ||
| 47 | } | ||
| 48 | |||
| 49 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 50 | |||
| 51 | } // namespace tao | ||
| 52 | |||
| 53 | #endif | ||
diff --git a/MoonParser/pegtl/parse_error.hpp b/MoonParser/pegtl/parse_error.hpp new file mode 100644 index 0000000..e015efb --- /dev/null +++ b/MoonParser/pegtl/parse_error.hpp | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_PARSE_ERROR_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_PARSE_ERROR_HPP | ||
| 6 | |||
| 7 | #include <stdexcept> | ||
| 8 | #include <vector> | ||
| 9 | |||
| 10 | #include "config.hpp" | ||
| 11 | #include "position.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | struct parse_error | ||
| 18 | : public std::runtime_error | ||
| 19 | { | ||
| 20 | parse_error( const std::string& msg, std::vector< position >&& in_positions ) | ||
| 21 | : std::runtime_error( msg ), | ||
| 22 | positions( std::move( in_positions ) ) | ||
| 23 | { | ||
| 24 | } | ||
| 25 | |||
| 26 | template< typename Input > | ||
| 27 | parse_error( const std::string& msg, const Input& in ) | ||
| 28 | : parse_error( msg, in.position() ) | ||
| 29 | { | ||
| 30 | } | ||
| 31 | |||
| 32 | parse_error( const std::string& msg, const position& pos ) | ||
| 33 | : std::runtime_error( to_string( pos ) + ": " + msg ), | ||
| 34 | positions( 1, pos ) | ||
| 35 | { | ||
| 36 | } | ||
| 37 | |||
| 38 | std::vector< position > positions; | ||
| 39 | }; | ||
| 40 | |||
| 41 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 42 | |||
| 43 | } // namespace tao | ||
| 44 | |||
| 45 | #endif | ||
diff --git a/MoonParser/pegtl/position.hpp b/MoonParser/pegtl/position.hpp new file mode 100644 index 0000000..c25225c --- /dev/null +++ b/MoonParser/pegtl/position.hpp | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_POSITION_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_POSITION_HPP | ||
| 6 | |||
| 7 | #include <cstdlib> | ||
| 8 | #include <ostream> | ||
| 9 | #include <sstream> | ||
| 10 | #include <string> | ||
| 11 | #include <utility> | ||
| 12 | |||
| 13 | #include "config.hpp" | ||
| 14 | |||
| 15 | #include "internal/iterator.hpp" | ||
| 16 | |||
| 17 | namespace tao | ||
| 18 | { | ||
| 19 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 20 | { | ||
| 21 | struct position | ||
| 22 | { | ||
| 23 | template< typename T > | ||
| 24 | position( const internal::iterator& in_iter, T&& in_source ) | ||
| 25 | : byte( in_iter.byte ), | ||
| 26 | line( in_iter.line ), | ||
| 27 | byte_in_line( in_iter.byte_in_line ), | ||
| 28 | source( std::forward< T >( in_source ) ) | ||
| 29 | { | ||
| 30 | } | ||
| 31 | |||
| 32 | std::size_t byte; | ||
| 33 | std::size_t line; | ||
| 34 | std::size_t byte_in_line; | ||
| 35 | std::string source; | ||
| 36 | }; | ||
| 37 | |||
| 38 | inline std::ostream& operator<<( std::ostream& o, const position& p ) | ||
| 39 | { | ||
| 40 | return o << p.source << ':' << p.line << ':' << p.byte_in_line << '(' << p.byte << ')'; | ||
| 41 | } | ||
| 42 | |||
| 43 | inline std::string to_string( const position& p ) | ||
| 44 | { | ||
| 45 | std::ostringstream o; | ||
| 46 | o << p; | ||
| 47 | return o.str(); | ||
| 48 | } | ||
| 49 | |||
| 50 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 51 | |||
| 52 | } // namespace tao | ||
| 53 | |||
| 54 | #endif | ||
diff --git a/MoonParser/pegtl/read_input.hpp b/MoonParser/pegtl/read_input.hpp new file mode 100644 index 0000000..9ebfaca --- /dev/null +++ b/MoonParser/pegtl/read_input.hpp | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_READ_INPUT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_READ_INPUT_HPP | ||
| 6 | |||
| 7 | #include <string> | ||
| 8 | |||
| 9 | #include "config.hpp" | ||
| 10 | #include "eol.hpp" | ||
| 11 | #include "string_input.hpp" | ||
| 12 | #include "tracking_mode.hpp" | ||
| 13 | |||
| 14 | #include "internal/file_reader.hpp" | ||
| 15 | |||
| 16 | namespace tao | ||
| 17 | { | ||
| 18 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 19 | { | ||
| 20 | namespace internal | ||
| 21 | { | ||
| 22 | struct filename_holder | ||
| 23 | { | ||
| 24 | const std::string filename; | ||
| 25 | |||
| 26 | template< typename T > | ||
| 27 | explicit filename_holder( T&& in_filename ) | ||
| 28 | : filename( std::forward< T >( in_filename ) ) | ||
| 29 | { | ||
| 30 | } | ||
| 31 | }; | ||
| 32 | |||
| 33 | } // namespace internal | ||
| 34 | |||
| 35 | template< tracking_mode P = tracking_mode::IMMEDIATE, typename Eol = eol::lf_crlf > | ||
| 36 | struct read_input | ||
| 37 | : private internal::filename_holder, | ||
| 38 | public string_input< P, Eol, const char* > | ||
| 39 | { | ||
| 40 | template< typename T > | ||
| 41 | explicit read_input( T&& in_filename ) | ||
| 42 | : internal::filename_holder( std::forward< T >( in_filename ) ), | ||
| 43 | string_input< P, Eol, const char* >( internal::file_reader( filename.c_str() ).read(), filename.c_str() ) | ||
| 44 | { | ||
| 45 | } | ||
| 46 | }; | ||
| 47 | |||
| 48 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 49 | |||
| 50 | } // namespace tao | ||
| 51 | |||
| 52 | #endif | ||
diff --git a/MoonParser/pegtl/rewind_mode.hpp b/MoonParser/pegtl/rewind_mode.hpp new file mode 100644 index 0000000..f78edb9 --- /dev/null +++ b/MoonParser/pegtl/rewind_mode.hpp | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | // Copyright (c) 2016-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_REWIND_MODE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_REWIND_MODE_HPP | ||
| 6 | |||
| 7 | #include "config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | enum class rewind_mode : char | ||
| 14 | { | ||
| 15 | ACTIVE, | ||
| 16 | REQUIRED, | ||
| 17 | DONTCARE | ||
| 18 | }; | ||
| 19 | |||
| 20 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 21 | |||
| 22 | } // namespace tao | ||
| 23 | |||
| 24 | #endif | ||
diff --git a/MoonParser/pegtl/rules.hpp b/MoonParser/pegtl/rules.hpp new file mode 100644 index 0000000..e1c50b2 --- /dev/null +++ b/MoonParser/pegtl/rules.hpp | |||
| @@ -0,0 +1,69 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_RULES_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_RULES_HPP | ||
| 6 | |||
| 7 | #include "config.hpp" | ||
| 8 | #include "parse_error.hpp" | ||
| 9 | |||
| 10 | #include "internal/rules.hpp" | ||
| 11 | |||
| 12 | namespace tao | ||
| 13 | { | ||
| 14 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 15 | { | ||
| 16 | // clang-format off | ||
| 17 | template< typename... Actions > struct apply : internal::apply< Actions... > {}; | ||
| 18 | template< typename... Actions > struct apply0 : internal::apply0< Actions... > {}; | ||
| 19 | template< template< typename... > class Action, typename... Rules > struct action : internal::action< Action, Rules... > {}; | ||
| 20 | template< typename... Rules > struct at : internal::at< Rules... > {}; | ||
| 21 | struct bof : internal::bof {}; | ||
| 22 | struct bol : internal::bol {}; | ||
| 23 | template< unsigned Num > struct bytes : internal::bytes< Num > {}; | ||
| 24 | template< template< typename... > class Control, typename... Rules > struct control : internal::control< Control, Rules... > {}; | ||
| 25 | template< typename... Rules > struct disable : internal::disable< Rules... > {}; | ||
| 26 | struct discard : internal::discard {}; | ||
| 27 | template< typename... Rules > struct enable : internal::enable< Rules... > {}; | ||
| 28 | struct eof : internal::eof {}; | ||
| 29 | struct failure : internal::trivial< false > {}; | ||
| 30 | template< typename Rule, typename... Actions > struct if_apply : internal::if_apply< Rule, Actions... > {}; | ||
| 31 | template< typename Cond, typename... Thens > struct if_must : internal::if_must< Cond, Thens... > {}; | ||
| 32 | template< typename Cond, typename Then, typename Else > struct if_must_else : internal::if_must_else< Cond, Then, Else > {}; | ||
| 33 | template< typename Cond, typename Then, typename Else > struct if_then_else : internal::if_then_else< Cond, Then, Else > {}; | ||
| 34 | template< typename Rule, typename Sep, typename Pad = void > struct list : internal::list< Rule, internal::pad< Sep, Pad > > {}; | ||
| 35 | template< typename Rule, typename Sep > struct list< Rule, Sep, void > : internal::list< Rule, Sep > {}; | ||
| 36 | template< typename Rule, typename Sep, typename Pad = void > struct list_must : internal::list_must< Rule, internal::pad< Sep, Pad > > {}; | ||
| 37 | template< typename Rule, typename Sep > struct list_must< Rule, Sep, void > : internal::list_must< Rule, Sep > {}; | ||
| 38 | template< typename Rule, typename Sep, typename Pad = void > struct list_tail : internal::list_tail_pad< Rule, Sep, Pad > {}; | ||
| 39 | template< typename Rule, typename Sep > struct list_tail< Rule, Sep, void > : internal::list_tail< Rule, Sep > {}; | ||
| 40 | template< typename M, typename S > struct minus : internal::minus< M, S > {}; | ||
| 41 | template< typename... Rules > struct must : internal::must< Rules... > {}; | ||
| 42 | template< typename... Rules > struct not_at : internal::not_at< Rules... > {}; | ||
| 43 | template< typename... Rules > struct opt : internal::opt< Rules... > {}; | ||
| 44 | template< typename Rule, typename Pad1, typename Pad2 = Pad1 > struct pad : internal::pad< Rule, Pad1, Pad2 > {}; | ||
| 45 | template< typename Rule, typename Pad > struct pad_opt : internal::pad_opt< Rule, Pad > {}; | ||
| 46 | template< typename Rule, typename... Rules > struct plus : internal::plus< Rule, Rules... > {}; | ||
| 47 | template< typename Exception > struct raise : internal::raise< Exception > {}; | ||
| 48 | template< unsigned Num, typename... Rules > struct rep : internal::rep< Num, Rules... > {}; | ||
| 49 | template< unsigned Max, typename... Rules > struct rep_max : internal::rep_min_max< 0, Max, Rules... > {}; | ||
| 50 | template< unsigned Min, typename Rule, typename... Rules > struct rep_min : internal::rep_min< Min, Rule, Rules... > {}; | ||
| 51 | template< unsigned Min, unsigned Max, typename... Rules > struct rep_min_max : internal::rep_min_max< Min, Max, Rules... > {}; | ||
| 52 | template< unsigned Max, typename... Rules > struct rep_opt : internal::rep_opt< Max, Rules... > {}; | ||
| 53 | template< unsigned Amount > struct require : internal::require< Amount > {}; | ||
| 54 | template< typename... Rules > struct seq : internal::seq< Rules... > {}; | ||
| 55 | template< typename... Rules > struct sor : internal::sor< Rules... > {}; | ||
| 56 | template< typename Rule, typename... Rules > struct star : internal::star< Rule, Rules... > {}; | ||
| 57 | template< typename Cond, typename... Rules > struct star_must : internal::star_must< Cond, Rules... > {}; | ||
| 58 | template< typename State, typename... Rules > struct state : internal::state< State, Rules... > {}; | ||
| 59 | struct success : internal::trivial< true > {}; | ||
| 60 | template< typename... Rules > struct try_catch : internal::try_catch_type< parse_error, Rules... > {}; | ||
| 61 | template< typename Exception, typename... Rules > struct try_catch_type : internal::try_catch_type< Exception, Rules... > {}; | ||
| 62 | template< typename Cond, typename... Rules > struct until : internal::until< Cond, Rules... > {}; | ||
| 63 | // clang-format on | ||
| 64 | |||
| 65 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 66 | |||
| 67 | } // namespace tao | ||
| 68 | |||
| 69 | #endif | ||
diff --git a/MoonParser/pegtl/string_input.hpp b/MoonParser/pegtl/string_input.hpp new file mode 100644 index 0000000..a1c1f98 --- /dev/null +++ b/MoonParser/pegtl/string_input.hpp | |||
| @@ -0,0 +1,51 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_STRING_INPUT_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_STRING_INPUT_HPP | ||
| 6 | |||
| 7 | #include <string> | ||
| 8 | #include <utility> | ||
| 9 | |||
| 10 | #include "config.hpp" | ||
| 11 | #include "eol.hpp" | ||
| 12 | #include "memory_input.hpp" | ||
| 13 | #include "tracking_mode.hpp" | ||
| 14 | |||
| 15 | namespace tao | ||
| 16 | { | ||
| 17 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 18 | { | ||
| 19 | namespace internal | ||
| 20 | { | ||
| 21 | struct string_holder | ||
| 22 | { | ||
| 23 | const std::string data; | ||
| 24 | |||
| 25 | template< typename T > | ||
| 26 | explicit string_holder( T&& in_data ) | ||
| 27 | : data( std::forward< T >( in_data ) ) | ||
| 28 | { | ||
| 29 | } | ||
| 30 | }; | ||
| 31 | |||
| 32 | } // namespace internal | ||
| 33 | |||
| 34 | template< tracking_mode P = tracking_mode::IMMEDIATE, typename Eol = eol::lf_crlf, typename Source = std::string > | ||
| 35 | struct string_input | ||
| 36 | : private internal::string_holder, | ||
| 37 | public memory_input< P, Eol, Source > | ||
| 38 | { | ||
| 39 | template< typename T, typename... Ts > | ||
| 40 | explicit string_input( T&& in_data, Ts&&... ts ) | ||
| 41 | : internal::string_holder( std::forward< T >( in_data ) ), | ||
| 42 | memory_input< P, Eol, Source >( data.data(), data.size(), std::forward< Ts >( ts )... ) | ||
| 43 | { | ||
| 44 | } | ||
| 45 | }; | ||
| 46 | |||
| 47 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 48 | |||
| 49 | } // namespace tao | ||
| 50 | |||
| 51 | #endif | ||
diff --git a/MoonParser/pegtl/tracking_mode.hpp b/MoonParser/pegtl/tracking_mode.hpp new file mode 100644 index 0000000..7ed945b --- /dev/null +++ b/MoonParser/pegtl/tracking_mode.hpp | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_TRACKING_MODE_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_TRACKING_MODE_HPP | ||
| 6 | |||
| 7 | #include "config.hpp" | ||
| 8 | |||
| 9 | namespace tao | ||
| 10 | { | ||
| 11 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 12 | { | ||
| 13 | enum class tracking_mode : bool | ||
| 14 | { | ||
| 15 | IMMEDIATE, | ||
| 16 | LAZY | ||
| 17 | }; | ||
| 18 | |||
| 19 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 20 | |||
| 21 | } // namespace tao | ||
| 22 | |||
| 23 | #endif | ||
diff --git a/MoonParser/pegtl/utf16.hpp b/MoonParser/pegtl/utf16.hpp new file mode 100644 index 0000000..faa7180 --- /dev/null +++ b/MoonParser/pegtl/utf16.hpp | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | // Copyright (c) 2015-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_UTF16_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_UTF16_HPP | ||
| 6 | |||
| 7 | #include "config.hpp" | ||
| 8 | |||
| 9 | #include "internal/peek_utf16.hpp" | ||
| 10 | #include "internal/result_on_found.hpp" | ||
| 11 | #include "internal/rules.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace utf16 | ||
| 18 | { | ||
| 19 | // clang-format off | ||
| 20 | struct any : internal::any< internal::peek_utf16 > {}; | ||
| 21 | template< char32_t... Cs > struct not_one : internal::one< internal::result_on_found::FAILURE, internal::peek_utf16, Cs... > {}; | ||
| 22 | template< char32_t Lo, char32_t Hi > struct not_range : internal::range< internal::result_on_found::FAILURE, internal::peek_utf16, Lo, Hi > {}; | ||
| 23 | template< char32_t... Cs > struct one : internal::one< internal::result_on_found::SUCCESS, internal::peek_utf16, Cs... > {}; | ||
| 24 | template< char32_t Lo, char32_t Hi > struct range : internal::range< internal::result_on_found::SUCCESS, internal::peek_utf16, Lo, Hi > {}; | ||
| 25 | template< char32_t... Cs > struct ranges : internal::ranges< internal::peek_utf16, Cs... > {}; | ||
| 26 | template< char32_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::SUCCESS, internal::peek_utf16, Cs >... > {}; | ||
| 27 | // clang-format on | ||
| 28 | |||
| 29 | } // namespace utf16 | ||
| 30 | |||
| 31 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 32 | |||
| 33 | } // namespace tao | ||
| 34 | |||
| 35 | #endif | ||
diff --git a/MoonParser/pegtl/utf32.hpp b/MoonParser/pegtl/utf32.hpp new file mode 100644 index 0000000..848137b --- /dev/null +++ b/MoonParser/pegtl/utf32.hpp | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_UTF32_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_UTF32_HPP | ||
| 6 | |||
| 7 | #include "config.hpp" | ||
| 8 | |||
| 9 | #include "internal/peek_utf32.hpp" | ||
| 10 | #include "internal/result_on_found.hpp" | ||
| 11 | #include "internal/rules.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace utf32 | ||
| 18 | { | ||
| 19 | // clang-format off | ||
| 20 | struct any : internal::any< internal::peek_utf32 > {}; | ||
| 21 | template< char32_t... Cs > struct not_one : internal::one< internal::result_on_found::FAILURE, internal::peek_utf32, Cs... > {}; | ||
| 22 | template< char32_t Lo, char32_t Hi > struct not_range : internal::range< internal::result_on_found::FAILURE, internal::peek_utf32, Lo, Hi > {}; | ||
| 23 | template< char32_t... Cs > struct one : internal::one< internal::result_on_found::SUCCESS, internal::peek_utf32, Cs... > {}; | ||
| 24 | template< char32_t Lo, char32_t Hi > struct range : internal::range< internal::result_on_found::SUCCESS, internal::peek_utf32, Lo, Hi > {}; | ||
| 25 | template< char32_t... Cs > struct ranges : internal::ranges< internal::peek_utf32, Cs... > {}; | ||
| 26 | template< char32_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::SUCCESS, internal::peek_utf32, Cs >... > {}; | ||
| 27 | // clang-format on | ||
| 28 | |||
| 29 | } // namespace utf32 | ||
| 30 | |||
| 31 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 32 | |||
| 33 | } // namespace tao | ||
| 34 | |||
| 35 | #endif | ||
diff --git a/MoonParser/pegtl/utf8.hpp b/MoonParser/pegtl/utf8.hpp new file mode 100644 index 0000000..9ec046e --- /dev/null +++ b/MoonParser/pegtl/utf8.hpp | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | // Copyright (c) 2014-2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_UTF8_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_UTF8_HPP | ||
| 6 | |||
| 7 | #include "config.hpp" | ||
| 8 | |||
| 9 | #include "internal/peek_utf8.hpp" | ||
| 10 | #include "internal/result_on_found.hpp" | ||
| 11 | #include "internal/rules.hpp" | ||
| 12 | |||
| 13 | namespace tao | ||
| 14 | { | ||
| 15 | namespace TAOCPP_PEGTL_NAMESPACE | ||
| 16 | { | ||
| 17 | namespace utf8 | ||
| 18 | { | ||
| 19 | // clang-format off | ||
| 20 | struct any : internal::any< internal::peek_utf8 > {}; | ||
| 21 | template< char32_t... Cs > struct not_one : internal::one< internal::result_on_found::FAILURE, internal::peek_utf8, Cs... > {}; | ||
| 22 | template< char32_t Lo, char32_t Hi > struct not_range : internal::range< internal::result_on_found::FAILURE, internal::peek_utf8, Lo, Hi > {}; | ||
| 23 | template< char32_t... Cs > struct one : internal::one< internal::result_on_found::SUCCESS, internal::peek_utf8, Cs... > {}; | ||
| 24 | template< char32_t Lo, char32_t Hi > struct range : internal::range< internal::result_on_found::SUCCESS, internal::peek_utf8, Lo, Hi > {}; | ||
| 25 | template< char32_t... Cs > struct ranges : internal::ranges< internal::peek_utf8, Cs... > {}; | ||
| 26 | template< char32_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::SUCCESS, internal::peek_utf8, Cs >... > {}; | ||
| 27 | // clang-format on | ||
| 28 | |||
| 29 | } // namespace utf8 | ||
| 30 | |||
| 31 | } // namespace TAOCPP_PEGTL_NAMESPACE | ||
| 32 | |||
| 33 | } // namespace tao | ||
| 34 | |||
| 35 | #endif | ||
diff --git a/MoonParser/pegtl/version.hpp b/MoonParser/pegtl/version.hpp new file mode 100644 index 0000000..867d5e4 --- /dev/null +++ b/MoonParser/pegtl/version.hpp | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | // Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey | ||
| 2 | // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ | ||
| 3 | |||
| 4 | #ifndef TAOCPP_PEGTL_INCLUDE_VERSION_HPP | ||
| 5 | #define TAOCPP_PEGTL_INCLUDE_VERSION_HPP | ||
| 6 | |||
| 7 | #define TAOCPP_PEGTL_VERSION "2.1.2" | ||
| 8 | |||
| 9 | #define TAOCPP_PEGTL_VERSION_MAJOR 2 | ||
| 10 | #define TAOCPP_PEGTL_VERSION_MINOR 1 | ||
| 11 | #define TAOCPP_PEGTL_VERSION_PATCH 2 | ||
| 12 | |||
| 13 | #endif | ||
diff --git a/MoonParser/slice.cpp b/MoonParser/slice.cpp new file mode 100644 index 0000000..7caddbc --- /dev/null +++ b/MoonParser/slice.cpp | |||
| @@ -0,0 +1,119 @@ | |||
| 1 | /** | ||
| 2 | * Copyright (C) 2017, IppClub. All rights reserved. | ||
| 3 | * | ||
| 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 5 | * of this software and associated documentation files (the "Software"), to deal | ||
| 6 | * in the Software without restriction, including without limitation the rights | ||
| 7 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| 8 | * copies of the Software, and to permit persons to whom the Software is | ||
| 9 | * furnished to do so, subject to the following conditions: | ||
| 10 | * | ||
| 11 | * The above copyright notice and this permission notice shall be included in | ||
| 12 | * all copies or substantial portions of the Software. | ||
| 13 | * | ||
| 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| 19 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
| 20 | * SOFTWARE. | ||
| 21 | */ | ||
| 22 | |||
| 23 | #include "Slice.h" | ||
| 24 | #include <cstdlib> | ||
| 25 | |||
| 26 | namespace silly { | ||
| 27 | |||
| 28 | namespace slice { | ||
| 29 | |||
| 30 | const std::string Slice::Empty; | ||
| 31 | |||
| 32 | int Slice::compare(const Slice &rhs) const { | ||
| 33 | int ret = 0; | ||
| 34 | |||
| 35 | // It's illegal to pass nullptr to memcmp. | ||
| 36 | if (str_ && rhs.str_) | ||
| 37 | ret = memcmp(str_, rhs.str_, len_); | ||
| 38 | |||
| 39 | if (ret == 0) { | ||
| 40 | // Use len_ - rhs.len_ as returned value may cause overflow | ||
| 41 | // of size_t type length. Therefore +1, -1 are returned here. | ||
| 42 | if (len_ < rhs.len_) | ||
| 43 | return -1; | ||
| 44 | else if (len_ > rhs.len_) | ||
| 45 | return 1; | ||
| 46 | } | ||
| 47 | return ret; | ||
| 48 | } | ||
| 49 | |||
| 50 | std::string Slice::getFilePath() const { | ||
| 51 | std::string filename = toString(); | ||
| 52 | size_t pos = filename.find_last_of("/\\"); | ||
| 53 | if (pos == std::string::npos) | ||
| 54 | { | ||
| 55 | return Slice::Empty; | ||
| 56 | } | ||
| 57 | return filename.substr(0, pos) + "/"; | ||
| 58 | } | ||
| 59 | |||
| 60 | std::string Slice::getFileName() const { | ||
| 61 | std::string filename = toString(); | ||
| 62 | size_t pos = filename.find_last_of("/\\"); | ||
| 63 | if (pos == std::string::npos) { | ||
| 64 | return Slice::Empty; | ||
| 65 | } | ||
| 66 | return filename.substr(pos+1); | ||
| 67 | } | ||
| 68 | |||
| 69 | std::string Slice::toLower() const { | ||
| 70 | std::string tmp = toString(); | ||
| 71 | for (size_t i = 0; i < tmp.length(); i++) { | ||
| 72 | tmp[i] = (char)tolower(tmp[i]); | ||
| 73 | } | ||
| 74 | return tmp; | ||
| 75 | } | ||
| 76 | |||
| 77 | std::string Slice::toUpper() const { | ||
| 78 | std::string tmp = toString(); | ||
| 79 | for (size_t i = 0; i < tmp.length(); i++) { | ||
| 80 | tmp[i] = (char)toupper(tmp[i]); | ||
| 81 | } | ||
| 82 | return tmp; | ||
| 83 | } | ||
| 84 | |||
| 85 | std::string Slice::getFileExtension() const { | ||
| 86 | std::string filename = toString(); | ||
| 87 | size_t pos = filename.rfind('.'); | ||
| 88 | if (pos == std::string::npos) { | ||
| 89 | return Slice::Empty; | ||
| 90 | } | ||
| 91 | return Slice(filename.substr(pos + 1)).toLower(); | ||
| 92 | } | ||
| 93 | |||
| 94 | std::list<Slice> Slice::split(const Slice& delims) const { | ||
| 95 | std::string text = toString(); | ||
| 96 | std::string delimers = delims.toString(); | ||
| 97 | std::list<Slice> tokens; | ||
| 98 | std::size_t start = text.find_first_not_of(delimers), end = 0; | ||
| 99 | while ((end = text.find_first_of(delimers, start)) != std::string::npos) { | ||
| 100 | tokens.push_back(Slice(str_ + start, end - start)); | ||
| 101 | start = text.find_first_not_of(delimers, end); | ||
| 102 | } | ||
| 103 | if (start != std::string::npos) { | ||
| 104 | tokens.push_back(Slice(str_ + start)); | ||
| 105 | } | ||
| 106 | return tokens; | ||
| 107 | } | ||
| 108 | |||
| 109 | float Slice::stof(const Slice& str) { | ||
| 110 | return static_cast<float>(std::atof(str.toString().c_str())); | ||
| 111 | } | ||
| 112 | |||
| 113 | int Slice::stoi(const Slice& str) { | ||
| 114 | return std::atoi(str.toString().c_str()); | ||
| 115 | } | ||
| 116 | |||
| 117 | } // namespace slice | ||
| 118 | |||
| 119 | } // namespace silly | ||
diff --git a/MoonParser/slice.h b/MoonParser/slice.h new file mode 100644 index 0000000..60e0ae1 --- /dev/null +++ b/MoonParser/slice.h | |||
| @@ -0,0 +1,157 @@ | |||
| 1 | /** | ||
| 2 | * Copyright (C) 2017, IppClub. All rights reserved. | ||
| 3 | * | ||
| 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 5 | * of this software and associated documentation files (the "Software"), to deal | ||
| 6 | * in the Software without restriction, including without limitation the rights | ||
| 7 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| 8 | * copies of the Software, and to permit persons to whom the Software is | ||
| 9 | * furnished to do so, subject to the following conditions: | ||
| 10 | * | ||
| 11 | * The above copyright notice and this permission notice shall be included in | ||
| 12 | * all copies or substantial portions of the Software. | ||
| 13 | * | ||
| 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| 19 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
| 20 | * SOFTWARE. | ||
| 21 | */ | ||
| 22 | |||
| 23 | #pragma once | ||
| 24 | |||
| 25 | #include <cassert> | ||
| 26 | #include <cstring> | ||
| 27 | #include <string> | ||
| 28 | #include <list> | ||
| 29 | |||
| 30 | namespace silly { | ||
| 31 | |||
| 32 | namespace slice { | ||
| 33 | // A Slice object wraps a "const char *" or a "const std::string&" but | ||
| 34 | // without copying their contents. | ||
| 35 | class Slice { | ||
| 36 | private: | ||
| 37 | struct TrustedInitTag {}; | ||
| 38 | constexpr Slice(const char* s, size_t n, TrustedInitTag) : str_(s), len_(n) {} | ||
| 39 | |||
| 40 | public: | ||
| 41 | // implicit conversion from std::string to Slice | ||
| 42 | Slice(const std::string &s) : Slice(s.data(), s.size()) {} | ||
| 43 | |||
| 44 | Slice(const char *s) : Slice(s, s ? strlen(s) : 0) {} | ||
| 45 | |||
| 46 | Slice(const char *s, size_t n) : str_(s), len_(n) {} | ||
| 47 | |||
| 48 | Slice(std::pair<const char*,size_t> sp) : str_(sp.first), len_(sp.second) {} | ||
| 49 | |||
| 50 | constexpr Slice(std::nullptr_t p = nullptr) : str_(nullptr), len_(0) {} | ||
| 51 | |||
| 52 | operator std::string() const { | ||
| 53 | return std::string(str_, len_); | ||
| 54 | } | ||
| 55 | |||
| 56 | const char &operator[](size_t n) const { | ||
| 57 | return str_[n]; | ||
| 58 | } | ||
| 59 | |||
| 60 | size_t size() const { | ||
| 61 | return len_; | ||
| 62 | } | ||
| 63 | |||
| 64 | const char *rawData() const { | ||
| 65 | return str_; | ||
| 66 | } | ||
| 67 | |||
| 68 | std::string toString() const { | ||
| 69 | return std::string(str_, len_); | ||
| 70 | } | ||
| 71 | |||
| 72 | bool empty() const { | ||
| 73 | return len_ == 0; | ||
| 74 | } | ||
| 75 | |||
| 76 | // similar with std::string::compare | ||
| 77 | // http://en.cppreference.com/w/cpp/string/basic_string/compare | ||
| 78 | int compare(const Slice &rhs) const; | ||
| 79 | |||
| 80 | void skip(size_t n) { | ||
| 81 | assert(n <= len_); | ||
| 82 | str_ += n; | ||
| 83 | len_ -= n; | ||
| 84 | } | ||
| 85 | |||
| 86 | void copyTo(char *dest, bool appendEndingNull = true) const { | ||
| 87 | memcpy(dest, str_, len_); | ||
| 88 | if (appendEndingNull) { | ||
| 89 | dest[len_] = '\0'; | ||
| 90 | } | ||
| 91 | } | ||
| 92 | |||
| 93 | Slice &trimSpace() { | ||
| 94 | assert(len_ > 0); | ||
| 95 | size_t start = 0, end = len_ - 1; | ||
| 96 | while (start < end && isspace(str_[start])) { | ||
| 97 | start++; | ||
| 98 | } | ||
| 99 | while (start < end && isspace(str_[end])) { | ||
| 100 | end--; | ||
| 101 | } | ||
| 102 | str_ += start; | ||
| 103 | len_ = end - start + 1; | ||
| 104 | return *this; | ||
| 105 | } | ||
| 106 | |||
| 107 | typedef const char *const_iterator; | ||
| 108 | |||
| 109 | const_iterator begin() const { | ||
| 110 | return str_; | ||
| 111 | } | ||
| 112 | |||
| 113 | const_iterator end() const { | ||
| 114 | return str_ + len_; | ||
| 115 | } | ||
| 116 | |||
| 117 | std::string getFilePath() const; | ||
| 118 | std::string getFileName() const; | ||
| 119 | std::string getFileExtension() const; | ||
| 120 | std::string toLower() const; | ||
| 121 | std::string toUpper() const; | ||
| 122 | std::list<Slice> split(const Slice& delimer) const; | ||
| 123 | |||
| 124 | static const std::string Empty; | ||
| 125 | static float stof(const Slice& str); | ||
| 126 | static int stoi(const Slice& str); | ||
| 127 | |||
| 128 | constexpr friend Slice operator"" _slice(const char* s, size_t n); | ||
| 129 | private: | ||
| 130 | const char *str_; | ||
| 131 | size_t len_; | ||
| 132 | }; | ||
| 133 | |||
| 134 | inline Slice trimSpace(const Slice &s) { | ||
| 135 | Slice tmp = s; | ||
| 136 | return tmp.trimSpace(); | ||
| 137 | } | ||
| 138 | |||
| 139 | inline bool operator==(const Slice &lhs, const Slice &rhs) { | ||
| 140 | return lhs.compare(rhs) == 0; | ||
| 141 | } | ||
| 142 | |||
| 143 | inline bool operator!=(const Slice &lhs, const Slice &rhs) { | ||
| 144 | return !(lhs == rhs); | ||
| 145 | } | ||
| 146 | |||
| 147 | inline std::string operator+(const std::string& lhs, const Slice &rhs) { | ||
| 148 | return lhs + rhs.toString(); | ||
| 149 | } | ||
| 150 | |||
| 151 | constexpr Slice operator"" _slice(const char* s, size_t n) { | ||
| 152 | return Slice(s, n, Slice::TrustedInitTag{}); | ||
| 153 | } | ||
| 154 | |||
| 155 | } // namespace slice | ||
| 156 | |||
| 157 | } // namespace silly | ||
