ç§ãã¡ã®ãããžã§ã¯ãPT Application Inspectorã¯ãããŸããŸãªããã°ã©ãã³ã°èšèªã§ãœãŒã¹ã³ãŒããåæããããã®ããã€ãã®ã¢ãããŒããå®è£
ããŠããŸãã
- 眲åæ€çŽ¢
- ã³ãŒãã®éçãªæœè±¡è§£éã®çµæãšããŠåŸãããæ°åŠã¢ãã«ã®ç¹æ§ã®ç 究ã
- ãããã€ãããã¢ããªã±ãŒã·ã§ã³ã®åçåæããã³éçåæã®çµæã®æ€èšŒã
ç§ãã¡ã®äžé£ã®èšäºã¯ã眲åæ€çŽ¢ã¢ãžã¥ãŒã«ïŒPMããã¿ãŒã³ãããã³ã°ïŒã®æ§é ãšåäœåçã«å°å¿µããŠããŸãã ãã®ãããªã¢ãã©ã€ã¶ãŒã®å©ç¹ã¯ãé床ããã³ãã¬ãŒãã®èšè¿°ã®å®¹æããããã³ä»ã®èšèªãžã®ã¹ã±ãŒã©ããªãã£ã§ãã æ¬ ç¹ã®äžã§ãããã®ã¢ãžã¥ãŒã«ã¯ãã³ãŒãå®è¡ã®é«ã¬ãã«ã¢ãã«ã®æ§ç¯ãå¿
èŠãšããè€éãªè匱æ§ãåæã§ããŸããã

ãšããããéçºãããã¢ãžã¥ãŒã«ã«å¯ŸããŠæ¬¡ã®èŠä»¶ãçå®ãããŸããã
- ããã€ãã®ããã°ã©ãã³ã°èšèªã®ãµããŒããšæ°ããèšèªã®ç°¡åãªè¿œå ã
- æ§æãšã©ãŒãšæå³ãšã©ãŒãå«ãã³ãŒãã®è§£æã®ãµããŒãã
- ãã³ãã¬ãŒãããŠãããŒãµã«èšèªïŒDSLããã¡ã€ã³åºæèšèªïŒã§èšè¿°ããæ©èœã
ç§ãã¡ã®å Žåããã¹ãŠã®ãã³ãã¬ãŒãã¯ãœãŒã¹ã³ãŒãã®è匱æ§ãŸãã¯æ¬ é¥ãèšè¿°ããŠããŸãã
ã³ãŒãåââæã®ããã»ã¹å
šäœã¯ã次ã®ã¹ãããã«åããããšãã§ããŸãã
- èšèªäŸåè¡šçŸïŒæœè±¡æ§æããªãŒãASTïŒãžã®è§£æã
- ASTãèšèªã«äŸåããªãçµ±äžããã圢åŒã«å€æããŸã
- DSLã§èª¬æãããŠãããã³ãã¬ãŒããžã®çŽæ¥ãããã³ã°ã
ãã®èšäºã¯ãæåã®æ®µéãã€ãŸã解æãããŸããŸãªããŒãµãŒã®æ©èœãšæ©èœã®æ¯èŒãJavaãPHPãPLSQLãTSQLãããã«ã¯CïŒææ³ãäŸãšããŠäœ¿çšããŠå®éã«çè«ãé©çšããããšã«å°å¿µããŸãã æ®ãã®æé ã«ã€ããŠã¯ã以éã®åºçç©ã§èª¬æããŸãã
å
容
解æçè«
åãã«ãçåãçãããããããŸããïŒãªãçµ±äžãããASTãæ§ç¯ããæ£èŠè¡šçŸã䜿çšãã代ããã«ã°ã©ããããã³ã°ã¢ã«ãŽãªãºã ãéçºããã®ã§ããïŒ å®éãæ£èŠè¡šçŸã䜿çšããŠãã¹ãŠã®ãã¿ãŒã³ãç°¡åãã€äŸ¿å©ã«èª¬æã§ããããã§ã¯ãããŸããã ããšãã°ãCïŒã§ã¯ãååä»ãã°ã«ãŒããšããã¯ãªã³ã¯ã®ãããã§ãCïŒã®æ£èŠè¡šçŸã«ã¯ã³ã³ããã¹ãã®ãªãææ³ã®åãããããšã«æ³šæããŠãã ããïŒãã ãããã®ãããªè¡šçŸã䜿çšããŠãã¿ãŒã³ãèšè¿°ããããã»ã¹ã¯ã ä»ã®ãããã€ãªè¡šçŸã䌎ã è€éïŒã ãã®ããŒãã«é¢ããPVS-Studioã®éçºè
ããã®èšäºããããŸãã ããã«ãçµæãšããŠåŸãããçµ±äžãããASTã®æ¥ç¶æ§ã«ãããå°æ¥ãããã䜿çšããŠãã³ãŒãããããã£ã®ã°ã©ããªã©ãã³ãŒãå®è¡ã®ããè€éãªè¡šçŸãæ§ç¯ã§ããããã«ãªããŸã ã
çšèª
æ§æ解æçè«ã«ç²ŸéããŠãã人ã¯ãã®ã»ã¯ã·ã§ã³ãé£ã°ããããããŸããã
解æã¯ããœãŒã¹ã³ãŒããæ§é åãã¥ãŒã«å€æããããã»ã¹ã§ãã å
žåçãªããŒãµãŒã¯ãã¬ã¯ãµãŒãšããŒãµãŒã®çµã¿åããã§ãã ã¬ã¯ãµãŒã¯ããœãŒã¹ã³ãŒãå
ã®æåãããŒã¯ã³ãšåŒã°ããæå³ã®ããã·ãŒã±ã³ã¹ã«ã°ã«ãŒãåããŸãã ãã®åŸãããŒã¯ã³ã®ã¿ã€ãã決å®ãããŸãïŒèå¥åãçªå·ãæååãªã©ïŒã ããŒã¯ã³ã¯ãããŒã¯ã³ã®æå³ãšãã®ã¿ã€ãã®çµã¿åããã§ãã 次ã®å³ã®äŸã§ã¯ãããŒã¯ã³ã¯sp ã = ã 100ã§ãã ããŒãµãŒã¯ã解æããªãŒãšåŒã°ããããŒã¯ã³ã¹ããªãŒã ããæ¥ç¶ãããããªãŒæ§é ãæ§ç¯ããŸãã ãã®å Žåã assignã¯ããªãŒã®ããŒãã®1ã€ã§ãã æœè±¡æ§æããªãŒãŸãã¯ASTã¯ããã©ã±ãããã³ã³ããªã©ã®éèŠã§ãªãããŒã¯ã³ãåé€ããããããé«ãã¬ãã«ã®è§£æããªãŒã§ãã ãã ããåå¥è§£æãšè§£æã®æé ãçµã¿åãããããŒãµãŒããããŸãã

