ð ã¬ãã·ã«ã«è§£æãšæ§æ解æ#
ãã®èšäºã§ã¯ãç§ãé·ãæéããããŠç解ããç¥èãç°¡åã«ãŸãšããã ããªã®ã§ã詳ãã説æããããšã¯ãããŸããããã ãèªè ã®ç解ãå©ããããã«ããããã®ãããã¯ã«ã€ããŠå°ãæ·±ã話ãããšããããŸãã
ã¬ãã·ã«ã«ã¢ãã©ã€ã¶ïŒè±èªã§ã¯ Lexer ãŸã㯠Scanner ãšåŒã°ããããšãäžè¬çã§ãïŒã¯ããœãŒã¹ã³ãŒãããããŒã¯ã³ããšåŒã°ããäžå¯åã®èŠçŽ ã®ãªã¹ãã«åå²ããããã«äœ¿çšãããŸãã
C èšèªã®äŸãæããŠèª¬æããŸãã
#include <stdio.h>
int main() {
printf("Hello world!");
}
äžèšã®ãœãŒã¹ã³ãŒãã«å«ãŸãããã¹ãŠã®ããŒã¯ã³ã¯æ¬¡ã®ãšããã§ãã
<ããªããã»ããµãã£ã¬ã¯ãã£ã #include> <ã¹ããŒã¹> <å·Šå°æ¬åŒ§ '<'> <åå stdio.h> <å³å°æ¬åŒ§ '>'> <æ¹è¡>
<æ¹è¡>
<ããŒã¯ãŒã int> <ã¹ããŒã¹> <åå main> <å·Šäžžæ¬åŒ§ '('> <å³äžžæ¬åŒ§ ')'> <ã¹ããŒã¹> <å·Šæ³¢æ¬åŒ§ '{'> <æ¹è¡>
<ã¹ããŒã¹> <ã¹ããŒã¹> <åå printf> <å·Šäžžæ¬åŒ§ '('> <æååãªãã©ã«> <å³äžžæ¬åŒ§ ')'> <ã»ãã³ãã³ ';' > <æ¹è¡>
<å³æ³¢æ¬åŒ§ '}'>
ã¬ãã·ã«ã«ã¢ãã©ã€ã¶ã®å ¥åã¯æååã§ãããåºåã¯ããŒã¯ã³ã®ãªã¹ãã§ããåããŒã¯ã³ã«ã¯ãäœçœ®ïŒPositionïŒãå 容ïŒRaw contentïŒã** ã¿ã€ãïŒToken TypeïŒ** ã® 3 ã€ã®éèŠãªå±æ§ããããŸããäœçœ®ãèšé²ããããšã¯ãåŸã§ã³ãŒãã«ãšã©ãŒããã£ãå Žåã«åé¡ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
æ§æ解æåšïŒè±èªã§ã¯ Parser ãšåŒã°ããããšãäžè¬çã§ãïŒã¯ãããã°ã©ãã³ã°èšèªã®èšèšä»æ§ã«åºã¥ããŠãå®çŸ©ã«åèŽããè€æ°ã®ããŒã¯ã³ãçµã¿åãããŠæ§æããŒããäœæããæçµçã«ãæœè±¡æ§ææšãïŒASTãAbstract Syntax TreeïŒãäœæããäœæ¥ã§ãã
𥵠ãã³ãã¬ãŒãæååã®åŠçã®é£ãã#
以äžã§ã¯ãJavaScript ã®ãã³ãã¬ãŒãæååæ§æãäŸã«èª¬æããŸãã
ã¬ããµãŒã®å®è£ ãå§ãããšããå ¥åå 容ãäžã€ãã€èªã¿åãã ãã§ã察å¿ããããŒã¯ã³ãååŸã§ãããšæã£ãŠããŸãããããã³ãã¬ãŒãæååã®å Žåã¯ç°ãªãããšã«æ°ã¥ããŸããã
ãã³ãã¬ãŒãæååãã¬ãã·ã«ã«è§£æã®æ®µéã§ãåå²ã§ããªããããŒã¯ã³ãšããŠèªã¿åãã®ã¯éåžžã«å°é£ã§ããæããã«ããã³ãã¬ãŒãæååã¯åå²å¯èœã§ãã
`my name is ${"David" + ` - ${firstName}`}, nice to meet you!`
ð€ïž ã©ãããã°ããã§ããïŒ#
ããŒã¯ã³ãé çªã«èªã¿åãããã«ã¯ã解æã®çŸåšã®ç¶æ ã瀺ãããã€ãã®å€æ°ãèšå®ããéåžžã®æåå解æãšåãæ¹æ³ã§ãã³ãã¬ãŒãæååãåŠçããªãããã«ããå¿ èŠããããŸãã
確ããªããšã¯ããã³ãã¬ãŒãæååã®åŠçã¯æ§æ解æã®æ®µéã§è¡ãããããšã§ããã次㮠2 ã€ã®çš®é¡ã®æ§æããŒããå«ãããšã§ãã
- åæ£ããè€æ°ã®æååããã¹ã
- æ¿å ¥åŒïŒåŒïŒãæ¿å ¥åŒãæ§æããŒãã§ã
interface TemplateStringNode {
quasis: TemplateElement[]
expressions: ExpressionNode[]
}
ãããã£ãŠãæãè¯ãæ¹æ³ã¯ãããŒãµãŒã«ãã³ãã¬ãŒãæååã®è§£æãéå§ããããã®ç¹å®ã®ããŒã¯ã³ãèŠã€ããç¶æ æ å ±ã«åºã¥ããŠå¯èœãªãã¹ãã®åŠçãè¡ãããšã§ãã
次㮠2 ã€ã®éèŠãªæ å ±ãèšå®ããŸãã
isReadingText
ïŒããã¹ããèªã¿åãå¿ èŠããããã©ããnested
ïŒãã¹ãã®æ·±ã
äžèšã®å³ã®æšè«åæã«åŸã£ãŠã次ã®çµè«ã«éããããšãã§ããŸãã
ãã³ãã¬ãŒãæååã®åŒçšç¬Š
ã¯isReadingText
ã®ç¶æ ãå転ãããŸã- æ¿å
¥åŒã®éå§ããŒã«ãŒ
${
ã¯nested
ã 1 ã€å¢ãããisReadingText
ãfalse
ã«èšå®ããŸãããªããªããèªã¿åãã®ã¯æ¿å ¥åŒã ããã§ãã å³æ³¢æ¬åŒ§
ã¯nested
ã 1 ã€æžãããisReadingText
ãtrue
ã«èšå®ããŸãããªããªãããã³ãã¬ãŒãæååã®ããã¹ãã®èªã¿åãã«æ»ã£ãããã§ãã
isReadingText
ãfalse
ã«èšå®ãããnested ã®ã¬ãã«ã 0 ã«ãªããŸã§ããã³ãã¬ãŒãæååããŒãã®è§£æã¯çµäºããŸããã
åèæç®#
以äžã® 2 ã€ã® Stackoverflow ã®è³ªåã«åèã«ãªãæ å ±ããããŸãïŒ