Parsing Expression Grammar(PEG)ã¯ãBryan Fordã«ãã£ã¦POPL 2004ã§çºè¡¨ãããææ³ã®å½¢å¼åã§ããPEGã¯Recognition(èªèï¼ããã¼ã¹ã¨ãã¦ãããContext Free Grammar(CFG)ã¨ç°ãªã£ã¦ãã¾ãã PEGã¯ææ§ã§ãªãè¨èªãåçããã®ã«ä¾¿å©ãªç¹æ§ãæã£ã¦ãããPEGããã¼ã¹ã«ããæ§æè§£æå¨çæç³»ã夿°ç»å ´ãã¦ãã¾ããã¾ããPEGã¯ãã¼ã¶ã³ã³ããã¼ã¿ã¨å¼ã°ãããããã°ã©ãã³ã°è¨èªå ã«æ§æè§£æç¨DSLãåãè¾¼ãææ³ã¨ãé¢é£ãããã¾ãã ãã®åå¼·ä¼ã§ã¯ã PEGã®åºæ¬ PEGã®å¿ç¨ä¾ï¼æ§æè§£æå¨çæç³»ããã¼ã¶ã³ã³ããã¼ã¿ãªã©ï¼ PEGã®æ¡å¼µ çã«ã¤ãã¦åå¼·ãã¾ãï¼PEGã«é¢ããäºåç¥èã¯ãªãã¦æ¸ãããã«ããã¤ããã§ãï¼ãã¾ãã PEG以å¤ã®æ§æè§£æææ³ LLæ³ LRæ³ LL(*)æ³ (ANTLR) GLRæ³ GLLæ³ PEG以
Scalaåºç¤ææ³æéãã¹ã¿ã¼ãæ¸ãããè¿·ã£ã¦ããããæ¢ã«yuroyoroããã«æ¸ããã¦ãã¾ã£ãã®ã§ãã¡ãã£ã¨éãæ¹åã§ãBNFãæ¢ã«ç¥ã£ã¦ãã人ã¯ããããèªãã°PEGã®åºç¤ããã¹ã¿ã¼ãã¦PEGãæ¸ããã¨ãã§ããããã«ãªãã§ããã(ã»ãã¨ãï¼)ã åºæ¬ Parsing Expression Grammar(PEG)ã¯BNFã«ä¼¼ã¦ãããã©ãã¡ãã£ã¨(ããªãï¼)éãææ³ã®è¡¨è¨æ³ã§ããBNFã¯ãã®ææ³ãã©ã®ãããªè¨èªã表ç¾ãã¦ããããå®ããã®ã«å¯¾ãã¦ãPEGã¯å ¥åãã©ã®ããã«è§£æãããããå®ãã¾ããPEGã¨BNFã®ä¸çªå¤§ããªéãã¯ãPEGã«ã¯ææ§ããç¡ããã¨ã§ãããã¨ãã°ãããã°ã©ãã³ã°è¨èªã®ifæã表ç¾ããæ¬¡ã®æ¬ä¼¼BNFã«ã¯ææ§ããããã¾ãã statement ::= if_statement | ...; if_statement ::= IF LPAREN expr RPAREN sta
詳ãã解説ã¯ãããä¸ã«æ²¢å±±åå¨ããã®ã§å²æãã¾ãããã覧ã®ããã«EBNFã®è¡¨ç¾ã®ä¸ã¤ã«ï¼EBNFã¯ããã¤ãã®è¡¨ç¾æ¹æ³ãããããã§ããä¾ãã°ããã¯W3Cãå®ç¾©ãã¦ãããã®ã§ãï¼ä¼¼ã¦ãã¾ããéãã¯å ã«è¿°ã¹ãããã«Choiceã®åããç°ãªãã®ã¨ãææ³ä¸ã«å èªã¿ãåå¨ãããã¨ã§ãã ãã®PEGã使ã£ã¦ååæ¼ç®ãåçããã·ã³ãã«ãªã«ã¼ã«ãæ¸ãã¨ããã¨ãä¾ãã°ãã®ããã«ãªãã¾ãã # expressionãããã¼ã¹ãå§ã¾ãã¨ãã expression <- additive additive <- multitive ("+" multitive / "-" multitive)* multitive <- primary ("*" primary / "/" primary)* primary <- "(" expression ")" / number number <- digit+ digit
PEGã¨C++11ã§ä½ãè¨èªå¦çç³» è¨èªå¦çç³»ã®ä½æã¨èãã¨ãé£æåº¦ãé«ãã¨æããããããã¾ãããããããã¼ãµã¼ã¸ã§ãã¬ã¼ã¿ãªã©ã®ãã¼ã«ãæ´»ç¨ãããã¨ã«ãã£ã¦ï¼ãã®æ·å± ã¯ãã£ã¨ä½ããªãã¾ãã ãã®åéã§ã¯ãBNFãããã¼ãµã¼ãçæããYaccãæåã§ããæè¿ã§ã¯ PEGï¼Parser Expression Grammarï¼ãç¥ãããããã«ãªã£ã¦ãã¾ãããPEGã®ç¹å¾´ã®ä¸ã¤ã¯ï¼æ§æã«ã¼ã«ã ãã§ãªãåå¥ã«ã¼ã«ãåæã«å®ç¾©ã§ãããã¨ã§ããç¾å¨ã主è¦ãªããã°ã©ãã³ã°è¨èªã®ã»ã¨ãã©ã«PEGãã¼ãµã¼ã¸ã§ãã¬ã¼ã¿ãåå¨ãã¾ããä¸ã«ã¯æ½è±¡æ§ææ¨ï¼ASTï¼ã¾ã§çæãã¦ããããã®ãããã¾ãã ãããããã¼ã«ã®å©ããæ´»ç¨ããã¨ï¼è¨èªå¦çç³»ã®ä½æã¯ããªã容æã«ãªãã¾ããPEGã§ææ³ãå®ç¾©ãï¼ASTãå®è¡ããè©ä¾¡å¨ãå®è£ ããã°ï¼ãã¨ã¯PEGã©ã¤ãã©ãªã®å©ããåãã¦è¨èªå¦çç³»ã宿ããããã¨ãã§ãã¾ãã ä»åã¯æä½ã®
Parsing In Python: Tools And Libraries ããã ç« TatSuãArpeggioã¨åãã PEG ç³»ãããã¦ããã¾ã§ã¿ã¦ãã PEG ç³»ã¨ã¯æããã«ç°ç«¯ãã ããã©ããåè¦ã§ã®ç¬¬ä¸å°è±¡ã¯ãæããã¬ãã·ãã«ã§å®æåº¦ãé«ãããã¨ãããã®ã ç°ç«¯: ç« TatSu (the successor to Grako) is a tool that takes grammars in a variation of EBNF as input, and outputs memoizing (Packrat) PEG parsers in Python. EBNF (ã®å¤ç¨®?) ãã PEG ãã¼ãµãçæãããã¨ãããã¨ã¯ããorderd choiceãã§ãã¼ãµã®æ¯ãèããå¤ãããããã¨ãããã¨ã ã¨æããããã®å·®ç°ã¯è³å 夿ãããã¡ã ãã¨? ãªãã¼ã rational
This week we make the parser generator âself-hostedâ, meaning the parser generator generates its own parser. [This is part 7 of my PEG series. See the Series Overview for the rest.] So we have a parser generator, a piece of which is a parser for grammars. We could call this a meta-parser. The meta-parser works similar to the generated parsers: GrammarParser inherits from Parser, and it uses the sa
Iâve alluded to left-recursion as a stumbling block a few times, and itâs time to tackle it. The basic problem is that with a recursive descent parser, left-recursion causes instant death by stack overflow. [This is part 5 of my PEG series. See the Series Overview for the rest.] Consider this hypothetical grammar rule: expr: expr '+' term | termIf we were to naively translate this grammar fragment
ãªãªã¼ã¹ãé害æ å ±ãªã©ã®ãµã¼ãã¹ã®ãç¥ãã
ææ°ã®äººæ°ã¨ã³ããªã¼ã®é ä¿¡
å¦çãå®è¡ä¸ã§ã
j次ã®ããã¯ãã¼ã¯
kåã®ããã¯ãã¼ã¯
lãã¨ã§èªã
eã³ã¡ã³ãä¸è¦§ãéã
oãã¼ã¸ãéã
{{#tags}}- {{label}}
{{/tags}}