ã«ãŒã«ã¯ãããŸããŸãªASTããŒããèšè¿°ããããã«äœ¿çšãããŸãã ãã¹ãŠã®èŠåã®çµåã¯ãèšèªã®ææ³ãšåŒã°ããŸãã ææ³ã«åºã¥ããŠèšèªã解æããããã®ç¹å®ã®ãã©ãããã©ãŒã ïŒã©ã³ã¿ã€ã ïŒçšã®ã³ãŒããçæããããŒã«ããããŸãã ãããã¯ããŒãµãŒãžã§ãã¬ãŒã¿ãŒãšåŒã°ããŸãã ããšãã°ã ANTLR ã Bison ã Coco /Rã ãã ããäœããã®çç±ã§ãããšãã°Roslynã®ããã«ãããŒãµãŒã¯æåã§äœæãããããšããããããŸãã æåã®ã¢ãããŒãã®å©ç¹ã¯ãããŒãµãŒãããå¹ççã§èªã¿ãããåŸåãããããšã§ãã
.NETãã¯ãããžã§ãããžã§ã¯ããéçºããããšãæåã«æ±ºå®ãããã®ã§ãCïŒã³ãŒãã®åæã«Roslynã䜿çšããä»ã®èšèªã«ã¯ANTLRã䜿çšããããšã決å®ãããŸãããåŸè
ã¯.NETã©ã³ã¿ã€ã ããµããŒãããä»ã®éžæè¢ã¯æ©èœãå°ãªãããã§ãã
Chomskyéå±€ã«ãããšã4çš®é¡ã®åœ¢åŒèšèªããããŸãã
- éåžžã®äŸïŒ a n
- ã³ã³ããã¹ãããªãŒïŒCSãäŸïŒ a n b n ïŒ
- ç¶æ³äŸåïŒç絡ãäŸïŒ a n b n c n ïŒ
- ãã¥ãŒãªã³ã°å®å
šã
æ£èŠè¡šçŸã䜿çšãããšãæ¯èŒã®ããã«æãåçŽãªæ§é ã®ã¿ãèšè¿°ã§ããŸãããæ¥åžžã®ç·Žç¿ã§ã»ãšãã©ã®ã¿ã¹ã¯ãã«ããŒããŸãã æ£èŠè¡šçŸã®ãã1ã€ã®å©ç¹ã¯ãã»ãšãã©ã®ææ°ã®ããã°ã©ãã³ã°èšèªã§ãµããŒããããŠããããšã§ãã ãã¥ãŒãªã³ã°å®å
šèšèªã¯ãã©ã€ãã£ã³ã°ãšæ§æ解æã®äž¡æ¹ã®è€éãã®ããã«å®çšçã§ã¯ãããŸããïŒé£è§£ãªèšèªã®Thueãæãåºãããšãã§ããŸãïŒã
çŸåšãææ°ã®ããã°ã©ãã³ã°èšèªã®ã»ãŒå
šäœã®æ§æã¯ãCSææ³ã䜿çšããŠèšè¿°ã§ããŸãã KSèšèªã®ããŒãµãŒãšæ£èŠè¡šçŸããæã§ãæ¯èŒãããšãåŸè
ã«ã¯èšæ¶ããããŸããã KZèšèªãšCSèšèªã®ããŒãµãŒãæ¯èŒãããšãåŸè
ã¯ä»¥åã«ã¢ã¯ã»ã¹ããã«ãŒã«ãèŠããŠããŸããã
ããã«ãããå Žåã®èšèªã¯COPã§ãããå¥ã®å Žåã¯KZã§ãã ã»ãã³ãã£ã¯ã¹ãã€ãŸã èšèªã®å®çŸ©ãç¹ã«åã®äžè²«æ§ãšã®æŽåæ§ããã®èšèªã¯KZãšèŠãªãããšãã§ããŸãã ããšãã°ã T a = new T ïŒïŒã ããã§ãå³åŽã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®åã¯ãå·ŠåŽã«ç€ºãããŠãããã®ãšåãã§ãªããã°ãªããŸããã éåžžã解æ段éã®åŸã«ã»ãã³ãã£ã¯ã¹ã確èªããããšããå§ãããŸãã ãã ããCSææ³ã䜿çšããŠè§£æã§ããªãæ§ææ§é ããããŸããããšãã°ãPHPã®Heredocã¯æ¬¡ã®ãšããã§ãã$ x = <<< EOL Hello world EOL ; ãã®äžã§ã EOLããŒã¯ã³ã¯åºåãç·ã®å§ãŸããšçµããã®ããŒã«ãŒã§ããããã蚪åããããŒã¯ã³ã®å€ãèŠããŠããå¿
èŠããããŸãã ãã®èšäºã§ã¯ããã®ãããªKSããã³KZèšèªã®åæã«çŠç¹ãåœãŠãŸãã
ANTLR

