ããã¯ç§ã«ãšã£ãŠããªãäžè¬çã§ãã ã·ãŒã±ã³ã¹ã®é¢é£éšåã ããinitã©ãã«ã«è¿ãããã§ãã ãã®å ŽåãAssignmentExpressionã ãã§ãã
pattern:Pattern init:(_ "=" _ a:AssignmentExpression {return a})?
ã·ãŒã±ã³ã¹ãã次ã®åŒã ããè¿ã@åŒãè¿œå ããããšããå§ãããŸãã ãããã£ãŠãäžèšã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
pattern:Pattern init:(_ "=" _ @AssignmentExpression)?
é¢é£ããåé¡ïŒ
ãããäžè¬çãªåé¡ã§ããããšã«åæããŸãã ããããããã解決ãã䟡å€ããããã©ããã¯ããããŸããã èšãæããã°ããããååã«é »ç¹ã«çºçãããã©ããããããŠããããœãªã¥ãŒã·ã§ã³ãå®è£ ããããšã«ãã£ãŠPEG.jsã«è€éããè¿œå ããããšãæ£åœåããã®ã«ååãªèŠçãåŒãèµ·ãããã©ããã¯ããããŸããã
ãã®åé¡ã¯æªè§£æ±ºã®ãŸãŸã«ããŠã1.0.0以éã®æ€èšå¯Ÿè±¡ãšããŠããŒã¯ããŸãã
åæããŸããã ããã1.0ã§èŠããã§ãã ãããã@æ§æã«ã¯ããã»ã©ç±å¿ã§ã¯ãããŸããã IMHOã®æ¹ãè¯ãèãã¯ããããè¡ãããšã§ããããããã¬ãã«ãã®ã©ãã«ã1ã€ãããªãå Žåã¯ããã®ã©ãã«ãæé»çã«è¿ããŸãã ãããã£ãŠã代ããã«ïŒ
rule = space* a:(text space+ otherText)+ newLine* { return a; }
ããªããåŸãïŒ
rule = space* a:(text space+ otherText)+ newLine*
ãŸããã©ãã«ãç¹ã«æå³ã®ãããã®ã§ãªãå Žåã¯ã次ã®ããšãèš±å¯ããŸãã
rule = space* :(text space+ otherText)+ newLine*
ãããã£ãŠãã©ãã«åã¯å®å šã«ã¹ãããããŠãã ããã
@mulderr @æŒç®åã®æ¹ãåªããŠãããšæããŸãã
@ã®+ 1-ããã¯ç§ã®ã³ãŒãå šäœã§äœåºŠãç¹°ãè¿ãããŸãã
ãããè¡ãããã®ç°¡æœãªæ¹æ³ã«ã€ããŠã¯+1ã
ãã®çã¿ã¯ãES6ãç¢å°é¢æ°ã䜿çšããŠå¯ŸåŠããJSã®åé·ãªfunction
æ§æã®çã¿ã«äŒŒãŠããããã§ãã ãã¶ãã䌌ããããªãã®ãããã§äœ¿çšã§ããŸããïŒ äœãã®ãããªãã®ïŒ
rule = (space* a:(text space+ otherText) newLine*) => a
ããã¯ããªãæè»æ§ãããããŸã æ瀺çã§ããïŒ @wildeyesã®æžå¿µïŒãæ§æãšå®è£ ã®äž¡æ¹ã§åºç€ãšãªãJSã«
ç§ã¯å°ã次ã®ãããªãã®ãæããŠããŸããïŒ
additive = left:multiplicative "+" right:additive {= left + right; }
ãããã¯ã®æåã®é空çœæåãšããŠã®=
ïŒæåã®éžæã«ã€ããŠèªç±ã«è°è«ããŠãã ããïŒãreturn
ã«å€æãããå Žåã
ããã¯å®å šãªåŒã§ãæ©èœããå€æãã¹ã§å¯èœã«ãªãã¯ãã§ãã
é£çµ¡ãã£ãïŒ ãªãadditive = left:multiplicative "+" right:additive { => left + right }
ãªãã®ã§ããïŒ
ç¢å°é¢æ°ãã©ã®ããã«æ©èœããããèãããšã確ãã«çŽæçã«æããã§ãããïŒ (left, right) => left + right
ïŒã
å®éãparser.pegjsãã¡ã€ã«ã«ã¯ããã®æ©èœã«ãã£ãŠæ¹åãããå Žæã®äŸãããªããããŸãã
äŸãã°ïŒ
= head:ActionExpression tail:(__ "/" __ ActionExpression)* {
return tail.length > 0
? {
type: "choice",
alternatives: buildList(head, tail, 3),
location: location()
}
: head;
}
ã·ãŒã±ã³ã¹å ã®ActionExpressionã®äœçœ®ã«çŽæçã«ãªã³ã¯ãããŠããªãbuildListåŒã³åºãã®ããžãã¯ãã³ããŒ3ã®ãããå£ããããã§ãã buildListé¢æ°èªäœã¯ã2ã€ã®ç°ãªãæäœãçµã¿åãããããšã«ãã£ãŠè€éã«ãªããŸãã @åŒãšes6spreadæ§æã䜿çšããããšã«ãããããã¯ããã¯ãªãŒã³ã«ãªããŸãã
= head:ActionExpression tail:(__ "/" __ @ActionExpression)* {
return tail.length > 0
? {
type: "choice",
alternatives: [head, ...tail],
location: location()
}
: head;
}
ããã¯ã»ãšãã©åãªãã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãªã®ã§ãparser.pegjsã®ActionExpressionãå€æŽããã ãã§ããã®æ©èœãããŒãµãŒã«è¿œå ããããšãã§ããŸããã
= ExtractSequenceExpression
/ expression:SequenceExpression code:(__ CodeBlock)? {
return code !== null
? {
type: "action",
expression: expression,
code: code[1],
location: location()
}
: expression;
}
ExtractExpression
= "@" __ expression:PrefixedExpression {
return {
type: "labeled",
label: "value",
expression: expression,
location: location()
};
}
ExtractSequenceExpression
= head:(__ PrefixedExpression)* _ extract:ExtractExpression tail:(__ PrefixedExpression)* {
return {
type: "action",
expression: {
type: "sequence",
elements: extractList(head, 1).concat(extract, extractList(tail, 1)),
location: location()
},
code: "return value;",
location: location()
}
}
@è¡šèšã䜿çšããŠparser.pegjsãã©ã®ããã«åçŽåããããã瀺ãèŠç¹ããã§ãã¯ã€ã³ããŸããã
@è¡šèšã«ããã·ãŒã±ã³ã¹ããç®çã®å€ãç°¡åã«æœåºã§ãããããextractOptionalãextractListãããã³buildListé¢æ°ã¯å®å šã«åé€ãããŸããã
https://gist.github.com/krisnye/a6c2aac94ffc0e222754c52d69e44b83
@krisnyeããã«å€ãã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒããã£ãå Žåã®å€èŠ³ã¯æ¬¡ã®ãšããã§ãã
https://github.com/polkovnikov-ph/newpeg/blob/master/parse.np
ãã®æ§ææ©èœã«::
ãš#
çµã¿åããã䜿çšããããšãèããŠããŸãïŒ ïŒ545ã®ç§ã®èª¬æ/çç±ãåç
§ã
::
ãã€ã³ãã£ã³ã°æŒç®å#
å±éæŒç®å// this is imported into grammar
class List extends Array {
constructor() { this.isList = true; }
}
// grammar
number = _ ::value+ _
value = ::int #(_ "," _ ::int)* { return new List(); }
int = $[0-9]+
_ = [ \t]*
::
ã¯ãã«ãŒã«ã®çµæãšããŠåŒã®çµæãè¿ããŸãã::
ã¯ãã·ãŒã±ã³ã¹ã®çµæãšããŠãã¹ããããåŒã®çµæãè¿ããŸãã::
ã䜿çšãããŠããå ŽåãããŒã¯ãããåŒã®çµæã¯é
åãšããŠè¿ãããŸã::
ãå«ããã¹ããããã·ãŒã±ã³ã¹ã§#
ã䜿çšãããŠããå Žåãçµæã¯èŠªã®é
åã«ããã·ã¥ãããŸã::
/ #
ãšãšãã«ã³ãŒããããã¯ãããå Žåã¯ãæåã«ãããå®è¡ããŠãããçµæpush
ã¡ãœããã䜿çšããŸããããã®ã«ãŒã«ã«åŸã£ãŠãäžèšã®äŸã§çæãããããŒãµãŒã«09 , 55, 7
ãæž¡ããšã次ã®ããã«ãªããŸãã
result = [
isList: true
0: "09"
1: "55"
2: "7"
]
result instanceof Array # true in ES2015+ enviroments
result instanceof List # true
ã«ãŒã«ã®ã«ãŒãã·ãŒã±ã³ã¹ã§ã::ã¯åŒã®çµæãã«ãŒã«ã®çµæãšããŠè¿ããŸã
ãã¹ããããã·ãŒã±ã³ã¹ã§ã¯ã::ã¯ãã¹ããããåŒã®çµæãã·ãŒã±ã³ã¹ã®çµæãšããŠè¿ããŸã
ãªããããã¯å¥ã
ãªã®ã§ããïŒ ãã·ãŒã±ã³ã¹ã®::
ãã·ãŒã±ã³ã¹ã®åŒæ°çµæã®çµæã«ãªããã ãã§ã¯ãªãã®ã¯ãªãã§ããïŒ
è€æ°ã®::ã䜿çšãããŠããå ŽåãããŒã¯ãããåŒã®çµæãé åãšããŠè¿ãããŸãã
ããã¯æªãèãã§ãã ãã®å Žåã¯ãããææžããããšæããŸãã è€æ°ã®ã¿ã€ãã®å€ãçµã¿åãããŠé åã«ããæå³ã¯ãããŸããã ïŒããã¯ã¿ãã«ã«ãªããŸãããJSã§ã¯ã»ãšãã©åœ¹ã«ç«ã¡ãŸãããïŒ
ã·ãŒã±ã³ã¹ã§ïŒã䜿çšãããŠããå Žåãçµæã¯èŠªã®é åã«é åïŒé£çµãããŸã
ä»ã§ã¯ããã¯æãããèãã§ãã ããã¯æããã«ãç¡é¢ä¿ãª{ return xs.push(x), xs }
ãåãé€ãããã®å¿æ¥ä¿®çã§ãã ãã®ãããªç¹æ®ãªã±ãŒã¹ãäœæããŠãããã©ã¡ãŒã¿ãŒåãããã«ãŒã«ã䜿çšããŠäžè¬çãªæ¹æ³ã§è§£æ±ºã§ãããããæå³ããããŸããã æŒç®åã«äœ¿çšããåäžæåã·ãŒã±ã³ã¹ã¯ããã»ã©å€ããªãã®ã§ãããããç¡é§ã«ããã¹ãã§ã¯ãããŸããã
ã«ãŒã«ã«:: /ïŒãšãšãã«ã³ãŒããããã¯ãããå Žåã¯ãæåã«ãããå®è¡ããŠãããçµæããã·ã¥ã¡ãœããã䜿çšããŸã
ããã§ã f = ::"a" { return "b" }
ã¯çµæãšããŠ["a", "b"]
ãæã€ã¹ãã§ããïŒ
09ãééããŸãã 55ïŒäžèšã®äŸã§çæãããããŒãµãŒã®7ã¯ã次ã®ããã«ãªããŸãã
ããã§ã¯ãªãã .
ãŸãã¯:
ã«ã€ããŠã¯èšåãããŠããŸããã èšè¿°ãããæ¯ãèããã©ã®ããã«çµæãçã¿åºãã®ããããããŸããã
æ°å€= _ ::å€+ _
ãŸããããã¯_
䜿çšæ¹æ³ã§ã¯ãããŸããã ããŒã¯ã³ã®å³åŽãŸãã¯å·ŠåŽã«é
眮ãããææ³çšã«1åéžæãããŸãã å³åŽã®å Žåãã¡ã€ã³ã«ãŒã«ã_
éå§ããå¿
èŠãããããã®éãåæ§ã§ãã
start = _ value
value = ::int #("," _ ::int)* { return new List(); }
number = ::$[0-9]+ _
_ = [ \t]*
JavaScriptã®äŸã§å®è£ ãããã¯ã©ã¹ã®äŸïŒå®éã®å®è£ ãæå³ãããã®ã§ã¯ãããŸããïŒïŒ
ClassMethod
= head:FunctionHead __ params:FunctionParameters __ body:FunctionBody {
return {
type: "method",
name: head[ 1 ],
modifiers: head[ 0 ],
params: params,
body: body
};
}
// `::` inside the zero_or_more "( ... )*" builds an array as we want,
// so this rule returns `[FunctionModifier[], Identifier]` as expected
MethodHead = (::MethodModifier __)* ("function" __)? ::Identifier
// https://github.com/tc39/proposal-class-fields#private-fields
MethodModifier
= "#"
/ "static"
/ "async"
FunctionParameters
= "(" __ head:FunctionParam tail:(__ "," __ ::FunctionParam)* __ ")" {
// due to `::`, tail is `FunctionParam[]` instead of `[__, "", __, FunctionParam][]`
return [ head ].concat( tail );
}
/ "(" __ ")" { return []; }
FunctionParam
= name:Identifier value:(__ "=" __ ::Expression)? {
return { name, value };
}
FunctionBody = "{" __ ::SourceElements? __ "}"
ãªããããã¯å¥ã ãªã®ã§ããïŒ ã·ãŒã±ã³ã¹ã®
::
ã§ãã·ãŒã±ã³ã¹ã®åŒæ°ã®çµæãåŸãããªãã®ã¯ãªãã§ããïŒã
ããã¯åãããšã§ã¯ãããŸãããïŒ MethodHead
ã FunctionParam
ã FunctionBody
ãªã©ã®ããŸããŸãªãŠãŒã¹ã±ãŒã¹ã®çµæãç°¡åã«ç解ã§ããããã«ãããæ確ã«ããã ãã§ãã
è€æ°ã®ã¿ã€ãã®å€ãçµã¿åãããŠé åã«ããæå³ã¯ãããŸããã ïŒããã¯ã¿ãã«ã«ãªããŸãããJSã§ã¯ã»ãšãã©åœ¹ã«ç«ã¡ãŸãããïŒ
ASTïŒçæãããããŒãµãŒã®æãäžè¬çãªçµæïŒãæ§ç¯ããå Žåãç§ã®æèŠã§ã¯ã次ã®ããã«æžã代ããã«ã MethodHead
ãããªãŠãŒã¹ã±ãŒã¹ãåçŽåããŸãã
MethodHead
= modifiers:(::MethodModifier __)* ("function" __)? name:Identifier {
return [ modifiers, name ];
}
ããèããŠã¿ããšããŠãŒã¹ã±ãŒã¹ã¯åçŽåãããŸãããéçºè
ãïŒææ³ã®å®è£
æ¹æ³ãã¢ã¯ã·ã§ã³ã«ããçµæã®åŠçæ¹æ³ã®ããããã§ïŒééããç¯ãå¯èœæ§ãããã®ã§ãããã眮ããšæããŸãmultipleSingleReturns
ïŒããã©ã«ãïŒ false
ïŒã®ãããªãªãã·ã§ã³ã®èåŸã«ãããŠãŒã¹ã±ãŒã¹ã¯ãããã§ã®æåã®è¡åã§ãïŒãã®æ©èœãå®è£
ãããŠããå ŽåïŒã
ã·ãŒã±ã³ã¹ã§ïŒã䜿çšãããŠããå Žåãçµæã¯èŠªã®é åã«é åïŒé£çµãããŸã
ä»ã§ã¯ããã¯æãããèãã§ãã ããã¯æããã«ãç¡é¢ä¿ãª{return xs.pushïŒxïŒãxs}ãåãé€ãããã®å¿æ¥ä¿®çã§ãã
ãŸãã FunctionParameters
ãããªãããäžè¬çãªãŠãŒã¹ã±ãŒã¹ã§ã圹ç«ã¡ãŸãã
// should always return `FunctionParam[]`
FunctionParameters
= "(" __ ::FunctionParam #(__ "," __ ::FunctionParam)* __ ")"
/ "(" __ ")" { return []; }
ãã©ã¡ãŒã¿åãããã«ãŒã«ã䜿çšããŠäžè¬çãªæ¹æ³ã§è§£æ±ºã§ããŸã
åŸã§ã©ã®ããã«é²ããããŸã ããããªãã®ã§ããã©ã¡ãŒã¿ãŒåãããã«ãŒã«ã®åã«åäžã®æ»ãå€ãå®è£
ããå¿
èŠããããšèããŠããŸãïŒãã³ãã¬ãŒãã䜿çšããã®ã¯å¥œãã§ããã rule < .., .. > = ..
ã䜿çšãããšå€ãã®ãã€ãºãè¿œå ãããããã§ãPEG.jsã®ææ³ãªã®ã§ãæ§æãå°ãå€æŽããŠããé©åã«é©åãããããšãèããŠããŸãïŒããããã¯å¥ã®åé¡ã§ãã
æŒç®åã«äœ¿çšããåäžæåã·ãŒã±ã³ã¹ã¯ããã»ã©å€ããªãã®ã§ãããããç¡é§ã«ããã¹ãã§ã¯ãããŸããã
ããã¯æ¬åœã§ãããæ©äŒããã®ããã«ãªã£ãŠãããšãã«ãããã䜿çšããªãå Žåãããã¯åãããã«æªãããšã§ãã
#
ã¯ãååŠçãã£ã¬ã¯ãã£ããå®è£
ããäžéšã®èšèªã§å±éæŒç®åãšããŠäœ¿çšãããŠããããšãæãåºããåŸããã®ãŠãŒã¹ã±ãŒã¹ã«äœ¿çšããããšãèããŸãããããã¯ãåºæ¬çã«ãã®ãŠãŒã¹ã±ãŒã¹ãããã§ã«ããŒããŠããããšã§ãã
ããã§ã
f = ::"a" { return "b" }
ã¯çµæãšããŠ["a", "b"]
ãæã€ã¹ãã§ããïŒ
ããããã³ãŒããããã¯ã¯ããŒãµãŒã«ãã£ãŠpush
ã¡ãœãããå«ãé
åã®ãããªãªããžã§ã¯ããè¿ãããšãæåŸ
ãããŠããããïŒãããã£ãŠã f = ::"a" { return [ "b" ] }
[ "b", "a" ]
ã¯çµæãšããŠpushSingleReturns
ãããªãªãã·ã§ã³ã®èåŸã«ãããã©ãããç解ããæ¹ãè¯ãã§ããããïŒ ãã®ãªãã·ã§ã³ãfalse
ïŒããã©ã«ãïŒã®å Žåãåäžã®æ»ãå€ãå«ãã·ãŒã±ã³ã¹ã®åŸã«ã³ãŒããããã¯ããããšããšã©ãŒãã¹ããŒãããŸãã
09ãééããŸãã 55ïŒäžèšã®äŸã§çæãããããŒãµãŒã®7ã¯ã次ã®ããã«ãªããŸãã
ããã§ã¯ãªãã
.
ãŸãã¯:
ã«ã€ããŠã¯èšåãããŠããŸããã
ç³ãèš³ãããŸããããããã¯ç§ãäžããããäŸãæžãçŽãããšãã«æ®ãããééãã§ããã
ãŸããããã¯
_
䜿çšæ¹æ³ã§ã¯ãããŸããã ããŒã¯ã³ã®å³åŽãŸãã¯å·ŠåŽã«é 眮ãããææ³çšã«1åéžæãããŸãã å³åŽã®å Žåãã¡ã€ã³ã«ãŒã«ã_
éå§ããå¿ èŠãããããã®éãåæ§ã§ãã
ããã¯æ¬åœã«å¥œã¿ã®åé¡ã ãšæããŸãïŒsmile ïŒããã®äŸãç解ããæ¹ãç°¡åã ã£ããšæããŸããïŒ
number = _ ::value+ EOS
...
EOS = !.
èšè¿°ãããæ¯ãèããã©ã®ããã«çµæãçã¿åºãã®ããããããŸããã
ãã®æŽæ°ãããã³ã¡ã³ãã¯ãç§ãèšãããšããŠããããšãç解ããã®ã«åœ¹ç«ã¡ãŸããïŒããã§ãªãå Žåã¯ãããªãã¯äœãç解ããŠããŸãããã
ç§ã¯@ polkovnikov-phã«åæããŸããå Žæã«ãã£ãŠæäŸãããå€æŽã¯éåžžã«æçœã§ã¯ãªããè¿œå ã®ãšã©ãŒã®åå ã«ãããªããšããããšã§ãã
ã·ãŒã±ã³ã¹ã§ïŒã䜿çšãããŠããå Žåãçµæã¯èŠªã®é åã«é åïŒé£çµãããŸã
ææ³start = #('a')
äœãè¿ãå¿
èŠããããŸããïŒ ç§ãç解ããŠããéãã圌ã¯é
åããã©ããåããããã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãã©ã®ããã«èããŸãããïŒ ãã®æŒç®åã¯å¿
èŠãªããšæããŸãã æãæçœãªäœ¿çšæ³ïŒåºåãæåã䜿çšããã¡ã³ããŒãªã¹ãã®åŒïŒã«ã€ããŠã¯ãç¹å¥ãªæ§æãäœæããããšããå§ãããŸãïŒïŒ30ãšç§ã®ãã©ãŒã¯https://github.com/Mingun/pegjs/commit/db4b2b102982a53dbed1f579477c85c06f8b92e6ãåç
§ïŒã
ã«ãŒã«ã«:: /ïŒãšãšãã«ã³ãŒããããã¯ãããå Žåã¯ãæåã«ãããå®è¡ããŠãããçµæããã·ã¥ã¡ãœããã䜿çšããŸã
éåžžã«æçœã§ãªãè¡åã ææ³ãœãŒã¹ã®ã¢ã¯ã·ã§ã³ã¯åŒã®åŸã«é 眮ãããéåžžã¯åŒã®è§£æåŸã«åŒã³åºãããŸãã ãããŠçªç¶ãã©ãããããããããã¯è§£æã®åã«åŒã³åºããå§ããŸãã ã©ãã«ã¯ã©ã®ããã«åäœããŸããïŒ
ããªãããªããšã説æããæ®ãã®3ã€ã®ãã€ã³ãã¯ã圌ãã®æ確ãªæèŠãéãå§ããŸããã @ polkovnikov-phããæåã®ã±ãŒã¹ãš2çªç®ã®ã±ãŒã¹ãåºå¥ããããã«èª¬æã«å«ãŸããŠããçç±ãã©ã®çšåºŠæ£ç¢ºã«èšé²ããŸãããïŒ 2ã€ã®åçŽãªã«ãŒã«ã®ã¿ãå®è¡ãããŸãã
::
ïŒççŽã«èšã£ãŠãç§ã¯ãã®æåã®éžæã奜ãã§ã¯ãªãããã€ãºãå€ãããïŒåŒãsequence
ãã®æåã§ããŒã¯ãããããŒãèŠçŽ ãæ»ããšããäºå®ã«ã€ãªããåã«äŸïŒ
start = 'a' 'b' 'c'; // => ['a', 'b', 'c']
start = ::'a' 'b' 'c'; // => 'a'
start = ::'a' 'b' ::'c'; // => ['a', 'c']
倧ããªäŸã§ã¯ã ::
ããäºæ³ãããå
容ãæ£ç¢ºã«èª¬æããŠãããçããããŠãŒã¹ã±ãŒã¹ïŒ #
ãããã€ãã®::
ïŒã«ã€ããŠã¯èª¬æããŠããŸããã
ããã¯åãããšã§ã¯ãããŸãããïŒ
ãããç§ãæ±ããŠãããã®ã§ãã äžè¬çãªæ¹æ³ã§ã®èª¬æã¯ãèªè ã«ãããæ¬åœã«åããã®ã§ããããšã確信ãããã®ã§ãéåžžã¯ããæçšã§ãã ã説æããããšãããããŸãã :)
ç§ã®æèŠã§ã¯ãMethodHeadã®ãããªãŠãŒã¹ã±ãŒã¹ãç°¡çŽ åããã§ããã
ãããã代ããã«ãªããžã§ã¯ããäœæããŠã¿ãŸãããïŒ è¡šèšã«ã¯modifiers:
ãšname:
ããããçµæã®JSãªããžã§ã¯ãã®ãŸãŸã«ããŠãããšããã°ãããã§ãããã
ãŸããéçºè ãééããç¯ãå¯èœæ§ããããŸãïŒææ³ã®å®è£ æ¹æ³ããŸãã¯ã¢ã¯ã·ã§ã³ã«ããçµæã®åŠçæ¹æ³ã®ããããïŒã
åœåãç§ã¯ããã«ã€ããŠæžãã€ããã§ãããããã®åŸãç§ã«ã¯ååãªé£ããè°è«ããªããšå€æããŸããã åãã¬ãã«ã®ã·ãŒã±ã³ã¹ã§è€æ°ã®::
ãèš±å¯ããããããŸããïŒãã©ã°ããã£ãŠãïŒã
ãŸããFunctionParametersã®ãããªãããäžè¬çãªãŠãŒã¹ã±ãŒã¹ã§æ¬¡ã®ããã«èšè¿°ããã»ããããå Žåã«ã圹ç«ã¡ãŸãã
ããããããã¯åãããšã§ãã æ¬åœã«çŽ æŽãããæ§æã¯inter(FunctionParam, "," __)
ã§ã
inter a b = x:a xs:(b ::a)* { return xs.unshift(x), xs; }
ã«ãŒã«<..ã..> = ..PEG.jsã®ææ³ã«å€ãã®ãã€ãºãè¿œå ããããã§ã
人ã
ã¯<...>
ãåã«äœ¿çšãããããšãæåŸ
ããŠããŸããããã®å ŽåãåŒæ°ã¯åã§ã¯ãããŸããã æè¯ã®æ¹æ³ã¯ãäœåãªæåããŸã£ããå«ãŸãªãHaskellã®æ¹æ³ã§ãïŒäžèšã®inter
åç
§ïŒã ;
ãçç¥ããPEG.jsææ³ã§ãããã©ã®ããã«çžäºäœçšãããã¯ããããŸããã f a b = ...
ãïŒéšåçã«ïŒåã®è¡ã«å«ãŸããå ŽåããããŸãã
ååŠçãã£ã¬ã¯ãã£ããå®è£ ããäžéšã®èšèªã§å±éæŒç®åãšããŠäœ¿çšãããŸã
ã¯ããã§ãç§ã¯ãããè³¢ã䜿ãããã§ãã é
åã«å¯ŸããŠææ¡ãããpush
ã¢ã¯ã·ã§ã³ã®ä»£ããã«ããªããžã§ã¯ãã«å¯ŸããObject.assign
ã¢ã¯ã·ã§ã³ãšããŠããŸãã¯ç©ºã®æååïŒ eps
ïŒã«äžèŽãããã®ãšããŠäœ¿çšããŸããããã®è°è«ã ããšãã°ã
f = type:#"ident" name:$([a-z]i [a-z0-9_]i+)
å
¥å"abc"
ã«å¯ŸããŠ{type: "ident", name: "abc"}
ãè¿ããŸãã
ããããã³ãŒããããã¯ã¯ãããã·ã¥ã¡ãœãããå«ãé åã®ãããªãªããžã§ã¯ããè¿ãããšãããŒãµãŒã«ãã£ãŠæåŸ ãããŠããããã§ãïŒãããã£ãŠãf = :: "a" {return ["b"]} return ["b"ã " a "]çµæãšããŠïŒã
O_O
ããã¯æ¬åœã«å¥œã¿ã®åé¡ã ãšæããŸã
ããã ãã§ãªããããã©ãŒãã³ã¹ãã ãã¹ãŠã®ããŒã¯ã³ã®äž¡åŽã«_
ãããå Žåã空çœæåã·ãŒã±ã³ã¹ã¯æ«å°Ÿã®æåã·ãŒã±ã³ã¹ãšã®ã¿äžèŽããå
è¡ãã_
ã¯äœãäžèŽããŸããã parse$_
ãžã®è¿œå ã®åŒã³åºãã«_
ã2åå€ããããã³ãŒãã¯é·ããªããŸãã
@Mingunç§ã¯@futagozaã¯ãèšèšç©ºéãæ¢æ±ãããšæããŸãã ããã¯è¯ãããšã§ããç¹ã«ãããå ¬éãããŠããŠãç§ãã¡ãå察ããæ©äŒãããå Žåã¯:)
äž»ãªããšã¯ãããªãããšèšãã®ã§ã¯ãªããããããïŒãããªããšã¯ãããŸããïŒããšèšãããšã§ãã
f = type:#"ident" name:$([a-z]i [a-z0-9_]i+)
ã¯ãå ¥å"abc"
ã«å¯ŸããŠ{type: "ident", name: "abc"}
ãè¿ããŸãã
ããããããã ãã®æ§æã¯_wayyy_ããŸãã«ãéæ³ã§ãã
æåã«ææ¡ããã@
æŒç®åã¯ãçŸç¶ã®ãŸãŸã§
sequence
= first:element rest:(whitespace next:element {return next;})*
{
return [first].concat(rest);
}
;
ç¹ã«ãããããè€éãªå Žåã¯ãäœåºŠãäœåºŠãå ¥åããã®ãé¢åã§ãã
ãã ãã @
æŒç®åã䜿çšãããšãäžèšã¯åçŽã«ãªããŸãã
sequence = first:element rest:(whitespace @element)* { return [first].concat(rest); };
https://github.com/pegjs/pegjs/issues/235#issuecomment -66915879ãŸãã¯https://github.com/pegjs/pegjs/issues/235#issuecomment -67544080ã®ããããã䜿çšãããšãããã«æ¬¡ã®ããã«ãªã
sequence = first:element rest:(whitespace @element)* => [first].concat(rest);
/* or */
sequence = first:element rest:(whitespace @element)* {=[first].concat(rest)};
...æåã®ãã®ã¯ç§ãéåžžã«éšåçã§ãã
ããã¯ãç°¡åã«éæã§ããäžäœäºææ§ã®ããå€æŽã®ããã§ãïŒèª°ãããã§ã«ãããè¡ã£ãŠããããã§ãïŒã
å®éãç§ãééã£ãŠããªããã°ãããã¯åãªãå°ããªãã³ãã§ããå¯èœæ§ããããŸãã 0.11.0@futagozaã«ã€ããŠèããããšããããããããŸããã
ããããã¹ã¿ãŒã«è¿œå ããŸããã ãã«ããã©ããã³ã°ã«::
ã䜿çšããã·ã³ã°ã«ãã©ããã³ã°ã«@
ã䜿çšããããšãèšç»ããŠããŸããããã©ãã«ä»ãã®::
ã䜿çšãããšãéåžžã«èŠèŠããæ··ä¹±ããããã«èŠããã®ã§ããã®ã¢ã€ãã¢ãã¶ãäžããŸããð
ç§ã¯ãã°ããåã«ãããèªåã§å®è£ ãå§ããŸããããä»ãŸã§ãããåé€ãïŒä»£ããã«ïŒ579ãå®è¡ããå¿ èŠããããŸãðïŒããã€ãã³ãŒããžã§ãã¬ãŒã¿ãŒãMingunã®å®è£ ã«åºã¥ããŠããŸãïŒhttps://github.com/Mingun/pegjs/commit/1c1c852bae91868eaa90d9bd9f7e4f722aa6435e ïŒ
ããã§è©ŠããŠã¿ãããšãã§ããŸãïŒ https ïŒ//pegjs.org/development/tryïŒãªã³ã©ã€ã³ãšãã£ã¿ãŒã§ãããPEG 0.11.0-devã䜿çšããŠããŸãïŒ
èãªãã¿ãŒã³ã¢ã©ãŠã³ãã¿ã€ã ãããããã³ã çŽ æŽãããä»äº@futagoza ãããã¯å®ç§ã«æ©èœããŸãã-éåžžã«æè¬ããŠããŸãã ããã¯ãã§ã«npmã®dev
ã¿ã°ã«ãªãªãŒã¹ãããŸãããïŒ ç§ã¯ããã§ãã¹ããå§ãããã§ãã
åºæ¬çãªææ³ã§è©ŠããŠã¿ãã人ã¯ããã®åç¬ãããã«å
¥ããŠã "abcd"
ãããªå
¥åãããŠãã ããã
foo
= '"' @$bar '"'
;
bar
= [abcd]*
;
ããã¯ãã§ã«npmã®devã¿ã°ã«ãªãªãŒã¹ãããŸãããïŒ
ããã«ã¡ã¯ãããã¯es6ãããã°æ¶ããåé¡ã®ã²ãšã€ã§ããããã以ées6ã«è¿œå ãããä»ã®ãã®ã«ã¯ãããã®æåãå¿ èŠã§ãã ãã§ã«å®è¡ã§ããããšã«å¯ŸããŠæŒç®åãè¿œå ããããšã¯ãéåžžã«éå¹æã§ãã
ãã®ãã±ããã¯ããŒãžãããŸãã
pattern:Pattern init:(_ "=" _ <strong i="7">@a</strong>:AssignmentExpression)?
誰ããæ¬è³ªçã«ç解ããããŒãµãŒã®ä»ã®éšåãçµäºãããšç¡æã§æäŸããães6ã®åãããšã¯æ¬¡ã®ãšããã§ãã
pattern:Pattern init:(_ "=" _ a:AssignmentExpression)? => a
åé¡ãªã®ã¯ããã¹ããããšããã®pluckå®è£ ã¯ãã°ãããããã«èŠããŸãããã¡ãããããã¯æ±ºããŠãªãªãŒã¹ãããªããã©ã³ãã§ä¿®æ£ãããŠãããããããã¯ã¯ããŒãºãšããŒã¯ãããŠããŸãã
ããããªãªãŒã¹ãããããŒãžã§ã³ã§ä¿®æ£ããããŸã§ããã®åé¡ã @ futagozaãå床éããŠãã ãã
æãåèã«ãªãã³ã¡ã³ã
https://www.npmjs.com/package/pegjs/v/0.11.0-dev.325