diff --git a/src/emitter.js b/src/emitter.js index 4837c8c..e7c497b 100644 --- a/src/emitter.js +++ b/src/emitter.js @@ -868,44 +868,27 @@ PEG.compiler.emitter = function(ast) { }, literal: function(node, context) { - var length = node.value.length; - - if (length === 0) { - return formatCode( - '#{resultVar} = "";', - { resultVar: resultVar(context.resultIndex) } - ); - } - - var testCode = length === 1 - ? formatCode( - 'input.charCodeAt(pos) === #{valueCharCode}', - { valueCharCode: node.value.charCodeAt(0) } - ) - : formatCode( - 'input.substr(pos, #{length}) === #{string(value)}', - { - value: node.value, - length: length - } - ); - return formatCode( - 'if (#{testCode}) {', - ' #{resultVar} = #{string(value)};', - ' pos += #{length};', - '} else {', - ' #{resultVar} = null;', - ' if (reportFailures === 0) {', - ' matchFailed(#{string(valueQuoted)});', + '#if node.value.length === 0', + ' #{resultVar} = "";', + '#else', + ' #if node.value.length === 1', + ' if (input.charCodeAt(pos) === #{node.value.charCodeAt(0)}) {', + ' #else', + ' if (input.substr(pos, #{node.value.length}) === #{string(node.value)}) {', + ' #end', + ' #{resultVar} = #{string(node.value)};', + ' pos += #{node.value.length};', + ' } else {', + ' #{resultVar} = null;', + ' if (reportFailures === 0) {', + ' matchFailed(#{string(string(node.value))});', + ' }', ' }', - '}', + '#end', { - testCode: testCode, - value: node.value, - valueQuoted: quote(node.value), - length: length, - resultVar: resultVar(context.resultIndex) + node: node, + resultVar: resultVar(context.resultIndex) } ); },