ãã®ã·ãªãŒãºã®ååã®èšäºã¯ã ANTLRãšRoslynã䜿çšãããœãŒã¹è§£æã®çè«ã«å°å¿µããŸããã PT Application Inspectorãããžã§ã¯ãã§ã®ã³ãŒãã®çœ²ååæã®ããã»ã¹ã¯ã次ã®æ®µéã«åãããŠããããšã«æ³šæããŠãã ããã
- èšèªäŸåè¡šçŸïŒæœè±¡æ§æããªãŒãASTïŒãžã®è§£æã
- ASTãèšèªã«äŸåããªãçµ±äžããã圢åŒïŒUnified ASTãUASTïŒã«å€æããŸãã
- DSLã§èª¬æãããŠãããã³ãã¬ãŒããžã®çŽæ¥ãããã³ã°ã
ãã®èšäºã¯ç¬¬2段éãã€ãŸãã蚪åè
ãšãªã¹ããŒã®æŠç¥ã䜿çšããŠASTãåŠçããASTãçµ±äžãã©ãŒãããã«å€æããASTãç°¡çŽ åããããªãŒæ§é ãããã³ã°ã¢ã«ãŽãªãºã ã«å°å¿µããŸãã

å
容
ASTãã€ãã¹
ãåç¥ã®ããã«ãããŒãµãŒã¯ãœãŒã¹ã³ãŒãããASTãšåŒã°ãã解æããªãŒïŒãã¹ãŠã®éèŠã§ãªãããŒã¯ã³ãåé€ãããããªãŒïŒã«å€æããŸãã ãã®ãããªããªãŒãåŠçããã«ã¯ããŸããŸãªæ¹æ³ããããŸãã æãåçŽãªã®ã¯ãåå«ã®ååž°çãªçžŠæã䜿çšããŠããªãŒãåŠçããããšã§ãã ãã ãããã®æ¹æ³ã¯ãããŒãã®ã¿ã€ããå°ãªããåŠçããžãã¯ãåçŽãªéåžžã«åçŽãªå Žåã«ã®ã¿é©çšã§ããŸãã ãã®ä»ã®å Žåãåã¿ã€ãã®ããŒãã®åŠçããžãã¯ãå¥ã
ã®ã¡ãœããã«è»¢éããå¿
èŠããããŸãã ããã¯ã蚪åè
ãšãªã¹ããŒãšãã2ã€ã®å
žåçãªã¢ãããŒãïŒèšèšãã¿ãŒã³ïŒã䜿çšããŠå®çŸãããŸãã
蚪åè
ãšãªã¹ããŒ
蚪åè
ã§ã¯ãããŒãã®åå«ãåŠçããã«ã¯ãã¡ãœãããæåã§åŒã³åºããŠãããããã€ãã¹ããå¿
èŠããããŸãã ããã«ã芪ã«3ã€ã®åå«ãããã2ã€ã®ããŒãã®ã¿ãã¡ãœãããåŒã³åºãå ŽåããµãããªãŒã®äžéšã¯ãŸã£ããåŠçãããŸããã ãªã¹ããŒïŒWalkerïŒã§ã¯ããã¹ãŠã®åå«ã蚪åããã¡ãœãããèªåçã«åŒã³åºãããŸãã ãªã¹ããŒã«ã¯ãããŒã蚪åã®éå§æã«åŒã³åºãããã¡ãœããïŒenterNodeïŒãšãããŒã蚪ååŸã«åŒã³åºãããã¡ãœããïŒexitNodeïŒããããŸãã ãããã®ã¡ãœããã¯ãã€ãã³ãã¡ã«ããºã ã䜿çšããŠå®è£
ããããšãã§ããŸãã ãªã¹ããŒãšã¯ç°ãªããããžã¿ãŒã¡ãœããã¯ãªããžã§ã¯ããè¿ãããšãã§ããå
¥åããããšãã§ããŸãã CSharpSyntaxVisitorã宣èšãããšãåVisitã¡ãœããã¯AstNodeãªããžã§ã¯ããè¿ããŸããããã¯ããã®å Žåãçµ±åASTã®ä»ã®ãã¹ãŠã®ããŒãã®å
±éã®ç¥å
ã§ãã
ãããã£ãŠã蚪åè
ã®ãã¶ã€ã³ãã¿ãŒã³ã䜿çšããå Žåã蚪åããããŒãã«é¢ããæ
å ±ãä¿åããå¿
èŠããªããããããªãŒå€æã³ãŒãã¯ããæ©èœçãã€ç°¡æœã§ãã äžã®å³ã§ã¯ãããšãã°ãPHPèšèªãå€æãããšãã«ãäžèŠãªHTMLããã³CSSããŒããåæãããŠããããšãããããŸãã èµ°æ»é åºã¯æ°åã§ç€ºãããŸãã ãªã¹ããŒã¯éåžžãããŒã¿ãïŒããšãã°ãCSVãã¡ã€ã«ããïŒéçŽããããã³ãŒããå¥ã®ã³ãŒãã«å€æãããšãã«äœ¿çšãããŸãïŒJSON-> XMLïŒã 詳现ã«ã€ããŠã¯ã The Definitive ANTLR 4 Referenceãåç
§ããŠãã ãã ã
ANTLRãšRoslynã®èšªåè
ã®éãã
VisitorãšListenerã®å®è£
ã¯ãã©ã€ãã©ãªã«ãã£ãŠç°ãªãå ŽåããããŸãã ããšãã°ã次ã®è¡šã¯ãRoslynããã³ANTLRã®Visitorããã³Listenerã¯ã©ã¹ãšã¡ãœããã説æããŠããŸãã
| ANTLR | ããºãªã³ |
---|
蚪åè
| AbstractParseTreeVisitor <çµæ> | CSharpSyntaxVisitor <çµæ> |
ãªã¹ã㌠| IParseTreeListener | CSharpSyntaxWalker |
ããã©ã«ã | ããã©ã«ãçµæ | DefaultVisitïŒSyntaxNodeããŒãïŒ |
蚪å | 蚪åïŒIParseTreeããªãŒïŒ | 蚪åïŒSyntaxNodeããŒãïŒ |
ANTLRãšRoslynã®äž¡æ¹ã«ã¯ãããã©ã«ãã§çµæãè¿ãã¡ãœããïŒäœããã®æ§æã®Visitorã¡ãœããããªãŒããŒã©ã€ããããŠããªãå ŽåïŒãšãäžè¬çãªVisitã¡ãœããããããããèªäœãã©ã®ç¹å¥ãªVisitorã¡ãœãããåŒã³åºããã決å®ããŸãã
ANTLR蚪åè
ã¯ãæ§æææ³èŠåããšã«ç¬èªã®èšªåè
ãçæããŸãã ç¹å¥ãªã¿ã€ãã®ã¡ãœããããããŸãã
VisitChild(IRuleNode node)
; ããã©ã«ãã§ããŒãã®ãã€ãã¹ãå®è£
ããããã«äœ¿çšãããŸããVisitTerminal(IRuleNode node)
; ã¿ãŒããã«ããŒãã®ãã€ãã¹ã«äœ¿çšãããŸãã ããŒã¯ã³ãVisitErrorNode(IErrorNode node)
; åå¥ãšã©ãŒãŸãã¯æ§æãšã©ãŒã®ããã³ãŒãã®è§£æã®çµæãšããŠååŸãããããŒã¯ã³ããã€ãã¹ããããã«äœ¿çšãããŸãã ããšãã°ãæã®æåŸã«ã»ãã³ãã³ãå«ãŸããŠããå ŽåãããŒãµãŒã¯ãã®ãããªããŒã¯ã³ãæ¿å
¥ãããšã©ãŒã§ããããšã瀺ããŸãã 解æãšã©ãŒã®è©³çŽ°ã«ã€ããŠã¯ãåã®èšäºãã芧ãã ãã ãAggregateResult(AstNode aggregate, AstNode nextResult)
; åãã©ããŒãµã«ã®çµæãéçŽããããã«èšèšãããããã£ãã«äœ¿çšãããªãæ¹æ³ãShouldVisitNextChild(IRuleNode node, AstNode currentResult)
; currentNode
ããŒãããã©ããŒã¹ããçµæã«å¿ããŠã node
次ã®åå«ãåŠçãããã©ããã決å®ããããã«èšèšãããããã£ãã«äœ¿çšãããªãã¡ãœããã
Roslyn Visitorã«ã¯ãåæ§æçšã®ç¹å¥ãªã¡ãœãããšããã¹ãŠã®ããŒãçšã®äžè¬çãªVisitã¡ãœããããããŸãã ãã ããANTLRãšã¯ç°ãªãããäžéãæ§é ããã€ãã¹ããæ¹æ³ã¯ãããŸããã ããšãã°ãRoslynã«ã¯VisitStatement
ã®ã¡ãœããã¯ãªããç¹å¥ãªVisitDoStatement
ã VisitExpressionStatement
ã VisitForStatement
ãªã©ã®ã¿ããããŸãã äžè¬çãªVisit
ãVisitStatement
ãšããŠäœ¿çšã§ããŸãã ãã1ã€ã®éãã¯ãåçŽïŒSyntaxTriviaïŒããŒãã®ãã€ãã¹ã¡ãœãããã€ãŸã ã³ãŒãã«é¢ããæ
å ±ïŒã¹ããŒã¹ãã³ã¡ã³ãïŒã倱ãããšãªãåé€ã§ããããŒãã¯ãã¡ã€ã³ããŒããšããŒã¯ã³ããã€ãã¹ããã¡ãœãããšãšãã«åŒã³åºãããŸãã
ANTLRããžã¿ãŒã®æ¬ ç¹ã¯ãçæãããããžã¿ãŒã¡ãœããã®ååãææ³èŠåã®èšè¿°ã¹ã¿ã€ã«ã«çŽæ¥äŸåãããããã³ãŒãã®äžè¬çãªã¹ã¿ã€ã«ã«é©åããªãå Žåãããããšã§ãã ããšãã°ãSQLææ³ã§ã¯ãã¢ã³ããŒã¹ã³ã¢ã䜿çšããŠåèªãåºåããããããSnake caseã䜿çšããã®ãäžè¬çã§ãã Roslynã¡ãœããã¯ãCïŒã³ãŒãã®ã¹ã¿ã€ã«ã§èšè¿°ãããŠããŸãã éãã¯ãããŸãããRoslynãšANTLRã®ããªãŒæ§é ã®åŠçæ¹æ³ã¯æ°ããããŒãžã§ã³ãšãŸããŸãçµ±åãããŠãããããã¯æå ±ã§ãïŒANTLRããŒãžã§ã³3以äžã§ã¯ã蚪åè
ãšãªã¹ããŒã®ã¡ã«ããºã ã¯ãããŸããã§ããïŒã
ANTLRã®ææ³ãšããžã¿ãŒã
ANTLRã®ã«ãŒã«
ifStatement : If parenthesis statement elseIfStatement* elseStatement? | If parenthesis ':' innerStatementList elseIfColonStatement* elseColonStatement? EndIf ';' ;
VisitIfStatement(PHPParser.IfStatementContext context)
ã¡ãœããVisitIfStatement(PHPParser.IfStatementContext context)
ãçæãããŸãããã®ã³ã³ããã¹ãã«ã¯æ¬¡ã®ãã£ãŒã«ãããããŸãã
parenthesis
-åäžã®ããŒããelseIfStatement*
-ããŒãã®é
åã æ§æããªãå Žåãé
åã®é·ãã¯ãŒãã§ããelseStatement?
-ãªãã·ã§ã³ã®ããŒãã æ§æããªãå ŽåãnullãIf
ã EndIf
ã¿ãŒããã«ããŒãã倧æåã§å§ãŸããŸãã':'
ã ';'
-ã¿ãŒããã«ããŒãã¯ã³ã³ããã¹ãã«å«ãŸããŸããïŒGetChildïŒïŒãä»ããŠã®ã¿ã¢ã¯ã»ã¹å¯èœïŒã
ææ³ã®ã«ãŒã«ãå°ãªãã»ã©ãVisitorãæžãã®ãç°¡åã§éããªãããšã«æ³šæããŠãã ããã ãã ããæ§æã®ç¹°ãè¿ãã¯ãåå¥ã®ã«ãŒã«ã«ããå¿
èŠããããŸãã
ANTLRã®ä»£æ¿ã©ãã«ãšèŠçŽ ã©ãã«
å€ãã®å Žåãã«ãŒã«ã«ã¯ããã€ãã®éžæè¢ãããããããã®éžæè¢ãå¥ã®æ¹æ³ã§åŠçããæ¹ãè«ççã§ãã 幞ããªããšã«ãANTLR 4ã«ã¯ã #
èšå·ã§å§ãŸããå代æ¿ã«ãŒã«ã®åŸã«è¿œå ãããç¹å¥ãªä»£æ¿ã©ãã«ããããŸãã ããŒãµãŒã³ãŒããçæãããšãã©ãã«ããšã«åå¥ã®Visitorã¡ãœãããçæãããŸããããã«ãããã«ãŒã«ã«å€ãã®éžæè¢ãããå Žåã«å€§éã®ã³ãŒããåé¿ã§ããŸãã ãã¹ãŠã®éžæè¢ã«ã©ãã«ãä»ããããã©ãã«ãä»ããªãã§ãã ããã ãŸããå€ãã®å€ãåãå
¥ãã端æ«ãæå®ããã«ã¯ãã«ãŒã«èŠçŽ ã©ãã«ã䜿çšã§ããŸãã
expression : op=('+'|'-'|'++'|'--') expression #UnaryOperatorExpression | expression op=('*'|'/'|'%') expression #MultiplyExpression | expression op=('+'|'-') expression #AdditionExpression | expression op='&&' expression #LogicalAndExpression | expression op='?' expression op2=':' expression #TernaryOperatorExpression ;
ãã®ã«ãŒã«ã§ã¯ãANTLRã¯èšªåè
VisitExpression
ã VisitUnaryOperatorExpression
ã VisitMultiplyExpression
ãªã©ãçæããŸããå蚪åè
ã«ã¯ã1ãŸãã¯2ã€ã®èŠçŽ ã§æ§æãããåŒé
åãšopãªãã©ã«ããããŸãã ã¿ã°ã®ãããã§ã蚪åè
ã®ã³ãŒãã¯ããç°¡æœã§ç°¡æœã«ãªããŸãã
代æ¿ã©ãã«ãšèŠçŽ ã©ãã«ã䜿çšããå Žåã®ã³ãŒã public override AstNode VisitUnaryOperatorExpression(TestParser.UnaryOperatorExpressionContext context) { var op = new MyUnaryOperator(context.op().GetText()); var expr = (Expression)VisitExpression(context.expression(0)); return new MyUnaryExpression(op, expr); } public override AstNode VisitMultiplyExpression(TestParser.MultiplyExpressionContext context) { var left = (Expression)VisitExpression(context.expression(0)); var op = new MyBinaryOpeartor(context.op().GetText()); var right = (Expression)VisitExpression(context.expression(1)); return new MyBinaryExpression(left, op, right); } public override AstNode VisitTernaryOperatorExpression(TestParser.TernaryOperatorExpressionContext context) { var first = (Expression)VisitExpression(context.expression(0)); var second = (Expression)VisitExpression(context.expression(1)); var third = (Expression)VisitExpression(context.expression(2)); return new MyTernaryExpression(first, second, third); } ...
代æ¿ã©ãã«ããªããã°ãåŒã®åŠçã¯1ã€ã®ã¡ãœããã«ãªããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
代æ¿ã©ãã«ãšèŠçŽ ã©ãã«ã䜿çšããªãã³ãŒã public override AstNode VisitExpression(TestParser.ExpressionContext context) { Expression expr, expr2, expr3; if (context.ChildCount == 2) // Unary { var op = new MyUnaryOperator(context.GetChild<ITerminalNode>(0).GetText()); expr = (Expression)VisitExpression(context.expression(0)); return new MyUnaryExpression(op, expr); } else if (context.ChildCount == 3) // Binary { expr = (Expression)VisitExpression(context.expression(0)); var binaryOp = new MyBinaryOpeartor(context.GetChild<ITerminalNode>(0).GetText()); expr2 = (Expression)VisitExpression(context.expression(1)); return new MyBinaryExpression(expr, binaryOp, expr2); ... } else // Ternary { var first = (Expression)VisitExpression(context.expression(0)); var second = (Expression)VisitExpression(context.expression(1)); var third = (Expression)VisitExpression(context.expression(2)); return new MyTernaryExpression(first, second, third); } }
ANTLRã ãã§ãªããææ³ãèšè¿°ããä»ã®æ段ã«ã代æ¿ã©ãã«ãååšããããšã«æ³šæããŠãã ããã ããšãã°ã Nitraã§ã¯ã ANTLRãšã¯ç°ãªãã代æ¿èšå·ã®å·ŠåŽã«å²ãåœãŠèšå·ã®ä»ããã©ãã«ãé
眮ãããŸãã
syntax Expression { | IntegerLiteral | BooleanLiteral | NullLiteral = "null"; | Parenthesized = "(" Expression ")"; | Cast1 = "(" !Expression AnyType ")" Expression; | ThisAccess = "this"; | BaseAccessMember = "base" "." QualifiedName; | RegularStringLiteral;
çµ±åASTããŒãã¿ã€ã
çµ±åãããASTæ§é ãéçºãããšãã NRefactoryãããžã§ã¯ãããã®ASTæ§é ã«å°ãããŸããããããã¯ç§ãã¡ã«ãšã£ãŠéåžžã«ã·ã³ãã«ã§ãããä¿¡é Œã§ããããªãŒïŒå¿ å®åºŠãæåã«å¯ŸããŠæ£ç¢ºãªãœãŒã¹ã³ãŒãã«å¯éïŒãååŸããå¿
èŠã¯ãããŸããã§ããã ä»»æã®ããŒãã¯AstNodeã®åŸç¶ã§ãããç¬èªã®ã¿ã€ãNodeTypeãæã¡ãŸããããã¯ããã³ãã¬ãŒããšã®ãããã³ã°ã®æ®µéã§ãããã³JSONãããã·ãªã¢ã©ã€ãºãããšãã«ã䜿çšãããŸãã ããŒãã®æ§é ã¯æ¬¡ã®ããã«ãªããŸããã

ã¿ã€ãã«å ããŠãåããŒãã«ã¯ãã³ãŒãïŒTextSpanïŒå
ã®å Žæãæ ŒçŽããããããã£ããããŸãããã®ããããã£ã¯ããã³ãã¬ãŒããšã®äžèŽæã«ãœãŒã¹ã³ãŒãã«è¡šç€ºããããã«äœ¿çšãããŸãã éçµç«¯ããŒãã«ã¯åããŒãã®ãªã¹ããæ ŒçŽãããçµç«¯ããŒãã«ã¯æ°å€ãæååããŸãã¯ãã®ä»ã®ããªããã£ãå€ãæ ŒçŽãããŸãã
ç°ãªãèšèªã®ASTããŒããæ¯èŒããããã«ãè¡ãç¹å®ã®ããŒãã®æ§æã§ãããåã次ã®ãããªCïŒãJavaãPHPã§ã®å®è£
ã§ããããŒãã«ãã³ã³ãã€ã«ãããŸããã
ããŒã | åŒãæ° | CïŒ | Java | Php | MCA | MDA |
---|
ãªãã | ææ®ïŒåŒã stmtïŒã¹ããŒãã¡ã³ã | whileïŒcondïŒstmt | whileïŒcondïŒstmt | whileïŒcondïŒstmt | whileïŒcondãstmtïŒ | whileïŒcondãstmtïŒ |
ãã€ããªãªããã | lãrïŒè¡šçŸ; OPïŒãªãã©ã« | ç§ã¯ | ç§ã¯ | ç§ã¯ | BinaryOpïŒlãopãrïŒ | BinaryOpïŒlãopãrïŒ |
... | ... | ... | ... | ... | ... | ... |
ãã§ãã¯æžã¿ | ãã§ãã¯ããïŒåŒ | ïŒãã§ãã¯ïŒããã§ã㯠| - | - | ãã§ãã¯æžã¿ | ãã§ãã¯ïŒãã§ãã¯ïŒ |
ãã«æ¡ä»¶ä»ã | aïŒåŒãbïŒãªãã©ã« | ïŒ.B | - | - | aïŒ= nullïŒ ABïŒãã« | ïŒ.B |
ãã®è¡šã«ã¯ïŒ
- è¡šçŸ åŒã«ã¯æ»ãå€ããããŸãã
- 声æ; ã¹ããŒãã¡ã³ãïŒåœä»€ïŒã«ã¯æ»ãå€ããããŸããã
- ãªãã©ã« ã¿ãŒããã«ããŒãã
- æãäžè¬çãªAst ïŒMCAïŒã¯ãæãçµ±äžãããASTã§ãã ãã®ããŒãã¯ã3ã€ãã¹ãŠã®èšèªã«ãã®ããŒããŸãã¯é¡äŒŒã®ããŒãã®ã¿ã€ãïŒIfStatementãAssignmentExpressionãªã©ïŒãå«ãŸããŠããå Žåã«æ§ç¯ãããŸãã
- æã詳现ãªAst ïŒMDAïŒæã詳现ãªASTã ãã®ããŒãã¯ãå°ãªããšã1ã€ã®èšèªã«ãã®ã¿ã€ãã®ããŒããå«ãŸããŠããå Žåã«æ§ç¯ãããŸãïŒããšãã°ãCïŒã®FixedStatenemt
fixed (a) { }
ïŒã T-SQLãšCïŒã®éã®æåŸã®å®£èšèšèªã¯ãããšãã°PHPãšCïŒã®éãããã¯ããã«ç°ãªãããããããã®ããŒãã¯SQLã«äŒŒãèšèªã«ããé¢é£ããŠããŸãã
å³ã«ç€ºãããŒãïŒããã³æ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æããããã¿ãŒã³ããŒããïŒã«å ããŠãMost Common AstããŒããæ§ç¯ããããã®äººå·¥ããŒãããããŸãããæ§æã¯ã§ããã ãã倱ããŸããã ãããã®ããŒãã¯ä»¥äžã®ãšããã§ãã
- MultichildExpression; Expressionããç¶æ¿ãããä»ã®Expressionã®ã³ã¬ã¯ã·ã§ã³ãå«ãŸããŸãã
- WrapperExpression; Expressionãç¶æ¿ããä»»æã®ã¿ã€ãã®AstNodeãæã€ããŒããå«ãŸããŸãã
- WrapperStatement; Statementãç¶æ¿ããä»»æã®ã¿ã€ãã®AstNodeãæã€ããŒããå«ã¿ãŸãã
åœä»€åããã°ã©ãã³ã°èšèªã§ã¯ãåºæ¬çãªæ§æèŠçŽ ã¯åŒåŒãšã¹ããŒãã¡ã³ãã¹ããŒãã¡ã³ãã§ãã åè
ã«ã¯æ»ãå€ããããåŸè
ã¯æäœãå®è¡ããããã«äœ¿çšãããŸãã ãããã£ãŠããã®ã¢ãžã¥ãŒã«ã§ã¯ãäž»ã«ãããã«ãéäžããŸããã ãããã¯ãå°æ¥æ±æåæãå®è£
ããããã«å¿
èŠãªCFGããã³ãœãŒã¹ã³ãŒãã®ä»ã®è¡šçŸãå®è£
ããããã®åºæ¬çãªæ§æèŠçŽ ã§ãã ã³ãŒãå
ã®è匱æ§ãæ€çŽ¢ããããã«ãæ§æç³ããžã§ããªãã¯ãããã³ãã®ä»ã®èšèªåºæã®ãã®ã«é¢ããç¥èã¯äžèŠã§ããããšãè¿œå ãã䟡å€ããããŸãã ãããã£ãŠãæ§æç³ãæšæºæ§é ã«æ¡åŒµããç¹å®ã®ãã®ã«é¢ããæ
å ±ãå®å
šã«åé€ã§ããŸãã
ãã¿ãŒã³ããŒãã¯ãã«ã¹ã¿ã ãã¿ãŒã³ãè¡šã人工çãªããŒãã§ãã ããšãã°ãæ°å€ã®ç¯å²ãæ£èŠè¡šçŸã¯ãªãã©ã«ãã¿ãŒã³ãšããŠäœ¿çšãããŸãã
ã³ã³ããŒã¿ãŒã®ãã¹ã
ã³ãŒãã¢ãã©ã€ã¶ãŒã®åªå
é äœã¯ãåã
ã®éšåã§ã¯ãªãã³ãŒãå
šäœããã¹ãããããšã§ãã ãã®åé¡ã解決ããããã«ããã¹ãŠã®ã¿ã€ãã®ããŒãã®ããžã¿ãŒã¡ãœãããåå®çŸ©ããããšã«ããŸããã ãã®å Žåãããžã¿ãŒã䜿çšãããŠããªãå Žåã new ShouldNotBeVisitedException(context)
äŸå€ãã¹ããŒããŸãã IntelliSenseã¯ãªãŒããŒã©ã€ããããŠããã¡ãœãããšãªãŒããŒã©ã€ããããŠããªãã¡ãœãããèæ
®ã«å
¥ããããããã®ã¢ãããŒãã¯éçºãç°¡çŽ åããŸãããããã£ãŠã蚪åè
ãæ¢ã«å®è£
ããŠããã¡ãœãããç°¡åã«å€å¥ã§ããŸãã
ãŸãããã¹ãŠã®ã³ãŒãã®ã«ãã¬ããžãã¹ããæ¹åããæ¹æ³ã«ã€ããŠãèããŠããŸãã çµ±åASTã®åããŒãã«ã¯ã察å¿ãããœãŒã¹ã³ãŒãã®åº§æšãæ ŒçŽãããŸãã ããã«ããã¹ãŠã®ç«¯æ«ã¯ããŒã¯ã³ã§æ¥ç¶ãããŠããŸãã æåã®ç¹å®ã®é
åã å¯èœã§ããã°ãã¹ãŠã®ããŒã¯ã³ãåŠçããå¿
èŠããããããåèšã«ãã¬ããžä¿æ°ã¯æ¬¡ã®åŒã§è¡šãããšãã§ããŸããããã§ã uterms
ã¯çµ±äžãããASTã®ç«¯æ«ã§ããã terms
ã¯éåžžã®RoslynãŸãã¯ANTLR ASTã®ç«¯æ«ã§ãã

ãã®ã¡ããªãã¯ã¯ã1ã€ã®ä¿æ°ã§ã³ãŒãã«ãã¬ããžãè¡šããŸãã ãã¡ããããã®ä¿æ°ã®æšå®å€ã¯æŠç®ã§ããã蚪åè
ã®ã³ãŒãã®ãªãã¡ã¯ã¿ãªã³ã°ãšæ¹åã«äœ¿çšã§ããŸãã ããä¿¡é Œæ§ã®é«ãåæã®ããã«ãã«ããŒããã端æ«ã®ã°ã©ãã£ã«ã«ãªè¡šçŸã䜿çšããããšãã§ããŸãã
ç°¡çŽ åAST
éåžžã®ASTãUASTã«å€æããåŸãåŸè
ãåçŽåããå¿
èŠããããŸãã æãåçŽã§äŸ¿å©ãªæé©åã¯ãå®æ°ã®æãããã¿ïŒå®æ°ã®æãããã¿ïŒã§ãã ããšãã°ãCookieã®æå¹æéãé·ãããèšå®ã«é¢é£ããã³ãŒãã®æ¬ é¥ããããŸãïŒ cookie.setMaxAge(2147483647);
æ¬åŒ§å
ã®åŒæ°ã¯ã 86400
ãªã©ã®åäžã®æ°å€ããŸãã¯60 * 60 * 24
ãªã©ã®äœããã®æŒç®åŒãšããŠèšè¿°ã§ããŸãã å¥ã®äŸã¯ãSQLã€ã³ãžã§ã¯ã·ã§ã³ããã³ãã®ä»ã®è匱æ§ãæ¢ãéã®æååã®é£çµã§ãã
ãã®ã¿ã¹ã¯ãå®è£
ããããã«ãã«ã¹ã¿ã ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããVisitorèªäœã¯UASTå°çšã§ãã ASTãåçŽåãããšããªãŒããŒãã®æ°ãåçŽã«æžå°ãããããVisitorã¯å
¥åãããåãã¿ã€ããåãå
¥ããŠè¿ããŸããã .NETã§ã®ãªãã¬ã¯ã·ã§ã³ã®ãµããŒãã®ãããã§ãå°éã®ã³ãŒãã§ãã®ãããªèšªåè
ãå®è£
ããããšãããããŸããã åããŒãã«ã¯ä»ã®ããŒããŸãã¯ã¿ãŒããã«ããªããã£ãå€ãå«ãŸããŠããããããªãã¬ã¯ã·ã§ã³ã䜿çšãããšãç¹å®ã®ããŒãã®ãã¹ãŠã®ã¡ã³ããŒãæœåºããŠåŠçããä»ã®èšªåè
ãååž°çã«åŒã³åºãããšãã§ããŸãã
ASTããã³ãã¿ãŒã³ãããã³ã°ã¢ã«ãŽãªãºã
ãã³ãã¬ãŒãæ€çŽ¢ã¢ã«ãŽãªãºã ã¯ããã¹ãŠã®ASTããŒããåæããåããŒããããªãŒæ§é ã®åœ¢åŒã§æ瀺ããããã³ãã¬ãŒããšç
§åããããšã§æ§æãããŸãã 2ã€ã®ããŒããåãã¿ã€ãã§ãããã¿ã€ãã«å¿ããŠãããã€ãã®æ¡ä»¶ãæºããããŠããå Žåã2ã€ã®ããŒãã¯åçã§ãã
- åå«ã®ååž°çãªæ¯èŒã
- åçŽãªãªãã©ã«åïŒèå¥åãæååãæ°åïŒã®æ¯èŒã
- æ¡åŒµãªãã©ã«åïŒæ£èŠè¡šçŸãç¯å²ïŒã®æ¯èŒã ã³ã¡ã³ãã¯ãã®ã°ã«ãŒãã«ãããŸãã
- è€éãªæ¡åŒµåïŒåŒãã¹ããŒãã¡ã³ãã·ãŒã±ã³ã¹ïŒã®æ¯èŒã
ãã®ã¢ã«ãŽãªãºã ã¯ãããããå®è£
ããæ¯èŒçå°éã®ã³ãŒãã§é«ãããã©ãŒãã³ã¹ãå®çŸã§ããåçŽãªååã«åºã¥ããŠããŸãã åŸè
ã¯ãããŒããæ¯èŒããããã®CompareToã¡ãœãããåºæ¬ã¯ã©ã¹ã端æ«ãããã³å°æ°ã®ä»ã®ããŒãã«å¯ŸããŠå®è£
ãããŠãããšããäºå®ã«ããå®çŸãããŸãã ç¶æ
ãã·ã³ã«åºã¥ããŠããã©ãŒãã³ã¹ãæ¹åããããã®ããé«åºŠãªãããã³ã°ã¢ã«ãŽãªãºã ã¯ãŸã å®è£
ãããŠããŸããã ãã ãããã®ã¢ã«ãŽãªãºã ã¯ãããšãã°èšèªã®ã»ãã³ãã£ã¯ã¹ãèæ
®ãããªã©ãããé«åºŠãªåæã«äœ¿çšããã«ã¯åé¡ããããŸãïŒãŸãã¯äžå¯èœã§ãããããŸãïŒã ç°ãªãASTããŒãéã®æ¥ç¶ã
ãããã«
ãã®èšäºã§ã¯ãããªãŒãåŠçããããã®èšªåè
ãšãªã¹ããŒã®ãã¿ãŒã³ãæ€èšããçµ±äžãããASTã®æ§é ã«ã€ããŠã話ããŸããã 次ã®èšäºã§æããŠãããŸãïŒ
- ãã³ãã¬ãŒãã¹ãã¬ãŒãžã¢ãããŒãïŒããŒãã³ãŒããJsonãDSLïŒã
- ãã¿ãŒã³ãèšè¿°ããããã®DSLã®éçºãšäœ¿çšã
- å®éã®ãã³ãã¬ãŒããšãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ã®æ€çŽ¢ã®äŸ;
- CFGãDFGããã³æ±æåæã