function parseNamedArgValue($ast) { assert_ast_type($ast, [NodeType::LITERAL, NodeType::IDENTIFIER, NodeType::NAMED_ARGS, NodeType::TYPEOF, NodeType::DT, NodeType::GLA, NodeType::GF, NodeType::GT, NodeType::GIST, NodeType::GI, NodeType::NUL, NodeType::FUNCTOR, NodeType::ATTRIBUTE]); $source = ast_node_source($ast); switch (ast_node_type($ast)) { case NodeType::LITERAL: return parseLiteralTemplate($ast); break; case NodeType::IDENTIFIER: return new Identifier(parseIdentifier($ast)); break; case NodeType::DT: case NodeType::TYPEOF: return parseType($ast); break; case NodeType::ATTRIBUTE: return parseAttribute($ast); break; case NodeType::NAMED_ARGS: return parseNamedArgList($ast); break; case NodeType::FUNCTOR: return parseFunctor($ast); break; case NodeType::GLA: return parseGLA($ast); break; case NodeType::GF: return parseGF($ast); break; case NodeType::GT: return parseGT($ast); break; case NodeType::GIST: return parseGIST($ast); break; case NodeType::GI: return parseGI($ast); break; case NodeType::NUL: return null; break; } }
function parseGIWP($ast, $name, $header) { // Push LibraryManager so we can get the waypoint-specific headers ob_start(); LibraryManager::Push(); $res = new GenerationInfo(); /*************** PROCESS AST ***************/ $payload = ast_get($ast, NodeKey::PAYLOAD); $spec = parseGI(ast_get($payload, NodeKey::TYPE)); $outputs = parseAttributeList(ast_get($payload, NodeKey::ARGS)); $constArgs = parseLiteralList(ast_get($payload, NodeKey::CARGS)); $nTuples = ast_get($payload, NodeKey::TUPLES); $queries = ast_get($ast, NodeKey::QUERIES); foreach ($queries as $query) { $res->addJob($query, $name); } // The spec is (possibly) an incomplete GI type, to finish it we need to tell it to // perform a lookup with its outputs known. $type = $spec->apply(extractTypes($outputs)); correlateAttributes($outputs, $type->output()); $attMap = parseAttributeMap(ast_get($ast, NodeKey::ATT_MAP), $res); $res->absorbAttrList($outputs); $res->absorbInfoList($constArgs); $res->absorbInfo($type); /*************** END PROCESS AST ***************/ // Get our headers $myHeaders = $header . PHP_EOL . ob_get_clean(); // Only one file right now $filename = $name . '.cc'; $res->addFile($filename, $name); _startFile($filename); GIGenerate($name, $type, $outputs, $constArgs, $nTuples); _endFile($filename, $myHeaders); LibraryManager::Pop(); return $res; }