ãã®ããŒãµãŒãžã§ãã¬ãŒã¿ãŒã¯LLïŒ*ïŒã§ãã ã20幎以äžååšãã2013幎ã«4çªç®ã®ããŒãžã§ã³ããªãªãŒã¹ãããŸããã çŸåšãGitHubã§éçºäžã§ãã çŸæç¹ã§ã¯ãJavaãCïŒãPython2ãPython3ãJavaScriptã®èšèªã§ããŒãµãŒãçæã§ããŸãã C ++ã®ã¢ãããŒãã«ã€ããŠã¯ãSwiftã ãã®ããŒã«ã§ã¯ãææ³ã®éçºãšãããã°ãéåžžã«ç°¡åã«ãªããŸããã LLLRææ³ã¯å·Šååž°èŠåãèš±å¯ããªããšããäºå®ã«ãããããããããŒãžã§ã³4ããANTLRã§ã¯ããã®ãããªèŠåãæžãããšãã§ããŸãïŒé衚瀺ãŸãã¯éæ¥å·Šååž°ã®èŠåãé€ãïŒã ããŒãµãŒãçæããããšããã®ãããªã«ãŒã«ã¯éåžžã®éå·Šååž°ã«ãŒã«ã«å€æãããŸãã ããã«ãããããšãã°ç®è¡åŒã®èšé²ãççž®ãããŸãã
expr : expr '*' expr | expr '+' expr | <assoc=right> expr '^' expr | id ;
ããã«ãããŒãžã§ã³4ã§ã¯ãAdaptive LLïŒ*ïŒã¢ã«ãŽãªãºã ã®äœ¿çšã«ããã解æããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŠããŸãã ãã®ã¢ã«ãŽãªãºã ã¯ãæ¯èŒçäœéã§äºæž¬äžå¯èœãªGLLããã³GLRã¢ã«ãŽãªãºã ã®å©ç¹ãçµã¿åãããŸããããããã®ã¢ã«ãŽãªãºã ã¯ãããŸããïŒèªç¶èšèªè§£æã§äœ¿çšïŒã䌎ãã±ãŒã¹ã解決ã§ããæšæºã®é«éLLååž°éäžã¢ã«ãŽãªãºã ã¯ãã¹ãŠã解決ããããšã¯ã§ããŸãããããŸããªã¿ã¹ã¯ã ã¢ã«ãŽãªãºã ã®æ¬è³ªã¯ãåã«ãŒã«ã§ã®LLããŒãµãŒã®æ¬äŒŒäžŠåèµ·åããã£ãã·ã¥ãããã³é©åãªäºæž¬ã®éžæã§ãïŒGLRãšã¯ç°ãªããããã€ãã®éžæè¢ã蚱容ãããŸãïŒã ãããã£ãŠãã¢ã«ãŽãªãºã ã¯åçã§ãã ã¢ã«ãŽãªãºã ã®çè«äžã®ææªã®è€éãã¯OïŒn 4 ïŒã§ãããšããäºå®ã«ãããããããå®éã«ã¯ãæ¢åã®ããã°ã©ãã³ã°èšèªã®è§£æé床ã¯ç·åœ¢ã§ãã ãŸãã4çªç®ã®ããŒãžã§ã³ã§ã¯ãæ§æãšã©ãŒãæ€åºããåŸã«è§£æããã»ã¹ã埩å
ããæ©èœã倧å¹
ã«é²åããŸããã ANTLR 4ã¢ã«ãŽãªãºã ãšä»ã®è§£æã¢ã«ãŽãªãºã ãšã®éãã®è©³çŽ°ã«ã€ããŠã¯ãã é©å¿LLïŒ*ïŒè§£æïŒåçåæã®åããåç
§ããŠãã ããã
ããºãªã³

