Kwartz::Translator (Class)

In: kwartz.rb
Parent: Object

abstract class for RubyTranslator, PHPTranslator, …

usage.

 scanner = Kwartz::Scanner.new(input_str)
 parser   = Kwartz::Parser.new(scanner)
 nodelist = parser.parse()
 translator = Kwartz::Translator.instance("ruby", scanner.newline)
 output_str = translator.translate(nodelist)
 print output_str

If you are defining a subclass of Translator, you should do the following task:

  • override a method translate_expr(node, code=’’, level=0), which translate ExprNode to program code
  • override a method translate_stmt(node, code=’’, level=0), which translate StmtNode to program code
  • set @codedect appropriately, which is a hash to convert :if, :then, :end, … to "if (", ") {\n", "}\n", … , for example. notice that @codedect is not an instance variable, but a class-instance variable.
  • register the subclass to Translater by Translator::register().

See the definition of RubyTranslator for detail.

Public Class methods

base of codedict hashtable

return a codedict hashtable

get a instance of appropriate Translator subclass.

usage.

 translator = Translator.instance("ruby")

if you define a subclass of Translator, you should call this method with self and a language name.

return true if class-object which is associated with lang_str is registered

Public Instance methods

Some language such as JSP+JSTL or Velocity doesn’t have conditional operator (’? :’). condop_to_ifstmt() convert a statement node which have conditioanl operator to if-statement node which is equal to the origianl node.

ex.

 :set(var = cond ? val1 : val2)
  ==> :if(cond) :set(var = val1) :else :set(var = val2) :end

Some language such as JSP+JSTL or Velocity doesn’t support ‘v += 1’, ‘v -= 1’, ‘v *= 1’, … normalize_assignment() convert a assign-statement node to normal assignment, such as ‘v = v+1’, ‘v = v-1’, ‘v = v*1’, …

ex.

 :set(v += x)  ==> :set(v = v+x)
 :set(v -= x)  ==> :set(v = v-x)
 :set(v *= x)  ==> :set(v = v*x)
 :set(v /= x)  ==> :set(v = v/x)
 :set(v %= x)  ==> :set(v = v%x)
 :set(v .+= x)  ==> :set(v = v.+x)

[Validate]