On Aug 28, 1:48 pm, thyrsus <[email protected]> wrote: > I'd like to create a scanner for the ruby language, and to proceed > through test driven development. > > As I understand it, test driven development means identifying a > before, an after, developing a test to determine whether the before > was successfully turned into the after, then writing the code to turn > the before into the after. > > In the case of a ruby scanner, the before would be a string containing > ruby code, the after would be a Leo tree with the nodes partitioning > the ruby code into modules, classes, methods. > > I'm concerned about two issues. The easiest, perhaps, first. The > scanner should take a string and return a portion of a Leo tree, and > my test should compare that Leo tree fragment to a pre-built Leo tree > fragment which is the expected result. Is there already a routine > that can do (deep) comparisons of trees, where equivalence is (a) > headers are identical (b) bodies are identical (c) children are > identical? > > The harder problem may be ruby syntax. scanHelper() expects to be > able to find > whitespace > comments > strings > class definitions > function/method definitions > ids (names) > code blocks > "noise" > > I'm worried about strings. Like /bin/sh and perl, Ruby supports > "<<here" documents, that is, strings which are introduced by "<<word", > and whose value is all the following lines of source up to the > occurrence of "word" on a line by itself. There are variations on > quoting and indentation, but those don't introduce difficult hurdles. > The real problem is that Ruby can also use "<<" as a method name, as > in the familiar left shift: > > irb(main):002:0> 1<<8 > => 256 > > Thus to disambiguate the beginning of a string and the invocation of a > method, the parser needs to expect one or the other. I don't see how > to do this in cooperation with the current scanner class design. Does > anyone have an insight? > > Hey, at least it's not perl, the parsing of which was recently show to > require solution of the halting > problem:http://www.perlmonks.org/?node_id=663393 > > - Stephen I'm cheating on the tree comparisons. This is what I'm using for rubyUnitTest def rubyUnitTest (self,p,fileName=None,s=None,showTree=False,compTree=False): if compTree: showTree=True result = self.scannerUnitTest (p,atAuto=False,fileName=fileName,s=s,showTree=showTree,ext='.rb') if result and compTree: p.moveToFirstChild() t1 = p.convertTreeToString() p.moveToNext() t2 = p.convertTreeToString() result = (t1 == t2) if g.app.unitTesting: if not result: g.es("expected: " + t1) g.es("obtained: " + t2) assert result return result --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "leo-editor" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/leo-editor?hl=en -~----------~----~----~----~------~----~------~--~---
