...ããªãã¡ãåçŽãªæ§é ããè€éãªæ§é ãæ§ç¯ããããšã«ãããããã»ã©è€éã§ã¯ãªãæ§é çšã®LLæ§æè§£æãæžãæ¹æ³ã ææãXMLã«äŒŒãæ§é ãäœããã®ããŒã¿URLãªã©ãè€éã§ãªããã®ãè§£æããå¿
èŠããããŸããéåžžã¯ãèªã¿ã¥ããèªã¿ã«ããã³ãŒãã®ã·ãŒãããããã«è€éã§ããªãããŒãªè§£æã©ã€ãã©ãªãžã®äŸåé¢ä¿ã®ããããã§ãã ããã§ã¯ãããã€ãã®æåãªã¢ã€ãã¢ïŒãã®ãã¡ã®ããã€ãã¯Habréã§åºäŒã£ããã®ïŒãçµã¿åãããŠãéåžžã«è€éãªããŒãµãŒããããå°æ°ã®ã³ãŒãè¡ãç¶æããªãããã§ããã ãã·ã³ãã«ãã€ç°¡æœã«èšè¿°ããæ¹æ³ã瀺ããŸãã ããšãã°ãXMLã«äŒŒãæ§é ããŒãµãŒãäœæããŸãã ã¯ããæ³šæãåŒãããã«ããã«åçãæ¿å
¥ããŸããã èšäºã«ã¯åçããŸã£ãããªãã®ã§ãèªã¿ã«ãããªããŸãã
äž»ãªã¢ã€ãã¢
å
¥åããã¹ãã®åéšåãåå¥ã®é¢æ°ïŒããã¿ãŒã³ããšåŒã³ãŸãããïŒã«ãã£ãŠè§£æããããããã®é¢æ°ãçµã¿åãããããšã§ãããè€éãªããã¹ããè§£æã§ããããè€éãªé¢æ°ãååŸã§ãããšããäºå®ã«ãããŸãã ãããã£ãŠããã¿ãŒã³ãšã¯ãè§£æãå®è¡ãã
execã¡ãœãããæã€ãªããžã§ã¯ãã§ãã ãã®é¢æ°ã¯ãäœããã©ãã§è§£æãããã瀺ããè§£æãããå Žæãšè§£æãçµäºããå Žæãè¿ããŸãã
var digit = { exec: function (str, pos) { var chr = str.charAt(pos); if (chr >= "0" && chr <= "9") return { res: +chr, end: pos + 1}; } };
çŸåšãæ°åã¯è§£ææ°åãã¿ãŒã³ã§ãããæ¬¡ã®ããã«äœ¿çšã§ããŸãã
assert.deepEqual(digit.exec("5", 0), { res: 5, end: 1 }); assert.deepEqual(digit.exec("Q", 0), void 0);
ãªããã®ãããªã€ã³ã¿ãŒãã§ãŒã¹ãªã®ãïŒ JSã«ã¯ãéåžžã«ãã䌌ãã€ã³ã¿ãŒãã§ãŒã¹ãæã€çµã¿èŸŒã¿ã®RegExpã¯ã©ã¹ãããããã§ãã 䟿å®äžããããã®ãã¿ãŒã³ãã€ã³ã¹ã¿ã³ã¹ãšããPatternã¯ã©ã¹ïŒRegExpã®é¡äŒŒç©ãšããŠèŠãŠãã ããïŒãå°å
¥ããŸãã
function Pattern(exec) { this.exec = exec; }
次ã«ãå€å°è€éãªããŒãµãŒã§åœ¹ç«ã€ããã€ãã®åçŽãªãã¿ãŒã³ã玹ä»ããŸãã
ã·ã³ãã«ãªãã¿ãŒã³
æãåçŽãªãã¿ãŒã³ã¯txtã§ã-åºå®ãããããããããæ±ºããããããã¹ãè¡ãè§£æããŸãïŒ
function txt(text) { return new Pattern(function (str, pos) { if (str.substr(pos, text.length) == text) return { res: text, end: pos + text.length }; }); }
次ã®ããã«é©çšãããŸãã
assert.deepEqual(txt("abc").exec("abc", 0), { res: "abc", end: 3 }); assert.deepEqual(txt("abc").exec("def", 0), void 0);
JSã«ããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãããå ŽåïŒC ++ãªã©ïŒãããè€éãªãã¿ãŒã³ãæ§ç¯ããã³ã³ããã¹ãã§ãtxtïŒãabcãïŒãšã³ããªããabcãã«ççž®ã§ããŸãã
次ã«ãæ£èŠè¡šçŸã®é¡äŒŒç©ã玹ä»ããrgxãšåŒã³ãŸãã
function rgx(regexp) { return new Pattern(function (str, pos) { var m = regexp.exec(str.slice(pos)); if (m && m.index === 0) return { res: m[0], end: pos + m[0].length }; }); }
次ã®ããã«é©çšããŸãã
assert.deepEqual(rgx(/\d+/).exec("123", 0), { res: "123", end: 3 }); assert.deepEqual(rgx(/\d+/).exec("abc", 0), void 0);
ç¹°ãè¿ããŸãããJSã«ããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãããå ŽåãrgxïŒ/ abc /ïŒãšã³ããªã¯/ abc /ã«ççž®ã§ããŸãã
çµã¿åãããã¿ãŒã³
次ã«ãæ¢åã®ãã¿ãŒã³ãçµã¿åãããè€æ°ã®ãã¿ãŒã³ãå
¥åããå¿
èŠããããŸãã ãããã®ãã³ã³ãããŒã¿ãŒãã®äžã§æãåçŽãªãã®ã¯optã§ããããã«ãããä»»æã®ãã¿ãŒã³ããªãã·ã§ã³ã«ãªããŸãã å
ã®ãã¿ãŒã³pãããã¹ããè§£æã§ããªãå Žåãåãããã¹ãã®optïŒpïŒã¯ãã¹ãŠãè§£æãããè§£æçµæã®ã¿ã空ã§ãããšèšããŸãïŒ
function opt(pattern) { return new Pattern(function (str, pos) { return pattern.exec(str, pos) || { res: void 0, end: pos }; }); }
䜿çšäŸïŒ
assert.deepEqual(opt(txt("abc")).exec("abc"), { res: "abc", end: 3 }); assert.deepEqual(opt(txt("abc")).exec("123"), { res: void 0, end: 0 });
JSã§æŒç®åã®ãªãŒããŒããŒããšããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãå¯èœãªå Žåãã¬ã³ãŒãoptïŒpïŒãp ||ã«æžããããšãã§ããŸãã void 0ïŒããã¯ãoptã®å®è£
æ¹æ³ããæããã«ããããŸãïŒã
次ã«è€éãªã³ã³ãããŒã¿ã¯excã§ããæåã®ãã¿ãŒã³ãè§£æã§ãã2çªç®ã®ãã¿ãŒã³ãè§£æã§ããªããã®ã®ã¿ãè§£æããŸãã
function exc(pattern, except) { return new Pattern(function (str, pos) { return !except.exec(str, pos) && pattern.exec(str, pos); }); }
WïŒpïŒãpãã¿ãŒã³è§£æããããã¹ãã®ã»ããã§ããå ŽåãWïŒexcïŒpãqïŒïŒ= WïŒpïŒ\ WïŒqïŒã ããã¯ãããšãã°ãæåHãé€ããã¹ãŠã®å€§æåãè§£æããå¿
èŠãããå Žåã«äŸ¿å©ã§ãã
var p = exc(rgx(/[AZ]/), txt("H")); assert.deepEqual(p.exec("R", 0), { res: "R", end: 1 }); assert.deepEqual(p.exec("H", 0), void 0);
JSã«æŒç®åã®ãªãŒããŒããŒããããå ŽåãexcïŒp1ãp2ïŒãp1-p2ãŸãã¯toïŒP2 && p1ã«æžããããšãã§ããŸãïŒãã ãããã®ãããçµã¿åãããã¿ãŒã³all /ãå°å
¥ããå¿
èŠããããããã¯&&æŒç®åãšããŠæ©èœããŸãïŒ ã
次ã«ãã³ã³ãããŒã¿ãã¿ãŒã³ããããŸããããã€ãã®ãã¿ãŒã³ãåãããããã®ãã¿ãŒã³ã®æåã®ãã¿ãŒã³ãè§£æããæ°ãããã¿ãŒã³ãäœæããŸãã WïŒanyïŒp1ãp2ãp3ã...ïŒïŒ= WïŒp1ïŒv WïŒp2ïŒv WïŒp3ïŒv ...
function any(...patterns) { return new Pattern(function (str, pos) { for (var r, i = 0; i < patterns.length; i++) if (r = patterns[i].exec(str, pos)) return r; }); }
[] .slice.callïŒargumentsã0ïŒã®ãããªäžåšçšãªã³ãŒããé¿ããããã«ã...ãã¿ãŒã³ïŒèª¿åïŒrest_parametersïŒæ§æã䜿çšããŸããã anyã®äœ¿çšäŸïŒ
var p = any(txt("abc"), txt("def")); assert.deepEqual(p.exec("abc", 0), { res: "abc", end: 3 }); assert.deepEqual(p.exec("def", 0), { res: "def", end: 3 }); assert.deepEqual(p.exec("ABC", 0), void 0);
JSã«æŒç®åã®ãªãŒããŒããŒããããå Žåãä»»æã®ïŒp1ãp2ïŒãp1 ||ã«æžããããšãã§ããŸãã p2ã
次ã®ã³ã³ãããŒã¿ãŒãã¿ãŒã³ã¯seqã§ã-ãã¿ãŒã³ã®ã·ãŒã±ã³ã¹ã«ãã£ãŠäžããããããã¹ããé æ¬¡è§£æããçµæã®é
åãçæããŸãã
function seq(...patterns) { return new Pattern(function (str, pos) { var i, r, end = pos, res = []; for (i = 0; i < patterns.length; i++) { r = patterns[i].exec(str, end); if (!r) return; res.push(r.res); end = r.end; } return { res: res, end: end }; }); }
次ã®ããã«é©çšãããŸãã
var p = seq(txt("abc"), txt("def")); assert.deepEqual(p.exec("abcdef"), { res: ["abc", "def"], end: 6 }); assert.deepEqual(p.exec("abcde7"), void 0);
JSã«æŒç®åã®ãªãŒããŒããŒããããå ŽåãseqïŒp1ãp2ïŒãp1ãp2ã«æžããããšãã§ããŸãïŒã³ã³ãæŒç®åããªãŒããŒããŒããããŸãïŒã
ãããŠæåŸã«ãrepã³ã³ãããŒã¿ãŒãã¿ãŒã³-æ¢ç¥ã®ãã¿ãŒã³ãããã¹ãã«äœåºŠãé©çšããçµæã®é
åãçæããŸãã ååãšããŠãããã¯ãããšãã°ã«ã³ãã§åºåãããåãã¿ã€ãã®ç¹å®ã®æ§é ã®è§£æã«äœ¿çšããããããrepã¯2ã€ã®åŒæ°ãåããŸããçµæãè峿·±ãã¡ã€ã³ãã¿ãŒã³ãšãçµæãç Žæ£ãããåé¢ãã¿ãŒã³ã§ãã
function rep(pattern, separator) { var separated = !separator ? pattern : seq(separator, pattern).then(r => r[1]); return new Pattern(function (str, pos) { var res = [], end = pos, r = pattern.exec(str, end); while (r && r.end > end) { res.push(r.res); end = r.end; r = separated.exec(str, end); } return { res: res, end: end }; }); }
蚱容ãããç¹°ãè¿ãæ°ãå¶åŸ¡ãããã©ã¡ãŒã¿ãŒminããã³maxãããã«è¿œå ã§ããŸãã ããã§ã¯ã颿°ïŒzïŒ{return z [1]}ãèšè¿°ããªãããã«ãç¢å°é¢æ°r => r [1]ïŒèª¿åïŒarrow_functionsïŒã䜿çšããŸããã ãã¿ãŒã³ïŒthenã䜿çšããŠrepãseqã«æžå°ããããšã«æ³šæããŠãã ããïŒPromiseïŒthenããååŸããã¢ã€ãã¢ïŒïŒ
function Pattern(exec) { ... this.then = function (transform) { return new Pattern(function (str, pos) { var r = exec(str, pos); return r && { res: transform(r.res), end: r.end }; }); }; }
ãã®æ¹æ³ã§ã¯ãæåã®çµæã«ä»»æã®å€æãé©çšããããšã«ãããå¥ã®ãã¿ãŒã³ããæšæž¬ã§ããŸãã ãšããã§ãHaskellã®å°éå®¶ã¯ããã®ãã¿ãŒã³ïŒããã¿ãŒã³ããã¢ãããäœããšèšãããšã¯å¯èœã§ããïŒ
ããŠãæ
åœè
ã¯æ¬¡ã®ããã«é©çšãããŸãã
var p = rep(rgx(/\d+/), txt(",")); assert.deepEqual(p.exec("1,23,456", 0), { res: ["1", "23", "456"], end: 8 }); assert.deepEqual(p.exec("123ABC", 0), { res: ["123"], end: 3 }); assert.deepEqual(p.exec("ABC", 0), void 0);
æ
åœè
ã®ãªãã¬ãŒã¿ãŒã®ãªãŒããŒããŒããšã®æç¢ºãªé¡æšã¯ç§ã«ã¯çºçããŸããã
çµæã¯ããããã®rep / seq / anyã®ãã¹ãŠã«ã€ããŠçŽ70è¡ã§ãã ããã§ã³ã³ãããŒã¿ãŒãã¿ãŒã³ã®ãªã¹ãã宿ããXMLã«äŒŒãããã¹ããèªèãããã¿ãŒã³ã®å®éã®æ§ç¯ã«é²ãããšãã§ããŸãã
XMLã®ãããªããã¹ãã®ããŒãµãŒ
ãã®ãããªXMLã®ãããªããã¹ãã«å¶éããŸãã
<?xml version="1.0" encoding="utf-8"?> <book title="Book 1"> <chapter title="Chapter 1"> <paragraph>123</paragraph> <paragraph>456</paragraph> </chapter> <chapter title="Chapter 2"> <paragraph>123</paragraph> <paragraph>456</paragraph> <paragraph>789</paragraph> </chapter> <chapter title="Chapter 3"> ... </chapter> </book>
ãŸããname = "value"ãšãã圢åŒã®ååä»ã屿§ãèªèãããã¿ãŒã³ãèšè¿°ããŸããããã¯æããã«XMLã§ããèŠãããŸãã
var name = rgx(/[az]+/i).then(s => s.toLowerCase()); var char = rgx(/[^"&]/i); var quoted = seq(txt('"'), rep(char), txt('"')).then(r => r[1].join('')); var attr = seq(name, txt('='), quoted).then(r => ({ name: r[0], value: r[2] }));
ããã§ãattrã¯ååä»ã屿§ãæåå圢åŒã®å€ã§è§£æããquoted-åŒçšç¬Šã§æååãè§£æããŸããchar-æååå
ã®1æåãè§£æããŸãïŒãããå¥ã®ãã¿ãŒã³ãšããŠèšè¿°ããå¿
èŠããããŸããïŒ ïŒããã ãnameã¯å±æ§åãè§£æããŸãïŒå€§æåãšå°æåã®äž¡æ¹ãè§£æããŸããããã¹ãŠã®æåãå°ããè§£ææžã¿ã®ååãè¿ããŸãïŒã attrã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
assert.deepEqual( attr.exec('title="Chapter 1"', 0), { res: { name: "title", value: "Chapter 1" }, end: 17 });
次ã«ã<ïŒXml ...ïŒ>ã®ãããªããããŒãè§£æã§ãããã¿ãŒã³ãäœæããŸãã
var wsp = rgx(/\s+/); var attrs = rep(attr, wsp).then(r => { var m = {}; r.forEach(a => (m[a.name] = a.value)); return m; }); var header = seq(txt('<?xml'), wsp, attrs, txt('?>')).then(r => r[2]);
ããã§ãwspã¯1ã€ä»¥äžã®ã¹ããŒã¹ãè§£æããattrsã¯1ã€ä»¥äžã®ååä»ã屿§ãè§£æããè§£æãããã®ãèŸæžã®åœ¢åŒã§è¿ããŸãïŒrepã¯ååãšå€ã®ãã¢ã®é
åãè¿ããŸãããèŸæžã¯ãã䟿å©ãªã®ã§ãé
åã¯å
éšã®èŸæžã«å€æãããŸãïŒãããããŒã¯ããããŒãè§£æããåããã£ã¯ã·ã§ããªã®åœ¢åŒã§ã¿ã€ãã«å±æ§ã®ã¿ãè¿ããŸãã
assert.deepEqual( header.exec('<?xml version="1.0" encoding="utf-8"?>', 0), { res: { version: "1.0", encoding: "utf-8" }, end: ... });
次ã«ã<node ...> ...ã®åœ¢åŒã®æ§æè§£æã«ç§»ããŸãããã
var text = rep(char).then(r => r.join('')); var subnode = new Pattern((str, pos) => node.exec(str, pos)); var node = seq( txt('<'), name, wsp, attrs, txt('>'), rep(any(text, subnode), opt(wsp)), txt('</'), name, txt('>')) .then(r => ({ name: r[1], attrs: r[3], nodes: r[5] }));
ããã§ã¯ãããã¹ãã¯ããŒãå
ã®ããã¹ããè§£æããxmlãšã³ãã£ãã£ãèªèããããã«åŠç¿ã§ããæåãã¿ãŒã³ã䜿çšãããµãããŒãã¯å
éšããŒãïŒå®éã«ã¯ãµãããŒã=ããŒãïŒãè§£æããããŒãã¯å±æ§ãšå
éšããŒãã§ããŒããè§£æããŸãã ãªããã®ãããªãµãããŒãã®ããªãããŒãªå®çŸ©ã§ããïŒ nodeã®å®çŸ©ã§nââodeãçŽæ¥åç
§ãããšïŒnode = seqïŒ...ãnodeã...ïŒãªã©ïŒãnodeã®å®çŸ©æã«ãã®å€æ°ã¯ãŸã 空ã§ããããšãããããŸãã ãµãããŒãã®ããªãã¯ã¯ããã®åŸªç°äŸåãæé€ââããŸãã
ããããŒãæã€ãã¡ã€ã«å
šäœãèªèãããã¿ãŒã³ã決å®ããããšã¯æ®ã£ãŠããŸãã
var xml = seq(header, node).then(r => ({ root: r[1], attrs: r[0] }));
ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã
assert.deepEqual( xml.exec(src), { attrs: { version: '1.0', encoding: 'utf-8' }, root: { name: 'book', attrs: { title: 'Book 1' }, nodes: [ { name: 'chapter', attrs: { title: 'Chapter 1' }, nodes: [...] }, ... ] } });
ããã§ã¯ã1ã€ã®åŒæ°ã§ãã¿ãŒã³ïŒexecãåŒã³åºããŸããããã®æå³ã¯ãæåããæååãè§£æããæåŸãŸã§è§£æãããããšã確èªããããšã§ãããæåŸãŸã§è§£æãããããããã®å Žæãžã®ãã€ã³ã¿ãªãã§è§£æããããã®ã ããè¿ãã ãã§ååã§ãããŒãµãŒã忢ããå ŽæïŒãããè¡ã®çµããã§ããããšã¯æ¢ã«ç¥ã£ãŠããŸãïŒïŒ
function Pattern(name, exec) { ... this.exec = function (str, pos) { var r = exec(str, pos || 0); return pos >= 0 ? r : !r ? null : r.end != str.length ? null : r.res; }; }
å®éã«ã¯ãããŒãµãŒå
šäœã20è¡ã«ãªã£ãŠããŸãïŒrepãseqãanyãªã©ãå®è£
ãã70è¡ã«ã€ããŠå¿ããªãã§ãã ããïŒã
var name = rgx(/[az]+/i).then(s => s.toLowerCase()); var char = rgx(/[^"&]/i); var quoted = seq(txt('"'), rep(char), txt('"')).then(r => r[1].join('')); var attr = seq(name, txt('='), quoted).then(r => ({ name: r[0], value: r[2] })); var wsp = rgx(/\s+/); var attrs = rep(attr, wsp).then(r => { var m = {}; r.forEach(a => (m[a.name] = a.value)); return m; }); var header = seq(txt('<?xml'), wsp, attrs, txt('?>')).then(r => r[2]); var text = rep(char).then(r => r.join('')); var subnode = new Pattern((str, pos) => node.exec(str, pos)); var node = seq( txt('<'), name, wsp, attrs, txt('>'), rep(any(text, subnode), opt(wsp)), txt('</'), name, txt('>')) .then(r => ({ name: r[1], attrs: r[3], nodes: r[5] })); var xml = seq(header, node).then(r => ({ root: r[1], attrs: r[0] }));
JSïŒãŸãã¯C ++ïŒã§æŒç®åããªãŒããŒããŒããããšã次ã®ããã«ãªããŸãã
var name = rgx(/[az]+/i).then(s => s.toLowerCase()); var char = rgx(/[^"&]/i); var quoted = ('"' + rep(char) + '"').then(r => r[1].join('')); var attr = (name + '=' + quoted).then(r => ({ name: r[0], value: r[2] })); var wsp = rgx(/\s+/); var attrs = rep(attr, wsp).then(r => { var m = {}; r.forEach(a => (m[a.name] = a.value)); return m; }); var header = ('<?xml' + wsp + attrs + '?>').then(r => r[2]); var text = rep(char).then(r => r.join('')); var subnode = new Pattern((str, pos) => node.exec(str, pos)); var node = ('<' + name + wsp + attrs + '>' + rep(text | subnode) + (wsp | null) + '</' + name + '>') .then(r => ({ name: r[1], attrs: r[3], nodes: r[5] })); var xml = (header + node).then(r => ({ root: r[1], attrs: r[0] }));
ããã§ã®å倿°ã¯1ã€ã®ABNFã«ãŒã«ã«å³å¯ã«å¯Ÿå¿ãããããRFCã®èšè¿°ïŒããã³ããã§ABNFãæ°ã«å
¥ã£ãŠããïŒã«åŸã£ãŠäœããè§£æããå¿
èŠãããå Žåããããã®ã«ãŒã«ã転éããããšã¯æ©æ¢°çãªåé¡ã§ãã ããã«ãABNFã«ãŒã«èªäœïŒããã³EBNFããã³PEGïŒã¯å³å¯ã«åœ¢åŒçã§ããããããããã®ã«ãŒã«ã®ããŒãµãŒãèšè¿°ããrepãseqãªã©ãåŒã³åºã代ããã«ã次ã®ããã«èšè¿°ã§ããŸãã
var dataurl = new ABNF('"data:" mime ";" attrs, "," data', { mime: /[az]+\/[az]+/i, attrs: ..., data: /.*/ }).then(r => ({ mime: r[1], attrs: r[3], data: r[5] }));
ãããŠãã€ãã®ããã«é©çšããŸãïŒ
assert.deepEqual( dataurl.exec('data:text/plain;charset="utf-8",how+are+you%3f'), { mime: "text/plain", attrs: { charset: "utf-8" }, data: "how are you?" });
ããã«ããã€ãã®ãã
è§£æã«å€±æããå Žåããã¿ãŒã³ïŒexecãnull /æªå®çŸ©ãè¿ãã®ã¯ãªãã§ããïŒ äŸå€ãã¹ããŒããªãã®ã¯ãªãã§ããïŒ ãã®ããã«äŸå€ã䜿çšãããšãããŒãµãŒã¯20ç§ããšã«é
ããªããŸãã äŸå€ã¯äŸå€çãªå Žåã«é©ããŠããŸãã
説æããæ¹æ³ã䜿çšãããšããã¹ãŠã®ç®çã«é©ããªãLLããŒãµãŒãäœæã§ããŸãã ããšãã°ã次ã®åœ¢åŒã®XMLãè§£æããå¿
èŠãããå Žå
<book attr1="..." attr2="..." ???
ãããç«ã£ãŠããå Žæã§??? /ããã³simple>ã®äž¡æ¹ã«ãªãããšããããŸãã LLããŒãµãŒãããããã¹ãŠ<book ...>ãšããŠè§£æããããšãããããã®å Žæã«ããå Žå??? >>ã§ããããšã倿ããå ŽåãããŒãµãŒã¯ãããã<book ... />ã§ãããšããä»®å®ã®äžã§ãè§£æãšããçŽãã«éåžžã«æéãããã£ããã¹ãŠãç Žæ£ããŸãã LRããŒãµãŒã«ã¯ãã®æ¬ ç¹ã¯ãããŸããããäœæããã®ã¯å°é£ã§ãã
ãŸããLLããŒãµãŒã¯ãåªå
é äœãç°ãªãæŒç®åãªã©ãããããŸããŸãªæ§æ/æ°åŒã®è§£æã«ã¯ããŸãé©ããŠããŸããã LLããŒãµãŒã¯ãã¡ããäœæã§ããŸãããããæ··ä¹±ããåäœãé
ããªããŸãã LRããŒãµãŒã¯ããèªäœã§æ··ä¹±ããŸãããé«éã§ãã ãããã£ãŠããã®ãããªåŒã¯ããããã Crockford
ããã
説æãã Prattã®ã¢ã«ãŽãªãºã ïŒãã®ãªã³ã¯ã玫è²ã®å Žåã¯ãããããç§ãããããŒãµãŒãããçè§£ããŠãããããããããããã¹ãŠèªãããšã«éå±ããŠããã§ãããïŒã
誰ãã圹ã«ç«ã€ãšãããªã ãã€ãŠãããŸããŸãªäžåšçšãã®ããŒãµãŒãäœæããŸããããäžèšã®æ¹æ³ã¯ç§ã«ãšã£ãŠçºèŠã§ããã