Roslynã¯åãªãããŒãµãŒã§ã¯ãªããCïŒã³ãŒãã解æãåæãã³ã³ãã€ã«ããããã®å®å
šãªããŒã«ã§ãã ãã®éçºã¯GitHubã§ãé²è¡äžã§ãããANTLRãããããªãè¥ãã§ãã ãã®èšäºã§ã¯ãã»ãã³ãã£ã¯ã¹ã«é¢ä¿ãªããæ§æ解ææ©èœã«ã€ããŠã®ã¿èª¬æããŸãã Roslynã¯ãå¿ å®ã§äžå€ã®ã¹ã¬ããã»ãŒãããªãŒã§ã³ãŒãã解æããŸãã ä¿¡é Œæ§ã¯ãæ§æãšã©ãŒãå«ãŸããŠããå Žåã§ãããã®ãããªããªãŒãã¹ããŒã¹ãã³ã¡ã³ããããªããã»ããµãã£ã¬ã¯ãã£ããå«ãæåããæåãžã®ã³ãŒãã«å€æã§ãããšããäºå®ã«ãããŸãã äžå€æ§ã«ãããè€æ°ã®ã¹ã¬ããã§ããªãŒãç°¡åã«åŠçã§ããããã«ãªããŸããåã¹ã¬ããã¯ãå€æŽã®ã¿ãä¿åãããããªãŒã®ãã¹ããŒããã³ããŒãäœæããããã§ãã ãã®ããªãŒã«ã¯ã次ã®ãªããžã§ã¯ããå«ãŸããå ŽåããããŸãã
- æ§æããŒãã¯ãä»ã®ããã€ãã®ããŒããå«ã¿ãç¹å®ã®ãã¶ã€ã³ã衚瀺ããéã¿ãŒããã«ããªãŒããŒãã§ãã ãŸãããªãã·ã§ã³ã®ããŒãïŒifã®å Žåã¯ElseClauseSyntaxãªã©ïŒãå«ããããšãã§ããŸãã
- æ§æããŒã¯ã³ -ããŒã¯ãŒããèå¥åããªãã©ã«ããŸãã¯å¥èªç¹ã衚瀺ããã¿ãŒããã«ããŒãã
- æ§æããªãã¢ã¯ãã¹ããŒã¹ãã³ã¡ã³ãããŸãã¯ããªããã»ããµãã£ã¬ã¯ãã£ãã衚瀺ããã¿ãŒããã«ããŒãã§ãïŒã³ãŒãã«é¢ããæ
å ±ã倱ãããšãªãç°¡åã«åé€ã§ããŸãïŒã ããªãã¢ã¯èŠªãæã€ããšãã§ããŸããã ãããã®ããŒãã¯ãããªãŒãå€æããŠã³ãŒãã«æ»ãå ŽåïŒãªãã¡ã¯ã¿ãªã³ã°ãªã©ïŒã«äžå¯æ¬ ã§ãã
解æã®åé¡
ææ³ãšããŒãµãŒãéçºãããšããèæ
®ããªããã°ãªããªãããã€ãã®åé¡ããããŸãã
èå¥åãšããŠã®ããŒã¯ãŒã
ããŒã¯ãŒãã解æãããšãã«èå¥åã«ãªãããšããããããŸãã ããšãã°ãCïŒã§ã¯ã async Method()
ã·ã°ããã£ã®åã«é
眮ãããasync
ããŒã¯ãŒãã¯ãã¡ãœãããéåæã§ããããšãæå³ããŸãã ãã ããæå®ãããåèªãå€æ°ã®èå¥åãšããŠäœ¿çšãããå Žåã var async = 42;
ãã³ãŒããæå¹ã«ãªããŸãã ANTLRã¯ãã®åé¡ã2ã€ã®æ¹æ³ã§è§£æ±ºããŸãã
- æ§æèŠåã«ã»ãã³ãã£ãã¯è¿°èªã䜿çšïŒ
async: {_input.LT(1).GetText() == "async"}? ID ;
async: {_input.LT(1).GetText() == "async"}? ID ;
; ãã ããéåæããŒã¯ã³èªäœã¯ååšããŸããã ææ³ãã©ã³ã¿ã€ã ã«äŸåããèŠèŠããããããã®ã¢ãããŒãã¯äžé©åã§ãã - idã«ãŒã«èªäœã«ããŒã¯ã³ãå«ããããšã«ããïŒ
ASYNC: 'async'; ... id : ID ... | ASYNC;
ãããŸãã
èªç¶èšèªã§ã¯ããããŸãã«è§£éããããã¬ãŒãºããããŸãïŒããããã®çš®é¡ã®ééŒã¯ç§ãã¡ã®ã¯ãŒã¯ã·ã§ããã«ãããŸãããªã©ïŒã æ£åŒãªèšèªã§ã¯ããã®ãããªæ§æãçºçããå ŽåããããŸãã ããšãã°ã次ã®ã¹ããããïŒ
stat: expr ';' // expression statement | ID '(' ')' ';' // function call statement; ; expr: ID '(' ')' | INT ;
ãã ããèªç¶èšèªãšã¯ç°ãªãããããã¯ããããäžé©åã«èšèšãããææ³ã®çµæã§ãã ANTLRã¯ãããŒãµãŒçæã®ããã»ã¹ã§ãã®ãããªãããŸãããæ€åºã§ããŸãããã LL_EXACT_AMBIG_DETECTION
ãªãã·ã§ã³ãLL_EXACT_AMBIG_DETECTION
å Žåã解æããã»ã¹ã§ããããçŽæ¥æ€åºã§ããŸãïŒæ¢ã«è¿°ã¹ãããã«ãALLã¯åçã¢ã«ãŽãªãºã ã§ããããïŒã ãããŸããã¯ãã¬ã¯ãµãŒãšããŒãµãŒã®äž¡æ¹ã§çºçããå¯èœæ§ããããŸãã 2ã€ã®åäžã®ããŒã¯ã³ã®ã¬ã¯ãµãŒã§ã¯ããã¡ã€ã«å
ã§äžèšã§å®£èšãããããŒã¯ã³ã圢æãããŸãïŒèå¥åãæã€äŸïŒã ãã ãããããŸãããå®éã«æå¹ãªèšèªïŒC ++ãªã©ïŒã§ã¯ã次ã®ããã«ã»ãã³ãã£ãã¯è¿°èªïŒã³ãŒãæ¿å
¥ïŒã䜿çšããŠè§£æ±ºã§ããŸãã
expr: { isfunc(ID) }? ID '(' expr ')' // func call with 1 arg | { istype(ID) }? ID '(' expr ')' // ctor-style type cast of expr | INT | void ;
ãŸããææ³ãå°ãããçŽãããšã§ãããŸãããä¿®æ£ã§ããå ŽåããããŸãã ããšãã°ãCïŒã«ã¯ãããåäœã®å³ã·ããæŒç®åRIGHT_SHIFT: '>>'
; 2ã€ã®å±±æ¬åŒ§ã䜿çšããŠããžã§ããªãã¯ã¯ã©ã¹ãèšè¿°ããããšãã§ããŸãïŒ List<List<int>>
ã ããŒã¯ã³>>
ãå®çŸ©ãããšã2ã€ã®ãªã¹ãã®æ§ç¯ã¯è§£æã§ããŸãããããã¯ãããŒãµãŒãæŒç®å>>
2ã€ã®éãæ¬åŒ§ã®ä»£ããã«èšè¿°ãããŠãããšæ³å®ããããã§ãã ãã®åé¡ã解決ããã«ã¯ã RIGHT_SHIFT
ããŒã¯ã³ãåã«æåŠããã ãã§ååã§ãã åæã«ã LEFT_SHIFT: '<<'
ããŒã¯ã³LEFT_SHIFT: '<<'
ãæ®ãããšãã§ããŸããããã¯ãå±±æ¬åŒ§ã解æããéã®æåã®ã·ãŒã±ã³ã¹ãæå¹ãªã³ãŒãã§èŠã€ãããªãããã§ãã
ãã®ã¢ãžã¥ãŒã«ã§ã¯ãéçºãããææ³ã«ãããŸããããããã©ããã«ã€ããŠããŸã 詳现ã«ãã¹ãããŠããŸããã
ã¹ããŒã¹ãã³ã¡ã³ãã®åŠçã
解æã«é¢ããå¥ã®åé¡ã¯ã³ã¡ã³ãåŠçã§ãã ããã§äžäŸ¿ãªç¹ã¯ãææ³ã«ã³ã¡ã³ããå«ãããšãå®éã«ã¯åããŒãã«ã³ã¡ã³ããå«ãŸãããããè€éãããããšãå€æããããšã§ãã ãã ããéèŠãªæ
å ±ãå«ãŸããŠããå¯èœæ§ããããããã³ã¡ã³ããç Žæ£ã§ããŸããã ANTLRã¯ããããããã£ãã«ã䜿çšããŠã³ã¡ã³ããåŠçããå€ãã®ã³ã¡ã³ããä»ã®ããŒã¯ã³ããåé¢ããŸãã Comment: ~[\r\n?]+ -> channel(PhpComments);
Roslynã§ã¯ãã³ã¡ã³ãã¯ããªãŒããŒãã«å«ãŸããŸãããç¹å¥ãªã¿ã€ãã®æ§æããªãã¢ããããŸãã ANTLRãšRoslynã¯ã©ã¡ãããç¹å®ã®éåžžã®ããŒã¯ã³ã«é¢é£ä»ããããŠããç°¡åãªããŒã¯ã³ã®ãªã¹ããæäŸããŸãã ANTLRã§ã¯ãã¹ããªãŒã å
ã®ã€ã³ããã¯ã¹iã®ããŒã¯ã³ã«å¯ŸããŠãå·ŠãŸãã¯å³ããç¹å®ã®ãã£ãã«ãããã¹ãŠã®ããŒã¯ã³ãè¿ãã¡ãœããããããŸãïŒ getHiddenTokensToLeft(int tokenIndex, int channel)
ã getHiddenTokensToRight(int tokenIndex, int channel)
ã Roslynã§ã¯ããã®ãããªããŒã¯ã³ã¯ããã«ç«¯æ«æ§æããŒã¯ã³ã«å«ãŸããŸãã
ãã¹ãŠã®ã³ã¡ã³ããååŸããããã«ãANTLRã§ã¯ç¹å®ã®ãã£ãã«ã®ãã¹ãŠã®ããŒã¯ã³ãååŸã§ããŸãïŒ lexer.GetAllTokens().Where(t => t.Channel == PhpComments)
ãããã³Roslynã§ã¯ãã«ãŒãããŒãã®ãã¹ãŠã®DescendantTriviaã次ã®SyntaxKindã§ååŸã§ããŸãã SingleLineCommentTrivia ã MultiLineCommentTrivia ã SingleLineDocumentationCommentTrivia ã MultiLineDocumentationCommentTrivia ã DocumentationCommentExteriorTrivia ã XmlComment ã
ã¹ããŒã¹ãšã³ã¡ã³ããåŠçããããšã¯ãLLVMãªã©ã®ã³ãŒããåæã«äœ¿çšã§ããªãçç±ã®1ã€ã§ããã¹ããŒã¹ãšã³ã¡ã³ãã¯ãåã«ãã®äžã«æšãŠãããŸãã ã³ã¡ã³ãã«å ããŠãã¹ããŒã¹ã®åŠçãéèŠã§ãã ããšãã°ãifã®1ã€ã®ã¹ããŒãã¡ã³ãã§ãšã©ãŒãæ€åºããã«ã¯ïŒäŸã¯ãFreeBSDã«ãŒãã«ã®rummagedèšäºPVS-StudioããåãããŠããŸã ïŒïŒ
case MOD_UNLOAD: if (via_feature_rng & VIA_HAS_RNG) random_nehemiah_deinit(); random_source_deregister(&random_nehemiah);
解æãšã©ãŒåŠçã

