babel-bridge
Version:
a 'runtime' parsing expression grammar parser
54 lines (42 loc) • 1.54 kB
text/coffeescript
RuleVariant = require './RuleVariant'
Stats = require './Stats'
{merge, upperCamelCase, objectName, log} = require 'art-standard-lib'
module.exports = class Rule extends require("art-class-system").BaseClass
constructor: ( , , = [])->
"nodeClassName name variantNodeClasses",
numVariants: -> .length
addVariant: (options) ->
.push v = new RuleVariant merge options,
variantNumber: .length + 1
rule: @
parserClass:
v
inspectObjects: ->
[{inspect: => "<Rule: #{@_name}>"}, ]
clone: ->
new Rule , , .slice()
###
IN:
parentNode: node instance
This provides critical info:
parentNode.source: the source string
parentNode.nextOffset: the index in the source where parsing starts
parentNode.parser: access to the parser object
EFFECT: If returning a new Node, it is expected that node's parent is already set to parentNode
OUT: Node instance if parsing was successful
###
parse: (parentNode) ->
Stats.add "parseRule"
{parser, nextOffset} = parentNode
if cached = parser._cached , nextOffset
return if cached == "no_match"
Stats.add "cacheHitNoMatch"
null
else
Stats.add "cacheHit"
cached
for v in
if match = v.parse parentNode
return parser._cacheMatch , match
parser._cacheNoMatch , nextOffset