7:43 AM
Doug先生のこのPR面白い
7:43 AM
var opPrecedence = OperatorPrecedence.standardOperators // Use the Swift standard library operators let parsed = try Parser.parse(source: "x + y * z") dump(parsed) // contains SequenceExprSyntax(x, +, y, *, z) let folded = try opPrecedence.foldAll(parsed) dump(folded) // contains InfixOperatorExpr(x, +, InfixOperatorExpr(y, *, z))
7:43 AM
SwiftSyntaxのASTを、演算子優先度を解釈したASTに変換する
7:44 AM
let parsedOperators = try Parser.parse(source: moreOperators) // Adds **, ExponentiationPrecedence to the set of known operators and precedence groups. try opPrecedence.addSourceFile(parsedOperators) let parsed2 = try Parser.parse(source: "b ** c ** d") dump(parsed2) // contains SequenceExprSyntax(b, **, c, **, d) let folded2 = try opPrecedence.foldAll(parsed2) dump(folded2) // contains InfixOperatorExpr(b, **, InfixOperatorExpr(c, **, d))
7:44 AM
さらに、演算子定義を含むソースコードのASTを突っ込んでやると、 それを解読して演算子優先度定義を更新して、その定義でAST変換する
7:46 AM
セマンティックな操作だけど、アウトプットとしてAST木の書き換えとして作業が完了するタスクだから、SwiftSyntaxのおまけライブラリとして完結できてる。