åããŒãµãŒã®éèŠãªæ©èœã¯ãšã©ãŒåŠçã§ã-次ã®çç±ããïŒ
- 解æããã»ã¹ã¯ã1ã€ã®ãšã©ãŒã ãã§äžæãããã¹ãã§ã¯ãããŸããããæ£ãã埩å
ãããã³ãŒããããã«è§£æããå¿
èŠããããŸãïŒããšãã°ãã»ãã³ãã³ãæããåŸïŒã
- å€ãã®ç¡é¢ä¿ãªãšã©ãŒã®ä»£ããã«ãé¢é£ãããšã©ãŒãšãã®å Žæãæ€çŽ¢ããŸãã
ANTLRã®ãšã©ãŒ
ANTLRã«ã¯ã次ã®ã¿ã€ãã®è§£æãšã©ãŒããããŸãã
ããŒã¯ã³èªèãšã©ãŒ ïŒLexer no viable altïŒ; æ¢åã®ããŒã¯ã³ããããŒã¯ã³ãçæããããã®ã«ãŒã«ããªãããšã瀺ãå¯äžã®æ¢åã®åå¥ãšã©ãŒïŒ
ã¯ã©ã¹ïŒ {int i; }-ãã®ãããªããŒã¯ã³ã¯ïŒã§ãã
ããŒã¯ã³ããããŸããïŒ ããŒã¯ã³ããããŸããïŒ; ãã®å ŽåãANTLRã¯äžè¶³ããŠããããŒã¯ã³ãããŒã¯ã³ã¹ããªãŒã ã«æ¿å
¥ããäžè¶³ããŠããããšãããŒã¯ããååšãããã®ããã«è§£æãç¶è¡ããŸãã
ã¯ã©ã¹T {int fïŒxïŒ{a = 3 4 5; } } -æåŸã«ãã®ãããªããŒã¯ã³}
ããããŸãã
è¿œå ããŒã¯ã³ ïŒå€éšããŒã¯ã³ïŒ; ANTLRã¯ãããŒã¯ã³ã誀ã£ãŠããããšãããŒã¯ããååšããªããã®ããã«ããã«è§£æãç¶ããŸãããã®äŸã§ã¯ããã®ãããªããŒã¯ã³ãæåã§ãã
ã¯ã©ã¹T ; {int i; }
äºææ§ã®ãªãå
¥åãã§ãŒã³ ïŒå
¥åã®äžäžèŽïŒ; ãã®å Žåãããããã¯ã¢ãŒããããªã³ã«ãªããå
¥åããŒã¯ã³ãã§ãŒã³ã¯ç¡èŠãããããŒãµãŒã¯åæââã»ããããããŒã¯ã³ãäºæããŸãã 次ã®äŸã§ã¯ãããŒã¯ã³4ãš5ã¯ç¡èŠãããåæããŒã¯ã³ã¯;ã§ãã
ã¯ã©ã¹T {int fïŒxïŒ{a = 3 4 5 ; }}
- 代æ¿ããªã ïŒå®è¡å¯èœãªä»£æ¿å
¥åããªãïŒ; ãã®ãšã©ãŒã¯ãä»ã®ãã¹ãŠã®è§£æãšã©ãŒã説æããŠããŸãã
ã¯ã©ã¹T { int; }
ããã«ã次ã®ããã«ã«ãŒã«ã«éžæè¢ãè¿œå ããããšã«ããããšã©ãŒãæåã§åŠçã§ããŸãã
function_call : ID '(' expr ')' | ID '(' expr ')' ')' {notifyErrorListeners("Too many parentheses");} | ID '(' expr {notifyErrorListeners("Missing closing ')'");} ;
ããã«ãANTLR 4ã¯ç¬èªã®ãšã©ãŒåŠçã¡ã«ããºã ã䜿çšã§ããŸãã ããã¯ãããšãã°ãããŒãµãŒã®ããã©ãŒãã³ã¹ãåäžãããããã«å¿
èŠã§ããæåã«ãé«éSLLã¢ã«ãŽãªãºã ã䜿çšããŠã³ãŒãã解æãããŸããããããŸããã§ã³ãŒãã誀ã£ãŠè§£æããå¯èœæ§ããããŸãã ãã®ã¢ã«ãŽãªãºã ã䜿çšããŠãå°ãªããšã1ã€ã®ãšã©ãŒïŒã³ãŒãã®ãšã©ãŒãŸãã¯ãããŸããã®ããããïŒãããããšãå€æããå Žåãã³ãŒãã¯å®å
šã§ã¯ãããããé«éã§ã¯ãªãALLã¢ã«ãŽãªãºã ã䜿çšããŠè§£æãããŸãã ãã¡ãããå®éã®ãšã©ãŒïŒã¹ããããªã©ïŒãå«ãã³ãŒãã¯åžžã«LLã䜿çšããŠè§£æãããŸãããéåžžããã®ãããªãã¡ã€ã«ã¯ãšã©ãŒã®ãªããã¡ã€ã«ãããå°ãªããªããŸãã
ANTLRã§ã®è§£æé床ã®æ倧å ããºãªã³ã®ãšã©ãŒ
Roslynã«ã¯æ¬¡ã®è§£æãšã©ãŒããããŸãã
- æ§æããããŸãã Roslynã¯ãããããã£å€
IsMissing = true
察å¿ããããŒããå®æããIsMissing = true
ïŒå
žåçãªäŸã¯ãã»ãã³ãã³ãªãã®ã¹ããŒãã¡ã³ãã§ãïŒã - äžå®å
šãªã¡ã³ã㌠; å¥ã®
IncompleteMember
ããŒããäœæãããŸãã - æ°å€ãã¹ããªã³ã°ããŸãã¯æåãªãã©ã«ã®èª€ã£ãå€ ïŒäŸãã°ã倧ããããå€ã空ã®æåïŒïŒ
NumericLiteralToken
ã StringLiteralToken
ãŸãã¯CharacterLiteralToken
çããKindãæã€å¥åã®ããŒãã - äœåãªæ§æ ïŒããšãã°ãã©ã³ãã ã«å
¥åãããæåïŒïŒKind =
SkippedTokensTrivia
ã§å¥ã®ããŒããäœæãããŸãã
次ã®ã³ãŒãã¹ããããã¯ããããã®ãã¹ãŠã®ãšã©ãŒã瀺ããŠããŸã
ïŒRoslynã¯Visual Studio Syntax Visualizerã®ãã©ã°ã€ã³ã§ãããŒãããã®ã«ã䟿å©ã§ãïŒïŒ
Roslynã®ãã¹ãŠã®ã¿ã€ãã®æ§æãšã©ãŒãå«ãCïŒã³ãŒã namespace App { class Program { ; // Skipped Trivia static void Main(string[] args) { a // Missing ';' ulong ul = 1lu; // Incorrect Numeric string s = """; // Incorrect String char c = ''; // Incorrect Char } } class bControl flow { c // Incomplete Member } }
ããèãæããããããã®ã¿ã€ãã®æ§æãšã©ãŒã®ãããã§ãRoslynã¯ä»»æã®æ°ã®ãšã©ãŒã®ããããªãŒãæåããšã«ã³ãŒãã«æ»ãããšãã§ããŸãã
çè«ããå®è·µãž

PHPã®å Žåãäžèšã®çè«ãèŠèŠçã«å¿çšããT-SQLããŒãµãŒã php ã tsql ã plsql grammarãéçºããããªãŒãã³ãœãŒã¹ã§ã¬ã€ã¢ãŠããããŸããã Java解æã§ã¯ãæ¢è£œã®javaããã³java8ã®ææ³ã䜿çšãããæ¯èŒãããŸããã ãŸããRoslynãšANTLRã«åºã¥ããããŒãµãŒãæ¯èŒããããã«ãèšèªã®ããŒãžã§ã³5ãš6ããµããŒãããããã«CïŒææ³ãå€æŽããŸããã ãããã®ææ³ã®éçºãšäœ¿çšã«ãããèå³æ·±ãç¹ã以äžã«èª¬æããŸãã SQLããŒã¹ã®èšèªã¯åœä»€åããã宣èšåã§ãããT-SQLã®æ¹èšã§ããPL / SQLã«ã¯åœä»€åæ§æïŒ å¶åŸ¡ãã㌠ïŒã®ãµããŒããããããã®å€§éšåã¯ã¢ãã©ã€ã¶ãŒãéçºããŠããŸãã
Javaããã³Java8ã®ææ³
ã»ãšãã©ã®å ŽåãJava 7ææ³ã«åºã¥ãããŒãµãŒã¯ãJava 8ãããé«éã«ã³ãŒãã解æããŸããäŸå€ã¯ãããšãã°ã ManyStringConcatenation.javaãã¡ã€ã«ã§ã®æ·±ãååž°ã®å Žåãé€ããŸãã ããã¯åãªãåæäŸã§ã¯ãªããé¡äŒŒã®ãã¹ãã²ããã£ã³ãŒãããæã€ãã¡ã€ã«ã«å®éã«ééããããšã«æ³šæããŠãã ããã å€æããããã«ãåé¡å
šäœã¯ãŸãã«åŒã®å·Šã®ååž°èŠåã«ãããã®ã§ãã Java 8ã®ææ³ã«ã¯ãããªããã£ããªååž°ã䌎ãã«ãŒã«ã®ã¿ãå«ãŸããŠããŸãã åå§ååž°ã®ã«ãŒã«ã¯ãéåžžã®ã«ãŒã«ãšã¯ç°ãªãã代æ¿ã®å·ŠãŸãã¯å³ã®éšåã§ã®ã¿åç
§ãããäž¡æ¹ã§åæã«åç
§ãããããšã¯ãããŸããã æ£èŠã®ååž°åŒã®äŸïŒ
expression : expression ('*'|'/') expression | expression ('+'|'-') expression | ID ;
ãŸããäžèšã®ã«ãŒã«ãããªããã£ããªå·Šååž°ã«ãŒã«ã«å€æãããšã次ã®ã«ãŒã«ãååŸãããŸãã
expression : multExpression | expression ('+'|'-') multExpression ; multExpression : ID | multExpression ('*'|'/') ID ;
ãŸãã¯ãéååž°çã§ãïŒãã ãããã®å Žåã解æåŸã®åŒã¯ãã€ããªã§ãªããªããããåŠçãããŸã䟿å©ã§ã¯ãããŸããïŒã
expression : multExpression (('+'|'-') multExpression)* ;
æäœã«æ£ããé£æ³æ§ïŒææ°ãªã©ïŒãããå Žåãããªããã£ããªå³ååž°èŠåã䜿çšãããŸãã
expression : <assoc=right> expression '^' expression | ID ;
powExpression : ID '^' powExpression | ID ;
äžæ¹ã§ã¯ãå·Šå©ãã®ã«ãŒã«ãå€æããããšã§ãå€æ°ã®åçš®ã®æäœããããã£ãã«åºäŒããªããã¡ã€ã«ã®é«ã¡ã¢ãªæ¶è²»ãšäœããã©ãŒãã³ã¹ã®åé¡ãæé€ããä»æ¹ã§ã¯ãå€ãã®ãã¡ã€ã«ã®æ®ãã®ããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ãããŸãã ãããã£ãŠãæœåšçã«éåžžã«æ·±ããªãå¯èœæ§ãããåŒïŒããšãã°ãæååã®é£çµïŒã«ã¯ããªããã£ããªååž°ã䜿çšããä»ã®ãã¹ãŠã®å ŽåïŒããšãã°ãæ°å€ã®æ¯èŒïŒã«ã¯éåžžã®ååž°ã䜿çšããããšããå§ãããŸãã
PHPææ³
.NETãã©ãããã©ãŒã ã§PHPã解æããããã®Phalangerãããžã§ã¯ãããããŸãã ãã ãããã®ãããžã§ã¯ããå®éã«éçºãããŠããããASTããŒãããã©ããŒã¹ããããã®èšªåè
ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŠããªããšããäºå®ã«äžå®ãæããŸããïŒWalkerã®ã¿ïŒã ãããã£ãŠãANTLRã®äžã§PHPææ³ãç¬èªã«éçºããããšã決å®ãããŸããã
倧æåãšå°æåãåºå¥ããªãããŒã¯ãŒãã
ãåç¥ã®ããã«ãPHPã§ã¯ãå€æ°åïŒã$ãã§å§ãŸãïŒãé€ããã¹ãŠã®ããŒã¯ã³ã¯å€§æåãšå°æåãåºå¥ãããŸããã ANTLRã®å Žåã倧æåãšå°æåãåºå¥ããªãæ¹æ³ã¯2ã€ã®æ¹æ³ã§å®è£
ã§ããŸãã
ãã¹ãŠã®ã©ãã³æåã®æççãªåå¥èŠåã宣èšãããããã次ã®æ¹æ³ã§äœ¿çšããŸãã
Abstract: ABSTRACT; Array: ARRAY; As: AS; BinaryCast: BINARY; BoolType: BOOLEAN | BOOL; BooleanConstant: TRUE | FALSE; ... fragment A: [aA]; fragment B: [bB]; ... fragment Z: [zZ];
ANTLRã®ã¹ããããã¯ãä»ã®ããŒã¯ã³ã§äœ¿çšã§ããããŒã¯ã³ã®äžéšã§ããã
ãã ããããèªäœã¯ããŒã¯ã³ã§ã¯ãããŸããã ããŒã¯ã³ãèšè¿°ããããã®åºæ¬çãªæ§æç³è¡£ã§ãã ããšãã°ããã©ã°ã¡ã³ãã䜿çšããªãå Žåãæåã®ããŒã¯ã³ã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã Abstract: [Aa] [Bb] [Ss] [Tt] [Rr] [Aa] [Cc] [Tt]
ã ãã®ã¢ãããŒãã®å©ç¹ã¯ãçæãããã¬ã¯ãµãŒãã©ã³ã¿ã€ã ã«äŸåããªãããšã§ããããã¯ã倧æåãšå°æåãææ³ã§ããã«å®£èšãããããã§ãã ãã€ãã¹ã®ãã¡ããã®ã¢ãããŒãã䜿çšããã¬ã¯ãµãŒã®ããã©ãŒãã³ã¹ã¯ã2çªç®ã®æ¹æ³ãããäœãããšã«æ³šæããŠãã ããã
- æåã®å
¥åã¹ããªãŒã å
šäœãäžäœïŒãŸãã¯äžäœïŒã¬ãžã¹ã¿ã«ç§»åããã¬ã¯ãµãŒãéå§ããŸããã¬ã¯ãµãŒã§ã¯ããã®ã¬ãžã¹ã¿ã«ãã¹ãŠã®ããŒã¯ã³ãèšè¿°ãããŸãã ãã ãã ã«ã¹ã¿ã ãã¡ã€ã«ãŸãã¯ã¹ããªã³ã°ã¹ããªãŒã ã®å®è£
ãšLAã®ãªãŒããŒã©ã€ãã§èª¬æãããŠããããã«ããã®ãããªå€æã¯ã©ã³ã¿ã€ã ïŒJavaãCïŒãJavaScriptãPythonïŒããšã«åå¥ã«è¡ãå¿
èŠããããŸãã ããã«ããã®ã¢ãããŒãã§ã¯ãäžéšã®ããŒã¯ã³ã倧æåãšå°æåãåºå¥ããä»ã®ããŒã¯ã³ãããã§ãªãããšã確èªããããšã¯å°é£ã§ãã
éçºãããPHPææ³ã§ã¯ãéåžžãæ§æ解æãããçæéã§åå¥è§£æãå®è¡ããããããæåã®ã¢ãããŒãã䜿çšãããŸããã ãšã«ãããææ³ãã©ã³ã¿ã€ã ã«äŸåããŠããããšãå€æãããšããäºå®ã«ããããããããã®ã¢ãããŒãã¯ãææ³ãä»ã®ã©ã³ã¿ã€ã ã«ç§»æ€ããã¿ã¹ã¯ãæœåšçã«åçŽåããŸãã ããã«ã倧æåãšå°æåãåºå¥ããªãããŒã¯ã³ã®èª¬æã容æã«ããããã«ããã«ãªã¯ãšã¹ãRFC倧æåãšå°æåãåºå¥ããªãæŠå¿µå®èšŒãäœæããŸããã ããããæ®å¿µãªããã圌ã¯ANTLRã³ãã¥ããã£ããããŸãæ¿èªãåããŠããŸããã§ããã
PHPãHTMLãCSSãJavaScriptã®åå¥ã¢ãŒãã
ãåãã®ããã«ãPHPã³ãŒãã®æ¿å
¥ã¯ãã»ãŒã©ãã§ãHTMLã³ãŒãå
ã«é
眮ã§ããŸãã CSSããã³JavaScriptã³ãŒãã®æ¿å
¥ããã®HTMLã«é
眮ã§ããŸãïŒãããã®æ¿å
¥ã¯ãã¢ã€ã©ã³ãããšãåŒã°ããŸãïŒã ããšãã°ã次ã®ã³ãŒãïŒ ä»£æ¿æ§æã䜿çšïŒã¯æå¹ã§ãã
<?php switch($a): case 1:
ãŸãã¯
<script type="text/javascript"> document.addEvent('domready', function() { var timers = { timer: <?=$timer?> }; var timer = TimeTic.periodical(1000, timers); functionOne(<?php echo implode(', ', $arrayWithVars); ?>); }); </script>
幞ããªããšã«ãANTLRã«ã¯ãããããã¢ãŒãã®ã¡ã«ããºã ããããç¹å®ã®æ¡ä»¶äžã§ããŒã¯ã³ã®ç°ãªãã»ãããåãæ¿ããããšãã§ããŸãã ããšãã°ã SCRIPTã¢ãŒããšSTYLEã¢ãŒãã¯ãããããJavaScriptãšCSSã®ããŒã¯ã³ã®ã¹ããªãŒã ãçæããããã«èšèšãããŠããŸãïŒãã ãããã®ææ³ã§ã¯ãå®éã«ã¯åã«ç¡èŠãããŸãïŒã ããã©ã«ãã¢ãŒãã§ã¯ã DEFAULT_MODE HTMLããŒã¯ã³ãçæãããŸãã ã¿ãŒã²ããã³ãŒããã¬ã¯ãµãŒã«æ¿å
¥ããããšãªããANTLRã§ä»£æ¿æ§æã®ãµããŒããå®è£
ã§ããããšã«æ³šæããŠãã ããã ã€ãŸãã nonEmptyStatementã«ã¯inlineHtmlã«ãŒã«ãå«ãŸããããã«ã¯DEFAULT_MODEã¢ãŒãã§åä¿¡ããããŒã¯ã³ãå«ãŸããŸãã
nonEmptyStatement : identifier ':' | blockStatement | ifStatement | ... | inlineHtml ; ... inlineHtml : HtmlComment* ((HtmlDtd | htmlElement) HtmlComment*)+ ;
è€éãªç¶æ³äŸåæ§é ã
ANTLRã¯KSææ³ã®ã¿ããµããŒãããŸãããããããã¢ã¯ã·ã§ã³ãã€ãŸãã蚱容ãããèšèªã®ã»ãããå°ãªããšãç¶æ³äŸåã«æ¡åŒµããä»»æã®ã³ãŒãã®æ¿å
¥ãããããšã«æ³šæããŠãã ããã ãã®ãããªæ¿å
¥ã®å©ããåããŠã Heredocãªã©ã®æ§é ã®åŠçãå®è£
ãããŸããã
<?php foo(<<< HEREDOC Heredoc line 1. Heredoc line 2. HEREDOC ) ; ?>
T-SQLã®ææ³
ãSQLãã®å
±éã®ã«ãŒãã«ãããããããT-SQLææ³ïŒMSSQLïŒãšPL / SQLã¯äºãã«ããªãç°ãªããŸãã
ãã®å°é£ãªèšèªçšã«ç¬èªã®ããŒãµãŒãéçºããªãããšãå¬ããæããŸãã ãã ããæ¢åã®ããŒãµãŒã¯ãå®å
šæ§ãé¢é£æ§ïŒæŸæ£ãããGOLDããŒãµãŒã®ææ³ ïŒãããã³CïŒã®ãªãŒãã³ãœãŒã¹ïŒ äžè¬çãªSQLããŒãµãŒ ïŒã®åºæºãæºãããŠããŸããã§ããã TSQL MSDN. : , , ( SQL- MSDN). , . , . , - .
PL/SQL
PL/SQL , ANTLR3 . , java-runtime. java , AST ( , ). ,
decimal_key : {input.LT(1).getText().equalsIgnoreCase("decimal")}? REGULAR_ID
:
decimal_key: DECIMAL
, .
C#-
, , 5 6 , . . -, runtime.
C# ( , , . . false ):
#if DEBUG && false Sample not compilied wrong code var 42 = a + ; #else
, -, COMMENTS_CHANNEL DIRECTIVE . codeTokens
, . . , ANTLR . â CSharpPreprocessorParser.g4 . true
false
#if
, #elif
, else
, true
, , . Conditional Symbols ( "DEBUG").
true
, codeTokens
, â . ( var 42 = a + ;
) . : CSharpAntlrParser.cs .
æååè£é
, , , (interpolation-expression), . , (, #0.##). , (regular), (verbatium), . MSDN .
, :
s = $"{p.Name} is \"{p.Age} year{(p.Age == 1 ? "" : "s")} old"; s = $"{(p.Age == 2 ? $"{new Person { } }" : "")}"; s = $@"\{p.Name} ""\"; s = $"Color [ R={func(b: 3):#0.##}, G={G:#0.##}, B={B:#0.##}, A={A:#0.##} ]";
, . CSharpLexer.g4 .
ãã¹ãäž
ANTLR
Roslyn, , . ANTLR :
ANTLR Roslyn
Release . ANTLR 4 4.5.0-alpha003 Roslyn (Microsoft.CodeAnalysis) 1.1.1.
WebGoat.PHP
â 885. â 137 248, â 4 461 768.
â 00:00:31 ( 55%, 45%).
PL/SQL Samples
â 175. â 1 909, â 55 741.
< 1 . ( 5%, 95%).
CoreFX-1.0.0-rc2
â 7329. â 2 286 274, â 91 132 116.
:
- Roslyn: 00:00:04 .,
- ANTLR: 00:00:24 . ( 12%; 88%).
Roslyn-1.1.1
â 6527. â 1 967 672, â 74 319 082.
:
- Roslyn: 00:00:03 .,
- ANTLR: 00:00:16 . ( 12%; 88%).
CoreFX Roslyn , C# ANTLR 5 Roslyn, . , « » , Roslyn, C#- Java, Python JavaScript ( ), .
, , . PHP, , . , , T-SQL PL/SQL ( ) ( 20). , C# SHARP: NEW_LINE Whitespace* '#';
SHARP: '#';
, 7 , 10 ! , , #, ( , ).
ANTLR Roslyn
C#-, ANTLR:
namespace App { class Program { static void Main(string[] args) { a = 3 4 5; } } class B { c }
ANTLR
- token recognition error at: '' at 3:5
- mismatched input '4' expecting {'as', 'is', '[', '(', '.', ';', '+', '-', '*', '/', '%', '&', '|', '^', '<', '>', '?', '??', '++', '--', '&&', '||', '->', '==', '!=', '<=', '>=', '<<'} at 8:19
- extraneous input '5' expecting {'as', 'is', '[', '(', '.', ';', '+', '-', '*', '/', '%', '&', '|', '^', '<', '>', '?', '??', '++', '--', '&&', '||', '->', '==', '!=', '<=', '>=', '<<'} at 8:21
- no viable alternative at input 'c}' at 15:5
- missing '}' at 'EOF' at 15:6
Roslyn
- test(3,5): error CS1056: Unexpected character ''
- test(8,19): error CS1002:; expected
- test(8,21): error CS1002:; expected
- test(15,5): error CS1519: Invalid token '}' in class, struct, or interface member declaration
- test(15,6): error CS1513: } expected
, Roslyn , ANTLR. . . , Roslyn , . , ( , ), ANTLR . ANTLR , ( , ). , #if
, . ( - ).
, ANTLR 4 , , . ( 70000 PHP ) , . lexer.Interpreter.ClearDFA()
parser.Interpreter.ClearDFA()
.
, . , GetAllTokens()
ClearDFA()
( ) "Object reference not set to an instance of an object". , ANTLR C#, ( ) ( ) ReadWriterLockSlim
.
Roslyn . 5 C# aspnet-mvc-6.0.0-rc1 , roslyn-1.1.1 , corefx , Newtonsoft.Json-8.0.2 ImageProcessor-2.3.0 200 .
ãããã«
ANTLR Roslyn. 次ã®èšäºã§æããŠãããŸãïŒ
- AST Visitor Walker (Listener);
- , ANTLR 4;
- .NET;
- AST;
- DSL .
VladimirKochetkov « â SAST» 40 60 .
ãœãŒã¹