Hi Everyone,
I am not sure if this is the correct list to post this problem to
but I will try here first. I am having a problem with understanding
TGE and I was hoping someone might be able to give me some help. I am
writing a parrot version of 1964 BASIC using the compiler tools and I
have the PGE part nearly complete (there are a few things that I need
to finish though) and I was looking forward to using TGE but I have
become stuck.
My problem is that when I get through the first two parts of the
tree, I come to a point where things come to a screeching halt because
the node (in Basic64::Grammar::statement) does not seem to be anything
at all or anything that I can identify. I know from the parse output
that Basic64::Grammar::statement is a ResizablePMCArray (size:1) but I
am not sure how to reflect that in PIR or if that is even significant
here. Underneath that are the linenumber and statement_type rules but
I cannot seem to access them at all.
I apologize in advance if this is something simple but any help
would be greatly appreciated.
Sincerely,
Chris Yocum
grammar Basic64::ASTGrammar is TGE::Grammar;
transform past (ROOT) :language('PIR') {
.local pmc past
past = new 'PAST::Node'
past.'init'('node'=>node, 'name'=>'anon')
.local pmc cnode, cpast
cnode = node["program"]
cpast = tree.'get'('past', cnode, 'Basic64::Grammar::statements')
past.'push'(cpast)
.return (past)
}
transform past (Basic64::Grammar::statements) :language('PIR') {
.local pmc result, cnode, cpast
result = new 'PAST::Node'
result.'init'('node' => node)
cnode = node["statement"]
cpast = tree.'get'('past', cnode, 'Basic64::Grammar::statement')
result.'push'(cpast)
.return (result)
}
transform past (Basic64::Grammar::statement) :language('PIR') {
.local pmc result, cnode
result = new 'PAST::Node'
result.'init'('node'=>node)
}
Here is the output when run:
Null PMC access in isa()
current instr.: 'parrot;PAST::Node;node' pc 194 (PAST/Node.pir:175)
called from Sub 'parrot;PAST::Node;init' pc 96 (PAST/Node.pir:91)
called from Sub 'parrot;Basic64::ASTGrammar;_Basic64::Grammar::statement_past' \
pc 14733 (Basic64ASTGrammar.tg:29)
called from Sub 'parrot;TGE::Tree;_eval_cell' pc 282 (TGE/Tree.pir:175)
called from Sub 'parrot;TGE::Tree;get' pc 241 (TGE/Tree.pir:155)
called from Sub 'parrot;Basic64::ASTGrammar;_Basic64::Grammar::statements_past'\
pc 14702 (Basic64ASTGrammar.tg:21)
called from Sub 'parrot;TGE::Tree;_eval_cell' pc 282 (TGE/Tree.pir:175)
called from Sub 'parrot;TGE::Tree;get' pc 241 (TGE/Tree.pir:155)
called from Sub 'parrot;Basic64::ASTGrammar;_Basic64::Grammar::statements_past'\
pc 14702 (Basic64ASTGrammar.tg:21)
called from Sub 'parrot;TGE::Tree;_eval_cell' pc 282 (TGE/Tree.pir:175)
called from Sub 'parrot;TGE::Tree;get' pc 241 (TGE/Tree.pir:155)
called from Sub 'parrot;Basic64::ASTGrammar;_ROOT_past' pc 14655 (Basic64ASTGra\
mmar.tg:10)
called from Sub 'parrot;TGE::Tree;_eval_cell' pc 282 (TGE/Tree.pir:175)
called from Sub 'parrot;TGE::Tree;get' pc 241 (TGE/Tree.pir:155)
called from Sub 'parrot;HLLCompiler;compile' pc 343 (runtime/parrot/library/Par\
rot/HLLCompiler.pir:248)
called from Sub 'parrot;HLLCompiler;eval' pc 500 (runtime/parrot/library/Parrot\
/HLLCompiler.pir:338)
called from Sub 'parrot;HLLCompiler;evalfiles' pc 800 (runtime/parrot/library/P\
arrot/HLLCompiler.pir:472)
called from Sub 'parrot;HLLCompiler;command_line' pc 947 (runtime/parrot/librar\
y/Parrot/HLLCompiler.pir:535)
called from Sub 'parrot;Basic64;main' pc 67 (Basic64Main.pir:24)
Here is the parse output for reference:
"parse" => PMC 'Basic64::Grammar' => "10 let foo = 5;" @ 0 {
<program> => PMC 'Basic64::Grammar' => "10 let foo = 5;" @ 0 {
<statements> => PMC 'Basic64::Grammar' => "10 let foo = 5;" @ 0 {
<statement> => ResizablePMCArray (size:1) [
PMC 'Basic64::Grammar' => "10 let foo = 5" @ 0 {
<linenumber> => PMC 'Basic64::Grammar' => "10" @ 0 {
<digit> => ResizablePMCArray (size:2) [
PMC 'Basic64::Grammar' => "1" @ 0,
PMC 'Basic64::Grammar' => "0" @ 1
]
}
<statement_type> => PMC 'Basic64::Grammar' => "let foo = 5"\
@ 3 {
<let_statement> => PMC 'Basic64::Grammar' => "let foo =\
5" @ 3 {
<expr> => PMC 'Basic64::Grammar' => "foo = 5" @ 7 {
<expr> => PMC 'PGE::Match' => "=" @ 11 {
<type> => "infix:="
[0] => PMC 'Basic64::Grammar' => "foo" @ 7 \
{
<indent> => PMC 'Basic64::Grammar' => "\
foo" @ 7
<type> => "term:"
}
[1] => PMC 'Basic64::Grammar' => "5" @ 13 {
<integer> => PMC 'Basic64::Grammar' => \
"5" @ 13
<type> => "term:"
}
}
}
}
}
}
]
}
}
}