<br><br><div class="gmail_quote">2009/9/26 Michael Van Canneyt <span dir="ltr"><<a href="mailto:michael@freepascal.org">michael@freepascal.org</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im"><br>
<br>
On Fri, 25 Sep 2009, Jorge Aldo G. de F. Junior wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi !<br>
<br>
Im working on the PasJS translator but im having some problems :<br>
<br>
How to map ObjectPascal object orientation philosophy into JavaScript object orientation philoshopy ?<br>
</blockquote>
<br></div>
Do you think there is a choice ? In JS, everything is an object. As far as I can see, there is not really much of a choice ? You should add the methods, fields and properties to the object's prototype ?<div class="im">
<br>
<br></div></blockquote><div><br>Yep, but this would mean that :<br><br>1 - Records are objects<br>2 - How to map arrays ?<br>3 - How to deal with class inheritance ? (JS is a freak one at this)<br><br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Im trying a direct Syntax Tree -> Output approach, while outputting (if a debug flag is enabled) comments containning original line of code, original line<br>
number and original column number as to allow easier debugging.<br>
<br>
I gave up trying to do semantic analisys at the translator because its too hard (its like almost creating a new FPC compiler from scratch, so i believe letting<br>
the browser debug for us - and having the line numbers to check for mistakes - its the best approach).<br>
<br>
But i need volunteers !<br>
</blockquote>
<br></div>
A Pascal -> JS translator is on my todo list, but for that I need to extend the<br>
pparser unit in fcl-passrc to read complete units, not just the interface.<br></blockquote><div><br>I dont know your pparser, but i have a working parser here, thats not the current problem.<br><br>Im working at the Syntax Tree of Object pascal (Im currently lazy, cant concentrate to write this)<br>
<br>but the model is quite simple :<br><br>Theres a root class called TTreeElement<br><br>Each pascal construction is an descendant of TTreeElement<br><br>For one :<br><br>TIdentifierSyntax = Class(TTreeElement)<br>Public<br>
  Constructor Create(aSource : TTokenIterator; aOwner : TTreeElement);<br>End<br><br>The constructor simply reads tokens from TTokenIterator, creating new objects (Childs in the tree) as its needed. Nothing fancy.<br><br>
Something like<br><br>Constructor TIfSyntax.Create(aSource : TTokenIterator; aOwner : TTreeElement);<br>Begin<br>   Inherited Create(aSource, aOwner);<br>   aSource.Consume('if'); // <- consumes the "if" token<br>
    AddChild(TExpressionSyntax.Create(aSource, Self)); // <- makes a child that will consume the expression that must follow the if<br>    aSource.Consume('then');<br>    AddChild(TStamentSyntax.Create(aSource, Self)); <- consume the stament/codeblock that follows the "then"<br>
    If aSource.Consume('else') Then <- consume results true if its able to consume "else"<br>       AddChild(TElseStamentSyntax.Create(aSource, Self)); <- If theres an else, theres a stament...<br>
End;<br><br>And so on... <br><br>Each TTreeElement has its corresponding token (even the ones that doenst corresponds to a token in the source)<br><br>so its easy to add a Function GenerateJS : String; to each one that translates it on the fly into javascript commands... (Well, i will need a symbol tree to make more complex things like translating Classes into JS Classes)<br>
<br>My parser is able to do some pre-processing, like {$ifdef} {$else} {$endif} {$define} {$undefine} etc.<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

</blockquote></div>