ãŸããå¿ èŠãªããŒã«ãæ€èšããŠãã ããã 以äžãå¿ èŠã§ãã
- ANTLRWorks-ææ³éçºããã³ãããã°ç°å¢
- ANTLR v3-ANTLRèªäœïŒå·çæç¹ã§ã¯ãææ°ããŒãžã§ã³ã¯3.2ã§ãïŒ
- CïŒã©ã³ã¿ã€ã é åžïŒAntlr3.Runtime.dllïŒ-ãžã§ãã¬ãŒã¿ãŒã䜿çšããããã®.NETã©ã€ãã©ãª
- Visual Studio-CïŒã³ãŒããã³ã³ãã€ã«ããã³ãããã°ããããã®ãã®ä»ã®ããŒã«
- Javaã©ã³ã¿ã€ã -ANTLRããã³ANTLRWorksã¯Javaã§èšè¿°ãããŠãããã
ANTLRã«é¢é£ãããã¹ãŠãã€ãŸãæåã®3ã€ã®ãã€ã³ãã¯ãå ¬åŒWebãµã€ãhttp://www.antlr.org/download.htmlããç¡æã§ãã€ãŸãç¡æã§ããŠã³ããŒãã§ããŸãã
ANTLRã«ã€ããŠå®éã«ããã€ãã®èšèã玹ä»ããŸãïŒWikipediaãåç §ïŒã ANTLR ïŒèšèªèªèã®ããã®å¥ã®ããŒã«ïŒã¯ãã¿ãŒã²ããããã°ã©ãã³ã°èšèªïŒC ++ãJavaãCïŒãPythonãRubyïŒã®ããããã§ããŒãµãŒããã°ã©ã ïŒåå¥è§£æããã°ã©ã ãªã©ïŒãèªåçã«äœæã§ããããŒãµãŒãžã§ãã¬ãŒã¿ãŒã§ãã LLïŒ*ïŒã®èšè¿°ã«ãããš-RBNFã«è¿ãèšèªã®ææ³ã ãã®ãããžã§ã¯ãã®èè ã¯ããµã³ãã©ã³ã·ã¹ã³å€§åŠã®ãã¬ã³ã¹ã»ããŒææã§ãã ãã®ãããžã§ã¯ãã¯ãªãŒãã³ãœãŒã¹ã§ãããBSDã©ã€ã»ã³ã¹ã®äžã§é åžãããŠãããšèšããªããã°ãªããŸããã
1.åé¡ã®å£°æ
ãã®ãããã¯ã®ãã¬ãŒã ã¯ãŒã¯å ã§ãCïŒã§ããã°ã©ã ãäœæããŸããããã°ã©ã ã¯ã³ã³ãœãŒã«ãããæ¹è¡ã§åºåãããç®è¡åŒãèªã¿åããèšç®çµæãåºåããŸãã å ç®ãæžç®ãä¹ç®ãé€ç®ãªã©ã®ç®è¡æŒç®ããµããŒããããŸãã ç°¡åã«ããããã«ããã¹ãŠã®æäœã¯æŽæ°ã§å®è¡ãããŸãã ããŒãã¹ãšããŠãèšç®æ©ïŒãããžã§ã¯ããšåŒã³ãŸãããïŒã¯å€æ°ã®æäœããµããŒãããããã«å¿ããŠå²ãåœãŠæäœããµããŒãããŸãã
2.ææ³éçº
ANTLRWorksãèµ·åããææ³ã䜿çšããŠãããžã§ã¯ããäœæããŸãã èµ·åãããšãANTLRWorksã¯äœæããããã¥ã¡ã³ãã®çš®é¡ãå°ããŸãã ãANTLR 3 GrammarïŒ* .gïŒããéžæããŸãã 衚瀺ããããŠã£ã³ããŠã§ãææ³ã®ååãå ¥åãïŒãCalcããšåŒã³ãŸãããïŒãããã©ã«ãã§ã¿ã€ãããã®ãŸãŸã«ããŸãïŒãçµåææ³ãïŒã ããã¯ã1ã€ã®ãã¡ã€ã«ã«ãåå¥è§£æãšæ§æ解æã®äž¡æ¹ã®ææ³èŠåãããããšãæå³ããŸãã ãããªãäžäžèŽãé¿ããããã«ãåå¥è§£æåšãã¬ã¯ãµãŒãæ§æãããŒãµãŒãšåŒã³ãŸãããã ããããããŠã³ãªã¹ãã®ä»ã®ãªãã·ã§ã³ãèŠããšãå ¥åããè¡šèšãç解ã§ããŸãã ã¬ã¯ãµãŒãæåã®ã¹ããªãŒã ããããŒã¯ã³ïŒããŒã¯ã³ïŒãéžæããããšãæãåºãããŠãã ããïŒæŽæ°ãèå¥åãæååãªã©ãããŒãµãŒã¯ããŒã¯ã³ã¹ããªãŒã å ã®ããŒã¯ã³ãæ£ããé åºã§ãããã©ããããã§ãã¯ããŸãã ãŸããèå¥åãšæŽæ°ããã§ãã¯ããããšããå§ãããŸããããããããšã§ãææ³ã«èå¥åãšæŽæ°ã®ã«ãŒã«ãæ¢ã«èšå®ãããŠããŸãã çµæã¯æ¬¡ã®ããã«ãªããŸãã
ãOKããã¿ã³ãæŒããŠãèªåçã«è¿œå ããã2ã€ã®ã¬ã¯ãµãŒã«ãŒã«ãå«ãææ³ãååŸããŸãã INTã«ãŒã«ã®äŸã䜿çšããŠãã¬ã¯ãµãŒã®ã«ãŒã«ãã©ã®ããã«èšè¿°ãããããèŠãŠã¿ãŸãããã ã«ãŒã«ã¯ååïŒãã®å Žåã¯INTïŒã§å§ãŸããŸãã ã¬ã¯ãµãŒèŠåã®ååã¯å€§æåã§å§ããå¿ èŠããããŸãã ååã®åŸã«èšå·ãïŒããããããã®åŸã«ããããalternativesãç¶ããŸãã 代æ¿ã¯sivol "|"ã§åºåãããŸã èšå·ã;ãã§çµããå¿ èŠããããŸãã
ããã§ãINTã«ãŒã«ã®å¯äžã®ä»£æ¿æ¡ãèŠãŠã¿ãŸãããã ANTLRã®ãšã³ã㪠'0' .. '9' +ã¯ãINTãå°ãªããšã1æ¡ã®æ°åã®ã·ãŒã±ã³ã¹ã§ããããšãæå³ããŸãã èšå·ã+ãã®ä»£ããã«ãããšãã°ãsivolã*ããããå Žåãããã¯æ°åã®ã·ãŒã±ã³ã¹ã空ã§ããããšãæå³ããŸãã IDã«ãŒã«ã¯ããè€éã§ãIDã¯å°æåãšå€§æåã®ã©ãã³æåãæ°åãäžç·ã§æ§æãããæåãŸãã¯äžç·ã§å§ãŸãæåã®ã·ãŒã±ã³ã¹ã§ããããšãæå³ããŸãã
ããŠãããŒãµãŒã®æåã®ã«ãŒã«ãŸãã¯ç§åŠçå ¬ç ãã€ãŸããããŒãµãŒãããŒã¯ã³ã®ã¹ããªãŒã ã®ãã§ãã¯ãéå§ããã«ãŒã«ãç¬èªã«èšè¿°ããŸãã ãªã©ïŒ
calc ïŒã¹ããŒãã¡ã³ã+ ;
ã芧ã®ãšãããååãå°æåã§å§ãŸãå¿ èŠãããããšãé€ããŠãããŒãµãŒã®èŠåã®æ§é ã¯ã¬ã¯ãµãŒã®èŠåãšç°ãªããŸããã ãã®å Žåãå ¥åããŒã¯ã³ã¹ããªãŒã ã空ã§ã¯ãªãäžé£ã®ã¹ããŒãã¡ã³ãã§ããããšãããŒãµãŒã«äŒããŸãã ããŒãµãŒã¯åéçŒã§ã¯ãªããããã¹ããŒãã¡ã³ããäœã§ããããç¥ãå¿ èŠããããŸãã 圌ã«èšãïŒ
声æ ïŒexpr NEWLINE | ID '=' expr NEWLINE | æ¹è¡ ;
ãã®ã«ãŒã«ã§ã¯ãéžæè¢ãäœã§ããããå¿ãã人ã¯ããããã©ããªåç©ã§ããããèŠããããšãã§ã
æ¹è¡ïŒ '\ r'ïŒ '\ n' ;
èšå·ãïŒã ã¯ãæåã\ rããæã«1åååšãããããŸã£ããååšããªãããšãæå³ããŸãã
次ã«ã2ã€ã®éžæè¢ã1ã€ã«çµåããã«ãŒã«ãèããŸãã
expr ïŒmultExpressionïŒ '+' multExpression | '-' multExpressionïŒ* ;
ANTLRèšèªã§ã¯ãããã¯ãexprãä»»æã®ç¬Šå·ãæã€çšèªã®ä»»æã®ã·ãŒã±ã³ã¹ã§ããããšãæå³ããŸãã ããšãã°ãmultExpression-multExpression + multExpression-multExpression-multExpression + multExpressionã§ãã
æ®ãã®ã«ãŒã«ã¯èæ ®ããŸãããïŒæ®ãã®ã«ãŒã«ã¯2ã€ãããããŸããïŒããã®ãŸãŸãã®ãŸãŸäœ¿çšããŸãã
multExpression ïŒa1 = atomïŒ '*' a2 = atom | '/' a2 = atomïŒ* ; åå ïŒID | INT | 'ïŒ' expr 'ïŒ' ;
èªãã§ãããšãã«ææ³ãã¡ã€ã«ã«ã«ãŒã«ãæžããšãããããåã«ãŒã«ã«å¯ŸããŠANTLRWorksãã°ã©ããæãããšã«ãã§ã«æ°ã¥ããŠããã§ãããã æ°ã¥ããïŒ ãããïŒ ããã§ãåã«ãŒã«ã«ã€ããŠã³ã¡ã³ãããå¿ èŠã¯ãããŸããã
ãããææ³ã®çµããã§ãã æ¬åœã«ç°¡åã§ããïŒ
3.ããŒãµãŒãšã¬ã¯ãµãŒã®çæãšèµ·å
ããŠãææ³ãéçºããŸããã CïŒã§ããŒãµãŒãšã¬ã¯ãµãŒãçæãããšãã§ãã ANTLRWorksã¯ããJavaæåã§ãããããèŠèŠç°å¢ã䜿çšãããããïŒå人çã«ã¯ïŒæåã§ã³ãŒããçæããæ¹ãç°¡åã§ãã ããããããã«ã€ããŠã¯åŸã§ã æåã«ãææ³ãã¡ã€ã«ã«æ°è¡ãè¿œå ããŸãã ææ³åã®æåã®è¡ã®çŽåŸã«ã次ãè¿œå ããå¿ èŠããããŸãã
ãªãã·ã§ã³ { èšèª= CSharp2; } @parser ::åå空é{çæ} @lexer ::åå空é{çæ}
ãããã®è¡ã¯ãCïŒã³ãŒããååŸããããšãšãParserããã³lexerã¯ã©ã¹ãGeneratedåå空éã«å«ããããšãANTLRã«äŒããŸãã ãã¹ãŠãã³ãŒããçæã§ããŸãã ãããè¡ãã«ã¯ã次ã®å 容ãè¿œå ãã.batãã¡ã€ã«ãäœæããŸãã
java -jar antlr-3.2.jar -o Generated Calc.g äžæåæ¢
ç§ã®å Žåã.batãã¡ã€ã«ã¯antlr-3.2.jarããã³Calc.gãã¡ã€ã«ãšåããã£ã¬ã¯ããªã«ããããšã«æ³šæããŠãã ãã ã
ã-oãã¹ã€ããã¯ãçæããããã¡ã€ã«ã眮ããããã©ã«ããŒãžã®ãã¹ãæå®ããŸãã äžæåæ¢ã¯å©äŸ¿æ§ã®ããã ãã«è¡ãããããããšã©ãŒãçºçããå Žåã«ããã確èªã§ããŸãã
.batãã¡ã€ã«ãèµ·åããçæããããã©ã«ããŒã調ã¹ãŸãã ããã«ã¯3ã€ã®ãã¡ã€ã«ããããŸãã
- CalcLexer.cs-ã¬ã¯ãµãŒã³ãŒã
- CalcParser.cs-ããŒãµãŒã³ãŒã
- Calc.tokens-ããŒã¯ã³ã®ãªã¹ããå«ããŠãŒãã£ãªãã£ãã¡ã€ã«
ããŒãµãŒãéå§ããã«ã¯ãVisual Studioã§ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãäœæããåä¿¡ãã2ã€ã®.csãã¡ã€ã«ãè¿œå ããŸããã 䟿å®äžãåå空éã¯GeneratedãšåŒã°ããusing'iãèšè¿°ããŸããã CïŒã©ã³ã¿ã€ã ãã£ã¹ããªãã¥ãŒã·ã§ã³ãžã®åç §ããããžã§ã¯ãã«è¿œå ããããšãå¿ããªãããšãéèŠã§ãïŒANTLRãããžã§ã¯ããµã€ãããããŠã³ããŒãããDOT-NET-runtime-3.1.1.zipã¢ãŒã«ã€ãå ã®Antlr3.Runtime.dllãã¡ã€ã«ïŒã 次ã®ã³ãŒããMainïŒïŒé¢æ°ã«è¿œå ããŸãã
è©ŠããŠã¿ã { //æåã®å ¥åã¹ããªãŒã ãã³ã³ãœãŒã«å ¥åã«èšå®ããŸã ANTLRReaderStream input = new ANTLRReaderStreamïŒConsole.InïŒ; //ãã®ã¹ã¬ããã§ã¬ã¯ãµãŒãèšå®ããŸã CalcLexer lexer =æ°ããCalcLexerïŒå ¥åïŒ; //ã¬ã¯ãµãŒããŒã¹ã®ããŒã¯ã³ã¹ããªãŒã ãäœæããŸã CommonTokenStreamããŒã¯ã³=æ°ããCommonTokenStreamïŒã¬ã¯ãµãŒïŒ; //ããŒãµãŒãäœæããŸã CalcParser parser = new CalcParserïŒããŒã¯ã³ïŒ; //ãããŠæåã®ææ³ã«ãŒã«ãå®è¡ããŸã!!! parser.calcïŒïŒ; } catchïŒäŸå€eïŒ { Console.WriteLineïŒe.MessageïŒ; } Console.ReadKeyïŒïŒ;
ã§ãã!!! ã³ã³ãã€ã«ããŠå®è¡ããŸãã
ãã¡ã€ã«ã®çµããïŒEOFïŒæåãæ€åºããããšãå ¥åãçµäºããããšã«æ³šæããŠãã ãã ã ãã®æåãWindowsã«é 眮ããã«ã¯ãCTRL + ZãæŒããŸãã
ãã¹ãŠãã»ãšãã©çŽ æŽãããã ããããç»é¢ã«çµæã衚瀺ãããªãããšã«æ°ã¥ããã§ãããã æ··ä¹±ïŒ è¿·æãªæ¬ é¥ãä¿®æ£ããã«ã¯ãææ³ãããäžåºŠæãèµ·ããå¿ èŠããããŸãã ãŸã ANTLRWorksãéããŠããŸãããïŒ
4.é»åæ©èœãææ³ã«è¿œå ãã
楜ããéšåãæ¥ãŸããã å§ããããã«ã次ã®ã¹ããããããã¡ã€ã«ã®å é ã«è¿œå ããŠãANTLRãããå°ãæ§æããŸãã
ææ³ïŒ
@header { ã·ã¹ãã ã䜿çšããŠ; System.Collectionsã䜿çšããŸãã } @members { ããã·ã¥ããŒãã«ã¡ã¢ãª=æ°ããããã·ã¥ããŒãã«ïŒïŒ; }
説æããŸãã @membersã¯ãïŒå€æ°å€ãä¿åããããã«ïŒããŒãµãŒã¯ã©ã¹ã«ãã©ã€ããŒãã¡ã¢ãªã¡ã³ããè¿œå ããå¿ èŠãããããšãANTLRã«äŒããŸãããããã£ãŠã ããããŒã¯ãHashtableã䜿çšããããã«æ¥ç¶ããå¿ èŠãããããŒã ã¹ããŒã¹ã瀺ããŸãã ããã§ãCïŒã³ãŒããææ³ã«è¿œå ã§ããŸãã ã¹ããŒãã¡ã³ãã«ãŒã«ããå§ããŸãããã
声æ ïŒexpr NEWLINE {Console.WriteLineïŒ$ expr.valueïŒ; } | ID '=' expr NEWLINE {memory.AddïŒ$ ID.textã$ expr.valueïŒ; } | æ¹è¡ ;
ã³ãŒãã¯äžæ¬åŒ§{}ã§èšè¿°ãããŠããŸãã ã¹ããŒãã¡ã³ããæåã®éžæè¢ã§ããå Žåãç®è¡åŒã®å€ãç»é¢ã«åºåãã2çªç®ã®å Žå-å€æ°åãšãã®å€ãã¡ã¢ãªã«ä¿åããŠãåŸã§ååŸã§ããããã«ããŸãã ããã§ã¯ãã¹ãŠãéåžžã«ç°¡åã§ãããçåãçããŸããåŒ$ expr.valueã®å€ã¯ã©ãããæ¥ãã®ã§ããããïŒ ãããŠãããã¯ããããåãããŸãïŒ
exprã¯[int value]ãè¿ããŸãïŒme1 = multExpression {$ value = me1;}ïŒ '+' me2 = multExpression {$ value + = $ me2.value;} | '-' me2 = multExpression {$ value-= $ me2å€;}ïŒ*;
ããã§ãè€éãªããšã¯ãããŸããã exprã«ãŒã«ãintåã®å€ãšåŒã°ããå€ãè¿ãããšãANTLRã«äŒããŸãã äž¡æ¹ã®ãšã³ããªã«ã$ expr.valueããšãreturns [int value]ãã®å€ãå¶ç¶è¡šç€ºãããªãããšã«æ³šæããŠãã ãã ã ç§ãã¡ãæžãå ŽåïŒ
exprã¯[int tratata]ãè¿ããŸã ... ;
ãããŠã$ expr.valueã«å€æŽãããšãANTLRã¯ãšã©ãŒãã¹ããŒããŸãã
ãã«ãŒã«ã¯æå³ãè¿ãããšèšã£ãŠãããçšåºŠã®çºèšãèš±å¯ããŸããããæå³ã倱ãããšãªãå¥ã®èšãæ¹ãããããšã¯ãç§ã®æèŠã§ã¯ååã«é£ããã§ãã
å¥ã®åŸ®åŠã ã¹ããŒãã¡ã³ãã«ãŒã«ãããšãã°æåã®éžæè¢ãæ€èšããŠãã ããã ãã®ä»£æ¿ã«å¯Ÿå¿ããã³ãŒãã§ã¯ãexprã«ãŒã«ãçŽæ¥åç §ããŸãïŒ$ expr.valueïŒã ãã ããã¹ããŒãã¡ã³ãã«ãŒã«ã§ã¯ã2ã€ã®multExpressionã«ãŒã«ãåæã«å«ãŸãããããããã¯æ©èœããŸãããã€ãŸããããããåºå¥ããããã«ãååãä»ããå¿ èŠããããŸãã ãã®å Žåããããã¯me1ãšme2ã§ãã ãã¹ãŠã®åŸ®åŠãã®ããã§ã
è°è«ãããä»ã§ã¯ãã€ã³ãã«ããè¿ãã
exprã«ãŒã«ã§ã¯ã2ã€ã®éžæè¢ãæåã|ããä»ããŠ1ã€ã«æžã蟌ãŸããŸãã ããã¯ããã®ãããã¯ã®ããŒã2ã§æ確ã«èŠãããŸãã exprã¯multExpression-multExpression + multExpression-multExpression-multExpression + multExpressionãšãã圢åŒã®æã§ããããšãæãåºãããŠãã ããã ããã§äžæ¬åŒ§å ã®ã³ãŒããèŠãŠãæåã®çšèªã®å€ãæ»ãå€ã®å€ã«å²ãåœãŠããã次ã«æäœã«å¿ããŠåŸç¶ã®çšèªã®å€ãå ç®ãŸãã¯æžç®ãããããšã確èªããŸãã ã«ãŒã«ã¯äŒŒãŠããŸã
multExpressionïŒ
multExpressionã¯[int value]ãè¿ããŸã ïŒa1 = atom {$ value = $ a1.value;} ïŒ '*' a2 = atom {$ value * = $ a2.value;} | '/' a2 = atom {$ value / = $ a2.value;}ïŒ* ;
ã¢ãã ããŒãµãŒã®æåŸã®ã«ãŒã«ã¯æ®ããŸãã åé¡ã¯ãªãã¯ãã§ãïŒ
ã¢ãã ã¯[int value]ãè¿ããŸã ïŒID {$ value =ïŒintïŒmemory [$ ID.text];} | INT {$ value = int.ParseïŒ$ INT.textïŒ;} | 'ïŒ' expr 'ïŒ' {$ value = $ expr.value;} ;
atomãèå¥åïŒIDïŒã§ããå Žåãã¡ã¢ãªããååŸããå€ãè¿ããŸãã atomãæŽæ°ã®å ŽåãåçŽã«æååè¡šçŸããååŸããæ°å€ãè¿ããŸãã æåŸã«ãatomãæ¬åŒ§ã§å²ãŸããåŒã§ããå ŽåãåŒã®å€ãè¿ãã ãã§ãã
.batãã¡ã€ã«ã䜿çšããŠããŒãµãŒãšã¬ã¯ãµãŒãçæããŸãã MainïŒïŒé¢æ°ã®ã³ãŒãã§ããå€æŽããå¿ èŠã¯ãããŸããã é»åãèµ·åããŠãã¬ã€ããŸãã
èå³æ·±ãããšã«ãçæãããããŒãµãŒã¯æ§æãšã©ãŒãå ±åããããã«ãããããå埩ã§ããŸãã ããã確èªããã«ã¯ãããšãã°ã¹ããŒã¹ãå«ãåŒãå ¥åããŠã¿ãŠãã ããïŒã¹ããŒã¹ãã¿ããªã©ã®åŠçã¯è¡ããŸããã§ããïŒã
ããŒãµãŒã¯ãšã©ãŒãæ€åºããŸããããããã§ãçµæãæ£ããèšç®ããŸããã ã2 ++ 3ãã®ããã«èšè¿°ããŠ5ãååŸããããšãã§ããŸãã
5.çµè«
èŠçŽããæãæ¥ãŸããã ç§ãã¡ãåŸã解決çã¯ãç§ã«ã¯æããŸãããã¿ã¹ã¯ãšå®å šã«äžèŽããŠããŸãã åŒããã°ã©ã ã¯èªã¿åããŸããïŒ ã¯ã çµæã¯èšç®ãããŸããïŒ ã¯ã ããã¯ããããããçµäºããããšãã§ããŸãã çããããã®ãããã¯ã奜ãã§ãANTLRææ³ã䜿çšããŠæ§æ解æããªãŒãæ§ç¯ããåãANTLRã䜿çšããŠããããåé¿ããæ¹æ³ãåŠã³ãããšå¿ããé¡ã£ãŠããŸãã ç¬èªã®ããã°ã©ãã³ã°èšèªãäœæãããšãã倢ãããå ŽåãANTLRã䜿çšãããšå®è£ ã«ã¯ããã«è¿ã¥ããŸããïŒ
6.æšå¥šèªæž
- 確å®ANTLRãªãã¡ã¬ã³ã¹ãTerence Parrã2007幎ã
ISBN-10ïŒ0-9787392-5-6ãISBN-13ïŒ978-09787392-4-9 - èšèªå®è£
ãã¿ãŒã³ããã¬ã³ã¹ããŒã2010幎ã
ISBN-10ïŒ1-934356-45-XãISBN-13ïŒ978-1-934356-45-6