It sounds like you're making good progress. I agree with how you want to use the Antlr4 callbacks to construct a FalconAST.
- Gordon Sent from my iPad > On Jul 24, 2014, at 11:06 PM, "Christofer Dutz" <christofer.d...@c-ware.de> > wrote: > > Hi Gordon, > > I won't object that Shaoting Cai certainly knew what he was doing, but Antlr4 > is in some respects greatly different from 2 and 3. I bet if Antlr4 had been > available at the time Falcon was initiate, he would have used that. Not only > does it seem to allow much simpler grammars, it also generates an interface > for each grammar in which "enterXYZ" and "exitXYZ" callbacks are defined for > every rule in the grammar. I can hereby create an implementation of that > interface and construct the FalconAST in here directly. Usually you parse the > input and get an AntlrAST and use a treewalker in conjunction with that > Interface implementation, but you can also hook that up as parse-listener and > it's used by the initial parsing. This way I think I could remove several > tree traversals. > > I also got closer on the JBurg part. I was actually wrong with the runtime > and generator part. It's actually all just a Generator. I therefore have > create a jburg-maven-plugin that I can hook up into the build. The cool thing > about that ist hat every plugin has it's own classloader and therefore JBurg > can use whatever it likes without interfering with the rest. I am having one > really strange classloading error though that I still need to investigage and > as soon as that's finished I promissed tom to donate the plugin to JBurg. I > also had a small discussion with tom and he will be willing to update JBurg > to update JBurg to Antlr4 and Stringtemplate (The external stringtemplate, > not the Antlr internal version). After that I agreed to make JBurg build with > Maven ... so I guess we are having some progress on this :-) > > Chris > > -----Ursprüngliche Nachricht----- > Von: Gordon Smith [mailto:gsmit...@hotmail.com] > Gesendet: Freitag, 25. Juli 2014 04:10 > An: dev@flex.apache.org > Betreff: RE: AW: AW: AW: AW: AW: Falcon and Antlr4 > >> I am sort of confused what JBurg is actually working on ... Does it directly >> work on FalconAST or is there some sort of "ReducedFalconAST"? > > The input to the BURM (Bottom-Up Rewrite Machine) that is produced by JBurg > (Java Bottom-Up Rewrite Generator) is the FalconAST. For example, a BURM > pattern like > > Pattern addExpr > Op_AddID(expression l, expression r); > > in CMCPatterns.jbg, representing a '+' expression, applies to each subtree > headed by a BinaryOperatorPlusNode, because the getNodeId() method of this > node class returns Op_AddId. > >> ABC code (I guess this is the native Flash bytecode?) > > Right. ABC stands for ActionScript Byte Code, which is the byte code esecuted > by the ActionScript Virtual Machine (AVM) in the Flash Player and AIR. > >> CSS... I would like to simplify this to: >> CSS --[CSSLexer]--> TokenStream --[CSSParser]--> [FalconAST] >> --[JBurg]--> SWF > > I won't object, however the CSS implementation was done for Falcon by a > former Adobe engineer (Shaoting Cai) who was well versed in Antlr, since he > had been a student of the professor who developed Antlr. (The AS lexer and > parser are much older, inherited from Flash Builder, and written by engineers > who were probably not as expert in Antlr, and were using older version of > Antlr that didn't have tree parsers.) So I tend to think that the "Antlr way" > may be to let Antlr create an AntlrAST automatically, and then transform it > into a more custom FalconAST with a tree parser. On the other hand, if this > is slower than having the parser produce the FalconAST directly from the > token stream, which seems likely, then I vote for going for speed. > >> AS... Here I would like to remove the RawASTTokenizer and replace that >> with an Antlr4 Lexer AS --[ASLexer]--> TokenStream --[ASParser]--> >> FalconAST --[JBurg]--> SWF > > This is what I had in mind, although again I'm not sure this would be > considered Antlr best practice. (As before, if Shaoting had done the AS > implementation, he probably would have produced an AntlrAST and then > transformed it into a FalconAST with a tree parser.) > >> Do we even need a dependency to JBurg itself to execute the code generated >> by JBurg? > > Yes. As you discovered, there is a runtime part, which determines which > sequence of reductions has the lowest 'cost' and therefore gets used for code > generation. > >> I will contact the JBurg project and check if it was possible to switch to >> the new Stringtemplate project (and if it was possible to split up JBurg >> into two modules "generator", and "runtime"). > > If Tom doesn't want to decouple JBurg from Antlr, one option would be for us > to fork JBurg and remove its dependency on the Antlr Stringtemplate. Is > another option for JBurg to continue using whatever old Antlr it has been > using and the AS and CSS lexer/parser to use the latest Antlr? > > - Gordon > > >> From: christofer.d...@c-ware.de >> To: dev@flex.apache.org >> Subject: AW: AW: AW: AW: AW: Falcon and Antlr4 >> Date: Thu, 24 Jul 2014 09:08:38 +0000 >> >> Ok ... so I created a JBurg Maven Plugin (Will contact the JBurg >> project lead for donating that) >> >> But (unfortunateley there's a but): >> - JBurg seems to consist of a Generator and a Runtime, but both are >> located in the same Jar (Even if this wouldn't really be a blocker) >> - JBurgs runtime part doesn't directly rely on Antlr AST classes, but >> unfortunateley Antlr Stringtemplate which is only bundled in Antlr3 >> distributions because it seems to have been created a project spinoff >> containing only the stringtemplate part >> (http://www.stringtemplate.org/) >> >> I will contact the JBurg project and check if it was possible to switch to >> the new Stringtemplate project (and if it was possible to split up JBurg >> into two modules "generator", and "runtime"). >> >> Chris >> >> >> ________________________________________ >> Von: Christofer Dutz <christofer.d...@c-ware.de> >> Gesendet: Donnerstag, 24. Juli 2014 09:57 >> An: dev@flex.apache.org >> Betreff: AW: AW: AW: AW: AW: Falcon and Antlr4 >> >> So let's just define some words that might help avoid confusion. >> >> A typical Antlr parser geneates a parse-tree consisting of Antlr objects ... >> let's call that AntlrAST. >> Falcon has it's own internal representation using its own objects ... let's >> call that FalconAST. >> Then I am sort of confused that JBurg is actually working on ... Does it >> directly work on FalconAST or is there some sort of "ReducedFalconAST"? >> >> Because I started with the CSS Parser, I saw that we use Antlr3 to generate >> a parser for CSS files. That outputs an AntlrAST which is fed into a second >> Antlr generated parser "CSSTree" which converts this AntlrAST into a >> FalconAST. After that I think (i'm not 100% sure) the FalconAST is passed in >> to the CSSReducer which sort of directly generates ABC code (I guess this is >> the native Flash bytecode?). >> >> ////////// >> // Css >> ////////// >> >> CSS --[CSSLexer]--> TokenStream --[CSSParser]--> AntlrAST >> --[CSSTreeParser]--> FalconAST --[CSSReducer]--> [ReducedFalconAST] >> --[JBurg]--> SWF (Everything from the FalconAST still seems a little >> mystical to me though) >> >> I would like to simplyfy this to: >> >> CSS --[CSSLexer]--> TokenStream --[CSSParser]--> [FalconAST] >> --[JBurg]--> SWF >> >> ////////// >> // ActionScript >> ////////// >> >> For AS the procedure is different (As far as I got it together with your >> mail). We are using Antlr2 here: >> >> AS --[RawASTTokenizer]--> TokenStream --[ASParser]--> FalconAST >> --[JBurg]--> SWF >> >> Here I would like to remove the RawASTTokenizer and replace that with >> an Antlr4 Lexer >> >> AS --[ASLexer]--> TokenStream --[ASParser]--> FalconAST --[JBurg]--> >> SWF >> >> ////////// >> // JBurg >> ////////// >> >> In the meanwhile I think I had some progress. As far as I understand now >> JBurg is built by Antlr and uses Antlr to parse and generate output. The >> output however no longer has a reference to Antlr. Do we even need a >> dependency to JBurg itself to execute the code generated by JBurg? If not I >> would whip up a jburg-maven-plugin which wraps JBurgs execution. Then I >> think we shouldn't have any problems with Antlr versions. >> >> Currently a I want to do is do an Antlr4 POC for the CSS compilation. As >> soon as that's done, I would like to compare the performance to that of the >> existing one and only if that is at least as fast as the current solution I >> would proceed to the next part (If its not slower than the current solution >> I would prefer the simpler process). >> >> Chris >> >> >> ________________________________________ >> Von: Gordon Smith <gsmit...@hotmail.com> >> Gesendet: Mittwoch, 23. Juli 2014 18:05 >> An: dev@flex.apache.org >> Betreff: RE: AW: AW: AW: AW: Falcon and Antlr4 >> >> CSSTree.g isn't involved in compiling AS files. It's involved only in >> compiling CSS files. >> >> For AS compilation: We use JFlex to create RawASTokenizer.java from >> RawASTokenizer.lex. This is a lexer which takes an AS file as input and >> creates a sequence of ASToken objects as output. We use Antlr 3 to create >> ASParser.java from ASParser.g. This is a parser which takes a sequence of >> ASToken objects as output and creates an AST consisting of NodeBase objects. >> This is a custom AST, not the kind of generic Antlr AST that Antlr can >> create automatically. >> >> If Antlr 4 can tokenize as fast as JFlex can, then I think it would be great >> to have a unified Antlr 4 lexer/parser. However, I strongly recommend >> keeping Falcon's custom AST classes. >> >> I'm not an expert on JBurg and wasn't aware that it had a dependency on >> Antlr. Can you please show me where this depencency is? The "JBurg guys" are >> basically one person, Tom Harwood, who used to work at Adobe but no longer >> does. I don't know whether he is still supporting JBurg or not. >> >> As for eliminating JBurg... This is certainly doable, but would have serious >> implications. The main reason that Falcon does code generation using JBurg >> is in order to perform various code optimizations such as constant >> propagation. These code optimizations would be much harder to do without >> JBurg. Ideally, these optimizations would be done in the ActionScript >> Virtual Machine rather than in the compiler (and this was the plan for AS4, >> which Adobe killed) but since they are NOT done in the current AVM, if the >> compiler doesn't do them then the code will execute slower. However, if >> cross-compilation to JavaScript is the main goal for the future, then >> perhaps slower AVM execution is tolerable. >> >> - Gordon >> >> >>> From: christofer.d...@c-ware.de >>> To: dev@flex.apache.org >>> Subject: AW: AW: AW: AW: Falcon and Antlr4 >>> Date: Wed, 23 Jul 2014 12:54:15 +0000 >>> >>> Hi Eric, >>> >>> The question is definitely not silly. >>> >>> I'm not planning on changing anything here. The package tangling >>> seems to be related with JBurg needing access to some objects that >>> are not part of the interface but part of the internal model. I >>> would untangle this by extending the Interface to provide anything >>> JBurg needs so there shouldn't be any change in the Falcon AST. But >>> after all that's just an optimization. Currently I'm digging in the >>> inner workings of JBurg ... gee I sort of forgot why I looked in the >>> inner workings of Falcon in the first place ;-) >>> >>> I would however like to remove as many processing phases and model >>> conversions as possible as each one costs time and memory and makes things >>> more compilcated to understand. >>> >>> Chris >>> >>> ________________________________________ >>> Von: Erik de Bruin <e...@ixsoftware.nl> >>> Gesendet: Mittwoch, 23. Juli 2014 14:47 >>> An: dev@flex.apache.org >>> Betreff: Re: AW: AW: AW: Falcon and Antlr4 >>> >>> I'm not at all familiar with the inner workings of Falcon, but I >>> know that FalconJX relies heavily on the current Falcon AST. Will >>> the new AST be compatible with the old (that may be a silly >>> question, but it's the only one I know to ask)? >>> >>> EdB >>> >>> >>> >>> On Wed, Jul 23, 2014 at 2:36 PM, Christofer Dutz >>> <christofer.d...@c-ware.de> >>> wrote: >>> >>>> Ok ... so I used some idle time setting up a clean falcon-antlr4 >>>> module starting with the CSS parsing. >>>> >>>> As far as I can see it, Falcon is currently using Antlr3 to >>>> generate the lexer and a parser that generates an Antlr AST from >>>> that Then we generate a second parser CSSTree.g to convert that >>>> AST into the falcon-internal object structure, which is then >>>> passed to JBurg to generate the output. >>>> >>>> As you mentioned the ability to manipulate the AST. Are you >>>> talking about the first (antlr) AST or the one the Falcon AST? >>>> I would like to elminiate the second parsing step and generate the >>>> internal model directly from the first parser using Antlr4s >>>> Listeners. Are there any objections against this? I doubt that >>>> anyone is manipulating the Antlr AST directly, much more would I >>>> expect operations to be performed on the Falcon AST. >>>> >>>> I managed to get the CSS Lexer and Parser finished. The grammar is >>>> way more readable now and the general structure is much more >>>> straight forward :-) Now I would like to Build the internal Falcon >>>> object model for that. >>>> Guess I would have to contact the JBurg guys for continuing from >>>> then as I definitely need Antlr4 support but I would bet that >>>> either JBurg is dead or they are working or at least thinking >>>> about that. >>>> >>>> I did detect some ugly cyclic dependencies in the falcon classes >>>> though ... for example we have interfaces for defining the >>>> internal models interface and have implementations of these >>>> interfaces in the internal packages, but unfortunately the >>>> interfaces reference classes in the internal model ... I think >>>> that's bad design and would like to clean that up. >>>> >>>> Any objections? (Keep in mind ... it's all in a dedicated branch, >>>> but I don't want to make it hard to merge back as soon as I'm >>>> finished) >>>> >>>> There is no DOM or SAX involved in Falcon ... I was using a >>>> metaphor to explain what I was thinking about by using an example >>>> from the XML processing world. Here you can load an XML document >>>> to memory (DOM), transform that into a second memory >>>> representation and so on in contrast to SAX processing where >>>> parser generates a stream of events which can be processed >>>> allowing you to process petabyte big documents with as much ram as >>>> a calculator ;-) >>>> >>>> >>>> Chris >>>> >>>> >>>> ________________________________________ >>>> Von: Alex Harui <aha...@adobe.com> >>>> Gesendet: Mittwoch, 23. Juli 2014 08:48 >>>> An: dev@flex.apache.org >>>> Betreff: Re: AW: AW: AW: Falcon and Antlr4 >>>> >>>>> On 7/22/14 12:07 PM, "Christofer Dutz" <christofer.d...@c-ware.de> wrote: >>>>> >>>>> The way I understood JBurg is that it seems to have been designed >>>>> to manipulate ASTs produced by Antlr2 and Antlr3. >>>>> Therefore it has a compile and runtime dependency to Antlr (I >>>>> also sort of dislike them bundling the generator together with >>>>> the runtime stuff) but nevertheless ... I can't really use JBurg >>>>> with Antlr4 in my project not without splitting the module up but I think >>>>> that's rather ugly. >>>> I'm definitely not an expert on the subject. I'm surprised the >>>> AST has any Antlr-isms in it. Maybe Gordon can confirm. When I >>>> look at the AST, I don't see anything I find surprising. >>>> >>>>> >>>>> I too was thinking about making JBurg obsolete too ... the way I >>>>> understand Antlr4 it looked as if it provided a lot which could >>>>> make life a lot easier. For example currently the ASParser >>>>> creates the AST objects and JBurg then performs it's magic on >>>>> that AST tree. In Antlr4 I could create a Parser-Listener that >>>>> produces the AST object (Probably needed for IDE suppoer) but >>>>> could probably create a second listener that directly outputs >>>>> flash bytecode. I think this approach should be maximum >>>>> performant, maximum simple and use only a fragment of the memory >>>>> the current solutions need ... Sort of XML Dom processing (old AST >>>>> parsing) and SAX (Antlr4 direct Bytecode output). >>>> I have not played with SAX much nor Antlr, so I have no idea about >>>> parser/listener. I will say that there are times folks want to >>>> create the AST and then manipulate it before generating the >>>> output, so unless there is a huge performance win, making sure >>>> there is a way to do that would be preferred. >>>> >>>>> >>>>> But I also think that this would be quite an effort. Perhaps I >>>>> should split up my falcon-antlr4 branch even more and sort of >>>>> start with the CSS parser and as soon as that's up and running get the >>>>> output running ... >>>>> then we could compare the performance of both and see if it's >>>>> worth going down that path. Don't want to waste time I could be >>>>> working on Flexmojos, or the new Flex-Maven-Plugin for a less >>>>> performant solution. But if it was faster (I would expect it to be) it >>>>> could be quite breakthough ... >>>>> after all I have never seen several datastructure conversions be >>>>> faster than direct output. >>>> Up to you since you are doing the work. I just want to make sure >>>> you don't feel like you have to keep all of these subsystems like >>>> Jburg and Jflex around. >>>> >>>> -Alex >>>> >>>> >>> >>> >>> -- >>> Ix Multimedia Software >>> >>> Jan Luykenstraat 27 >>> 3521 VB Utrecht >>> >>> T. 06-51952295 >>> I. www.ixsoftware.nl >