/// Main script /// /////////////////// echo 'Building temporary preproprocessed grammar file.', "\n"; $grammarCode = file_get_contents($grammarFile); $grammarCode = resolveNodes($grammarCode); $grammarCode = resolveMacros($grammarCode); $grammarCode = resolveArrays($grammarCode); $grammarCode = resolveStackAccess($grammarCode); file_put_contents($tmpGrammarFile, $grammarCode); $additionalArgs = $optionDebug ? '-t -v' : ''; echo "Building parser.\n"; $output = trim(shell_exec("{$kmyacc} {$additionalArgs} -l -m {$skeletonFile} {$tmpGrammarFile} 2>&1")); echo "Output: \"{$output}\"\n"; $resultCode = file_get_contents($tmpResultFile); $resultCode = removeTrailingWhitespace($resultCode); ensureDirExists(dirname($parserResultFile)); file_put_contents($parserResultFile, $resultCode); unlink($tmpResultFile); if (!$optionKeepTmpGrammar) { unlink($tmpGrammarFile); } /////////////////////////////// /// Preprocessing functions /// /////////////////////////////// function resolveNodes($code) { return preg_replace_callback('~(?<name>[A-Z][a-zA-Z_\\\\]++)\\s*' . PARAMS . '~', function ($matches) { // recurse $matches['params'] = resolveNodes($matches['params']); $params = magicSplit('(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,', $matches['params']); $paramCode = '';
$grammarCode = resolveNodes($grammarCode); $grammarCode = resolveMacros($grammarCode); $grammarCode = resolveStackAccess($grammarCode); file_put_contents($tmpGrammarFile, $grammarCode); $additionalArgs = $optionDebug ? '-t -v' : ''; echo "Building $name parser.\n"; $output = trim(shell_exec("$kmyacc $additionalArgs -l -m $skeletonFile -p $name $tmpGrammarFile 2>&1")); echo "Output: \"$output\"\n"; $resultCode = file_get_contents($tmpResultFile); $resultCode = removeTrailingWhitespace($resultCode); ensureDirExists($resultDir); file_put_contents("$resultDir/$name.php", $resultCode); unlink($tmpResultFile); echo "Building token definition.\n"; $output = trim(shell_exec("$kmyacc -l -m $tokensTemplate $tmpGrammarFile 2>&1")); assert($output === ''); rename($tmpResultFile, $tokensResultsFile); if (!$optionKeepTmpGrammar) { unlink($tmpGrammarFile); } } /////////////////////////////// /// Preprocessing functions ///