how to call instance method from within Treetop gem

T

Tom Cloyd

I'm trying to call an instance method from within a gem (Treetop), and
nothing I've tried is working (3 hours into it - no results). I'll do my
best to simplify the problem.

I have a class instance which sets things up with this...

Treetop.load '../data/sn_grammar' # <= this loads a data file which
will be process as Ruby, after some preprocessing

@parser = Base_grammarParser.new # < = Treetop class instance

My class method with the code above then calls another method in the
same class - both in my module SN, class SetNet.

The other method then calls a method of the @parser instance, and THAT
one gives to eval some of the text in the sn_grammar file referenced in
the first code line above. That text then calls another method -
showhelp - back in my class instance. But it cannot find it. I'm not
naming it correctly, somehow. I get this error:

(eval):71:in `act': undefined method `showhelp' for SyntaxNode+HelpMain0
offset=0, ".h":Treetop::Runtime::SyntaxNode (NoMethodError)
from ../lib/setnet/SN.rb:265:in `proc_command'
from ../lib/setnet/SN.rb:182:in `user_interface'
from ../lib/setnet/SN.rb:113:in `manage'
from ../lib/setnet/SN.rb:38:in `startup'
from ./setnet:26

I've tried every permutation I can image, to tell eval how to find my
method. No go.

Module SN => class SetNet => instance setnet => method showhelp. <=
That's what I'm trying to get to.

How can I tell eval, executing off in the gem directory, where this
method is found? That's my problem, I think. I'm run out of
possibilities, so I'm failing to grasp something basic most likely.

Any help would be appreciated.

Tom

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
J

Justin Collins

Tom said:
I'm trying to call an instance method from within a gem (Treetop), and
nothing I've tried is working (3 hours into it - no results). I'll do
my best to simplify the problem.

I have a class instance which sets things up with this...

Treetop.load '../data/sn_grammar' # <= this loads a data file which
will be process as Ruby, after some preprocessing

@parser = Base_grammarParser.new # < = Treetop class instance

My class method with the code above then calls another method in the
same class - both in my module SN, class SetNet.

The other method then calls a method of the @parser instance, and THAT
one gives to eval some of the text in the sn_grammar file referenced
in the first code line above. That text then calls another method -
showhelp - back in my class instance. But it cannot find it. I'm not
naming it correctly, somehow. I get this error:

(eval):71:in `act': undefined method `showhelp' for
SyntaxNode+HelpMain0 offset=0, ".h":Treetop::Runtime::SyntaxNode
(NoMethodError)
from ../lib/setnet/SN.rb:265:in `proc_command'
from ../lib/setnet/SN.rb:182:in `user_interface'
from ../lib/setnet/SN.rb:113:in `manage'
from ../lib/setnet/SN.rb:38:in `startup'
from ./setnet:26

I've tried every permutation I can image, to tell eval how to find my
method. No go.

Module SN => class SetNet => instance setnet => method showhelp. <=
That's what I'm trying to get to.

How can I tell eval, executing off in the gem directory, where this
method is found? That's my problem, I think. I'm run out of
possibilities, so I'm failing to grasp something basic most likely.

Any help would be appreciated.

Tom

Hi Tom,

You seem to be trying to call the showhelp method from within your
grammar. Is this correct? If so, note that the code within the grammar
is attached to SyntaxNodes as the grammar matches your text. So your
showhelp method is expected to be defined for SyntaxNodes.

Here is what I think your setup is:

module SN
class SetNet
def other_method
@parser = Base_grammarParser.new
@parser.parse(text).eval
end

def showhelp
end
end
end

grammar Base_grammar
rule help
.* {
def eval
showhelp
end
}
end
end


If this is the case, you can just make eval take an argument:


module SN
class SetNet
def other_method
@parser = Base_grammarParser.new
@parser.parse(text).eval(self)
end

def showhelp
end
end
end

grammar Base_grammar
rule help
.* {
def eval(sn)
sn.showhelp
end
}
end
end

Hope that helps some.

-Justin
 
T

Tom Cloyd

Justin said:
Hi Tom,

You seem to be trying to call the showhelp method from within your
grammar. Is this correct? If so, note that the code within the grammar
is attached to SyntaxNodes as the grammar matches your text. So your
showhelp method is expected to be defined for SyntaxNodes.
That's the problem I didn't know how to address!
Here is what I think your setup is:

module SN
class SetNet
def other_method
@parser = Base_grammarParser.new
@parser.parse(text).eval
end

def showhelp
end
end
end

grammar Base_grammar
rule help
.* {
def eval
showhelp
end
}
end
end


If this is the case, you can just make eval take an argument:


module SN
class SetNet
def other_method
@parser = Base_grammarParser.new
@parser.parse(text).eval(self)
end

def showhelp
end
end
end

grammar Base_grammar
rule help
.* {
def eval(sn)
sn.showhelp
end
}
end
end

Hope that helps some.

-Justin
Justin,

I am in your debt. I didn't have much faith that I could explain my
problem well enough, and simply enough, that I'd get a response. Your
solution made sense to me (I'd wanted to do what your code does, but
didn't know how). With a minor adjustment, it worked, which was a bit
stunning. Here's the final version (a prototype only, but that'll get me
launched):

#this - in my main class method
Treetop.load '../data/sn_grammar'
@parser = Base_grammarParser.new

#this in my secondary method
if parse_tree = @parser.parse( @opt )
parse_tree.act(self)
else...

#this in my grammar rule
# display main help
rule help_main
'.h' {
def act( sn )
#puts 'help_main'
sn.showhelp( [ '0', '0c', '0a', '0q', '0v', '0f', '0m', '0u' ] )
end
}
end

#and this in my main, as suggested by Markus on the Treetop list -
class Treetop::Runtime::SyntaxNode
#include SN
def act
elements.each { |e|
e.act(self) if e.respond_to? :act }
end
end

Now I can write my grammar and get this thing working for me.

I much apppreciate your superior knowledge, and your generosity in
sharing it.

t.

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,763
Messages
2,569,562
Members
45,038
Latest member
OrderProperKetocapsules

Latest Threads

Top