Как встроить код Ruby в Treetop для полностью настраиваемой генерации AST?
Я пытаюсь написать парсер, используя Treetop, для игрушечного языка, который просто выглядит так:
prog test is
a = b;
if c then
d=f;
end;
end
Моя грамматика кажется нормальной, но когда я пытаюсь встроить код Ruby в грамматику, я получаю странные сообщения, которые не могу понять.
22:in `ruby_source_from_string': Expected one of #, .., &, !, ~, ', ", [, ., rule, end, ( at line 21, column 5 (byte 312) after grammar Gram (RuntimeError)
Кажется, что проблема заключается в неправильном использовании альтернативы для "заявления", но я не уверен.
Моя Treetop грамматика выглядит так:
grammar Gram
rule program
'program' s id:identifier s 'is' s b:block 'end' {
def ast
Program.new(id.ast,b.ast)
end
}
end
rule block
s? st:(statement)* s? {
def ast
Block.new( *st.elements.collect{|e| e.ast} )
end
}
end
rule statement
aa:assign
{
def ast
a.ast
end
}
/ bb:ifStmt
{
def ast
b.ast
end
}
end
rule assign
i1:identifier s? '=' s? i2:identifier s? ';' s? {
def ast
Assign.new(i1.ast,i2.ast)
end
}
end
rule ifStmt
s? 'if' s i:identifier s 'then' s b:block s? 'end' s? ';' {
def ast
IfStmt.new(i.ast,b.ast)
end
}
end
rule identifier
[a-zA-Z]+ {
def ast
Identifier.new(text_value)
end
}
end
rule s
[\s]+
end
end
Может ли эксперт взглянуть на это?
1 ответ
Насколько я могу судить, кажется, что разбирается нормально. В опубликованном вами коде было несколько опечаток. aa:assign
должно быть a:assign
, bb:ifStmt
должно быть b:ifStmt
, а также 'program'
должно быть 'prog'
на вершине.
Есть ли шанс, что вы сможете показать остальную часть своего кода, особенно классы?