From: Philip C. <Phil.Cannata@Sun.COM> - 2009-12-30 19:20:48
|
I work at Sun but I also teach a Programming Languages course at the University of Texas in Austin. I'm considering teaching the internals of Jython in my course but I'm just getting familiar with them (and Jython) myself. Are there any "internals" documents? Also, Frank suggested trying astview.py, can someone give me some example use-cases for it? thanksphil |
From: Frank W. <fwi...@gm...> - 2009-12-30 19:48:24
|
On Wed, Dec 30, 2009 at 2:19 PM, Philip Cannata <Phi...@su...> wrote: > I work > > at Sun but I also teach a Programming Languages course at the > University of Texas in Austin. I'm considering teaching the internals of > Jython in my course but I'm just getting familiar with them (and Jython) > myself. Are there any "internals" documents? There really aren't any internals docs. If you start any let us know :) or, if you'd like, put them in the jython wiki: http://wiki.python.org/jython/ > Also, Frank suggested trying astview.py, can someone give me some example > use-cases for it? If you take a file with contents: a = 1 and put it in a file foo.py, you can run astview.py on it like so: jython astview.py foo.py And you will get: ('Module', ('body', ('Assign (1,0)', ('targets', ('Name (1,0)', ('id', 'a'), ('ctx', ('Store',)))), ('value', ('Num (1,4)', ('n', 1)))))) Which is a lispified AST for "a=1". -Frank |
From: Philip C. <Phil.Cannata@Sun.COM> - 2009-12-30 20:00:52
|
Thanks Franke, but if I do the following: $ cat testAstView.py; ./dist/bin/jython ast/astview.py testAstView.py a=111 b=222 x=a+b ('Module', ('body', ('Assign (1,0)', ('targets', ('Name (1,0)', ('id', 'a'), ('ctx', ('Store',)))), ('value', ('Num (1,2)', ('n', 111)))), ('Assign (2,0)', ('targets', ('Name (2,0)', ('id', 'b'), ('ctx', ('Store',)))), ('value', ('Num (2,2)', ('n', 222)))), ('Assign (3,0)', ('targets', ('Name (3,0)', ('id', 'x'), ('ctx', ('Store',)))), ('value', ('BinOp (3,2)', ('left', ('Name (3,2)', ('id', 'a'), ('ctx', ('Load',)))), ('op', ('Add',)), ('right', ('Name (3,4)', ('id', 'b'), ('ctx', ('Load',))))))))) I still don't get the values of "a" and "b" in the third assignment's ast which is what I'm trying to get. phil > > at Sun but I also teach a Programming Languages course at the > > University of Texas in Austin. I'm considering teaching the internals of > > Jython in my course but I'm just getting familiar with them (and Jython) > > myself. Are there any "internals" documents? >There really aren't any internals docs. If you start any let us know >:) or, if you'd like, put them in the jython wiki: >http://wiki.python.org/jython/ > > > Also, Frank suggested trying astview.py, can someone give me some example > > use-cases for it? >If you take a file with contents: > >a = 1 > >and put it in a file foo.py, you can run astview.py on it like so: > >jython astview.py foo.py > >And you will get: > >('Module', > ('body', > ('Assign (1,0)', > ('targets', ('Name (1,0)', ('id', 'a'), ('ctx', ('Store',)))), > ('value', ('Num (1,4)', ('n', 1)))))) > >Which is a lispified AST for "a=1". > >-Frank |
From: Frank W. <fwi...@gm...> - 2009-12-30 20:10:32
|
On Wed, Dec 30, 2009 at 2:59 PM, Philip Cannata <Phi...@su...> wrote: > Thanks Franke, but if I do the following: > $ cat testAstView.py; ./dist/bin/jython ast/astview.py testAstView.py > a=111 > b=222 > x=a+b Not sure exactly what you are looking for. To get x with a value of 333 you really have to run the program, since from an AST perspective the "x" is a name and doesn't have a value until runtime. If you are looking for runtime values - you can always use locals() >>> a = 111 >>> b = 222 >>> x = a + b >>> locals() {'b': 222, '__doc__': None, 'a': 111, '__name__': '__main__', 'x': 333} -Frank |
From: Philip C. <Phil.Cannata@Sun.COM> - 2009-12-30 20:19:47
|
Yes, in my original question to you (not to the email group) I was essentially asking how to get "run time" values of variables that have already been set by an assignment. Essentially I'd like a java way to do this something like: >>> a = 111 and then do getValue(a) in some internal java code. phil At 02:10 PM 12/30/2009, Frank Wierzbicki wrote: >On Wed, Dec 30, 2009 at 2:59 PM, Philip Cannata <Phi...@su...> wrote: > > Thanks Franke, but if I do the following: > > $ cat testAstView.py; ./dist/bin/jython ast/astview.py testAstView.py > > a=111 > > b=222 > > x=a+b >Not sure exactly what you are looking for. To get x with a value of >333 you really have to run the program, since from an AST perspective >the "x" is a name and doesn't have a value until runtime. If you are >looking for runtime values - you can always use locals() > > >>> a = 111 > >>> b = 222 > >>> x = a + b > >>> locals() >{'b': 222, '__doc__': None, 'a': 111, '__name__': '__main__', 'x': 333} > > >-Frank |
From: Marc D. <ma...@op...> - 2009-12-30 20:53:46
|
On Wed, Dec 30, 2009 at 2:18 PM, Philip Cannata <Phi...@su...>wrote: > Yes, in my original question to you (not to the email group) I was > essentially asking how to get "run time" values of variables that > have already been set by an assignment. Essentially I'd like a java > way to do this something like: > >>> a = 111 > and then do getValue(a) in some internal java code. > Are you looking for PythonInterpreter.get("a", Number.class) ? Marc. |
From: Philip C. <Phil.Cannata@Sun.COM> - 2009-12-30 21:08:12
|
Yes, but if I put it in Python.g at line 639 as follows: //expr_stmt: testlist (augassign (yield_expr|testlist) | // ('=' (yield_expr|testlist))*) expr_stmt @init { stmt stype = null; } @after { if (stype != null) { $expr_stmt.tree = stype; } System.out.println("Value of a is " + PythonInterpreter.get("a", Number.class)); } I get compile: [javac] Compiling 600 source files to c:\My jython2.5.1\build\classes [javac] c:\My jython2.5.1\build\gensrc\org\python\antlr\PythonParser.java:4005: non-static method <T>get(java.lang.String,java.lang.Class<T>) cannot be referenced from a static context [javac] System.out.println("Value of a is " + PythonInterpreter.get("a", Number.class)); [javac] ^ and I'm not sure of a proper way to fix this. thanks phil At 02:28 PM 12/30/2009, Marc Downie wrote: >On Wed, Dec 30, 2009 at 2:18 PM, Philip Cannata ><<mailto:Phi...@su...>Phi...@su...> wrote: >Yes, in my original question to you (not to the email group) I was >essentially asking how to get "run time" values of variables that >have already been set by an assignment. Essentially I'd like a java >way to do this something like: > >>> a = 111 >and then do getValue(a) in some internal java code. > > >Are you looking for PythonInterpreter.get("a", Number.class) ? > >Marc. |
From: Marc D. <ma...@op...> - 2009-12-30 21:22:00
|
Sorry: I implied that it was static when it clearly isn't. (I'm I little lost as to what you are aiming for. One idea, if you want to catch all writes to the global namespace you can pass in your own subclass of PyStringMap to the PythonInterpreter constructor — no .g file hacking required.) Marc. On Wed, Dec 30, 2009 at 3:08 PM, Philip Cannata <Phi...@su...>wrote: > Yes, but if I put it in Python.g at line 639 as follows: > > //expr_stmt: testlist (augassign (yield_expr|testlist) | > // ('=' (yield_expr|testlist))*) > expr_stmt > @init { > stmt stype = null; > } > @after { > if (stype != null) { > $expr_stmt.tree = stype; > } > System.out.println("Value of a is " + PythonInterpreter.get("a", > Number.class)); > } > > I get > compile: > [javac] Compiling 600 source files to c:\My jython2.5.1\build\classes > [javac] c:\My > jython2.5.1\build\gensrc\org\python\antlr\PythonParser.java:4005: non-static > method <T>get(java.lang.String,java.lang.Class<T>) cannot be referenced from > a static context > [javac] System.out.println("Value of a is " + > PythonInterpreter.get("a", Number.class)); > > [javac] > ^ > > and I'm not sure of a proper way to fix this. > thanks > phil > > > At 02:28 PM 12/30/2009, Marc Downie wrote: > > On Wed, Dec 30, 2009 at 2:18 PM, Philip Cannata <Phi...@su...> > wrote: > Yes, in my original question to you (not to the email group) I was > essentially asking how to get "run time" values of variables that > have already been set by an assignment. Essentially I'd like a java > way to do this something like: > >>> a = 111 > and then do getValue(a) in some internal java code. > > > Are you looking for PythonInterpreter.get("a", Number.class) ? > > Marc. > > |
From: Frank W. <fwi...@gm...> - 2009-12-30 21:35:34
|
On Wed, Dec 30, 2009 at 4:08 PM, Philip Cannata <Phi...@su...> wrote: > Yes, but if I put it in Python.g at line 639 as follows: Probably Python.g is not the place you want to be putting this, since the x in "x = a + b" is only a symbol from the viewpoint of parsing (which is all Python.g does). The way you get from source to something at runtime goes roughly: Source --- (parse) ---> AST --- (compile) ---> Java bytecodes --- (class loading) ---> real objects ready to run --- (interpreter) ---> actual values like x = 333 -Frank |
From: Philip C. <Phil.Cannata@Sun.COM> - 2009-12-31 05:58:21
|
Frank and Marc, thanks for your time. Let me explain a little bit what I'm trying to do. For teaching purposes, I like to teach my students to modify the grammar first before proceeding to the AST etc. So, with the small change to Python.g below I've gotten the following to be recognized: >>> a=111 >>> b=a+222 >>> SELECT * FROM emp WHERE x = b SELECT Statement is: SELECT * FROM emp, WHERE x = b but, I'd like to get it to print out: SELECT Statement is: SELECT * FROM emp, WHERE x = 333 by getting the value of "b" which I believe has already been parsed and turned into a real object and therefore has a value when I'm parsing the SELECT line. (i.e., I need something in place of $e.text). Here's the change to Python.g starting at line 568: //small_stmt: (expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | // import_stmt | global_stmt | exec_stmt | assert_stmt) small_stmt : expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | exec_stmt | assert_stmt | query_stmt ; //query_stmt: SELECT * FROM person WHERE x = value query_stmt : SELECT STAR CAPSFROM n1 = NAME ( WHERE n2 = NAME ASSIGN e = expr_stmt )? { System.out.println("SELECT Statement is: SELECT * FROM " + $n1.text + ", WHERE " + $n2.text + " = " + $e.text); } -> ^(SELECT<Pass>[$SELECT]) ; At 03:35 PM 12/30/2009, Frank Wierzbicki wrote: >On Wed, Dec 30, 2009 at 4:08 PM, Philip Cannata <Phi...@su...> wrote: > > Yes, but if I put it in Python.g at line 639 as follows: >Probably Python.g is not the place you want to be putting this, since >the x in "x = a + b" is only a symbol from the viewpoint of parsing >(which is all Python.g does). The way you get from source to >something at runtime goes roughly: > >Source --- (parse) ---> AST --- (compile) ---> Java bytecodes --- >(class loading) ---> real objects ready to run --- (interpreter) ---> >actual values like x = 333 > >-Frank |
From: Mohamed B. <mo...@ba...> - 2009-12-31 22:30:22
|
perhaps there is some value in delaying evaluation ... i'm thinking about expression trees and LINQ. —Mohamed On 31/12/09 05:07, Philip Cannata wrote: > Frank and Marc, thanks for your time. Let me explain a little bit > what I'm trying to do. For teaching purposes, I like to teach my > students to modify the grammar first before proceeding to the AST > etc. So, with the small change to Python.g below I've gotten the > following to be recognized: > >>> a=111 > >>> b=a+222 > >>> SELECT * FROM emp WHERE x = b > SELECT Statement is: SELECT * FROM emp, WHERE x = b > > but, I'd like to get it to print out: > SELECT Statement is: SELECT * FROM emp, WHERE x = 333 > by getting the value of "b" which I believe has already been parsed > and turned into a real object and therefore has a value when I'm > parsing the SELECT line. (i.e., I need something in place of $e.text). > > Here's the change to Python.g starting at line 568: > //small_stmt: (expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | > // import_stmt | global_stmt | exec_stmt | assert_stmt) > small_stmt : expr_stmt > | print_stmt > | del_stmt > | pass_stmt > | flow_stmt > | import_stmt > | global_stmt > | exec_stmt > | assert_stmt > | query_stmt > ; > //query_stmt: SELECT * FROM person WHERE x = value > query_stmt > : SELECT STAR CAPSFROM n1 = NAME ( WHERE n2 = NAME ASSIGN e = expr_stmt )? > { System.out.println("SELECT Statement is: SELECT * FROM " > + $n1.text + ", WHERE " + $n2.text + " = " + $e.text); } > -> ^(SELECT<Pass>[$SELECT]) > ; > > At 03:35 PM 12/30/2009, Frank Wierzbicki wrote: > >> On Wed, Dec 30, 2009 at 4:08 PM, Philip Cannata<Phi...@su...> wrote: >> >>> Yes, but if I put it in Python.g at line 639 as follows: >>> >> Probably Python.g is not the place you want to be putting this, since >> the x in "x = a + b" is only a symbol from the viewpoint of parsing >> (which is all Python.g does). The way you get from source to >> something at runtime goes roughly: >> >> Source --- (parse) ---> AST --- (compile) ---> Java bytecodes --- >> (class loading) ---> real objects ready to run --- (interpreter) ---> >> actual values like x = 333 >> >> -Frank >> > > ------------------------------------------------------------------------------ > This SF.Net email is sponsored by the Verizon Developer Community > Take advantage of Verizon's best-in-class app development support > A streamlined, 14 day to market process makes app distribution fast and easy > Join now and get one step closer to millions of Verizon customers > http://p.sf.net/sfu/verizon-dev2dev > _______________________________________________ > Jython-dev mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-dev > |
From: Jim B. <jb...@zy...> - 2009-12-31 23:40:48
|
Here's my recommendation: - Modify python.g to add support for the select statement, as you've done with query_stmt stuff you quote below. You don't want to have the parser actually do things like print, it's just not going to work too well. And in particular, the parser has no easy access to runtime values. You would have to at least consider issues like PySystemState, etc., to find them. - If you want to add AST introspection/mutability, you probably need to write an adapter in org.python.antlr.adapter. (Frank would certainly know for certain on this part.) This is certainly overkill for now. - In org.python.compiler.CodeCompiler, add a method to visit this query node. Something like visitQueryStatement. This will be used to define the query statement, which in Python is always a dynamic construct. See visitClassDef for something similar. You can add support to the Jython runtime, or probably better just create an appropriate class in Python. The easiest way to do is do something like code.invokestatic(... instantiate a QueryStatement object with slots ...) - I'll let you figure out the signature. One good example of this melding of Python code into Java code is seen in org.python.core.PyBytecode, which loads up the dis module to support the dissassembly of ops for debugging purposes. - Write your QueryStatement class such that its __repr__ special method prints out as desired. That should do it. - Jim On Wed, Dec 30, 2009 at 10:07 PM, Philip Cannata <Phi...@su...>wrote: > Frank and Marc, thanks for your time. Let me explain a little bit > what I'm trying to do. For teaching purposes, I like to teach my > students to modify the grammar first before proceeding to the AST > etc. So, with the small change to Python.g below I've gotten the > following to be recognized: > >>> a=111 > >>> b=a+222 > >>> SELECT * FROM emp WHERE x = b > SELECT Statement is: SELECT * FROM emp, WHERE x = b > > but, I'd like to get it to print out: > SELECT Statement is: SELECT * FROM emp, WHERE x = 333 > by getting the value of "b" which I believe has already been parsed > and turned into a real object and therefore has a value when I'm > parsing the SELECT line. (i.e., I need something in place of $e.text). > > Here's the change to Python.g starting at line 568: > //small_stmt: (expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | > // import_stmt | global_stmt | exec_stmt | assert_stmt) > small_stmt : expr_stmt > | print_stmt > | del_stmt > | pass_stmt > | flow_stmt > | import_stmt > | global_stmt > | exec_stmt > | assert_stmt > | query_stmt > ; > //query_stmt: SELECT * FROM person WHERE x = value > query_stmt > : SELECT STAR CAPSFROM n1 = NAME ( WHERE n2 = NAME ASSIGN e = expr_stmt > )? > { System.out.println("SELECT Statement is: SELECT * FROM " > + $n1.text + ", WHERE " + $n2.text + " = " + $e.text); } > -> ^(SELECT<Pass>[$SELECT]) > ; > > At 03:35 PM 12/30/2009, Frank Wierzbicki wrote: > >On Wed, Dec 30, 2009 at 4:08 PM, Philip Cannata <Phi...@su...> > wrote: > > > Yes, but if I put it in Python.g at line 639 as follows: > >Probably Python.g is not the place you want to be putting this, since > >the x in "x = a + b" is only a symbol from the viewpoint of parsing > >(which is all Python.g does). The way you get from source to > >something at runtime goes roughly: > > > >Source --- (parse) ---> AST --- (compile) ---> Java bytecodes --- > >(class loading) ---> real objects ready to run --- (interpreter) ---> > >actual values like x = 333 > > > >-Frank > > > > ------------------------------------------------------------------------------ > This SF.Net email is sponsored by the Verizon Developer Community > Take advantage of Verizon's best-in-class app development support > A streamlined, 14 day to market process makes app distribution fast and > easy > Join now and get one step closer to millions of Verizon customers > http://p.sf.net/sfu/verizon-dev2dev > _______________________________________________ > Jython-dev mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-dev > -- Jim Baker jb...@zy... |
From: Philip C. <Phil.Cannata@Sun.COM> - 2010-01-01 22:31:58
|
Thanks for the response. Unfortunately, I just got home from emergency surgery (gallbladder remove) so I haven't had a chance to give it a try. Hopefully tomorrow. phil At 05:40 PM 12/31/2009, Jim Baker wrote: >Here's my recommendation: > * Modify python.g to add support for the > select statement, as you've done with > query_stmt stuff you quote below. You don't > want to have the parser actually do things like > print, it's just not going to work too well. > And in particular, the parser has no easy > access to runtime values. You would have to at > least consider issues like PySystemState, etc., to find them. > * If you want to add AST > introspection/mutability, you probably need to > write an adapter in org.python.antlr.adapter. > (Frank would certainly know for certain on this > part.) This is certainly overkill for now. > * In org.python.compiler.CodeCompiler, add a > method to visit this query node. Something like > visitQueryStatement. This will be used to > define the query statement, which in Python is > always a dynamic construct. See visitClassDef > for something similar. You can add support to > the Jython runtime, or probably better just > create an appropriate class in Python. The > easiest way to do is do something like > code.invokestatic(... instantiate a > QueryStatement object with slots ...) - I'll > let you figure out the signature. One good > example of this melding of Python code into > Java code is seen in > org.python.core.PyBytecode, which loads up the > dis module to support the dissassembly of ops for debugging purposes. > * Write your QueryStatement class such that > its __repr__ special method prints out as desired. > >That should do it. > >- Jim > >On Wed, Dec 30, 2009 at 10:07 PM, Philip Cannata ><<mailto:Phi...@su...>Phi...@su...> wrote: >Frank and Marc, thanks for your time. Let me explain a little bit >what I'm trying to do. For teaching purposes, I like to teach my >students to modify the grammar first before proceeding to the AST >etc. So, with the small change to Python.g below I've gotten the >following to be recognized: > >>> a=111 > >>> b=a+222 > >>> SELECT * FROM emp WHERE x = b >SELECT Statement is: SELECT *  FROM emp, WHERE x = b > >but, I'd like to get it to print out: >SELECT Statement is: SELECT *  FROM emp, WHERE x = 333 >by getting the value of "b" which I believe has already been parsed >and turned into a real object and therefore has a value when I'm >parsing the SELECT line. (i.e., I need something in place of $e.text). > >Here's the change to Python.g starting at line 568: >//small_stmt: (expr_stmt | print_stmt  | del_stmt | pass_stmt | flow_stmt | >//       import_stmt | global_stmt | exec_stmt | assert_stmt) >small_stmt : expr_stmt >      | print_stmt >      | del_stmt >      | pass_stmt >      | flow_stmt >      | import_stmt >      | global_stmt >      | exec_stmt >      | assert_stmt >      | query_stmt >      ; >//query_stmt: SELECT * FROM person WHERE x = value >query_stmt >  : SELECT STAR CAPSFROM n1 = NAME ( WHERE >n2 = NAME ASSIGN e = expr_stmt )? >    { System.out.println("SELECT Statement is: SELECT *  FROM " >+ $n1.text + ", WHERE " + $n2.text + " = " + $e.text); } >  -> ^(SELECT<Pass>[$SELECT]) >  ; > >At 03:35 PM 12/30/2009, Frank Wierzbicki wrote: > >On Wed, Dec 30, 2009 at 4:08 PM, Philip > Cannata <<mailto:Phi...@su...>Phi...@su...> wrote: > > > Yes, but if I put it in Python.g at line 639 as follows: > >Probably Python.g is not the place you want to be putting this, since > >the x in "x = a + b" is only a symbol from the viewpoint of parsing > >(which is all Python.g does).  The way you get from source to > >something at runtime goes roughly: > > > >Source --- (parse) ---> AST --- (compile) ---> Java bytecodes --- > >(class loading) ---> real objects ready to run --- (interpreter) ---> > >actual values like x = 333 > > > >-Frank > > >------------------------------------------------------------------------------ >This SF.Net email is sponsored by the Verizon Developer Community >Take advantage of Verizon's best-in-class app development support >A streamlined, 14 day to market process makes app distribution fast and easy >Join now and get one step closer to millions of Verizon customers ><http://p.sf.net/sfu/verizon-dev2dev>http://p.sf.net/sfu/verizon-dev2dev >_______________________________________________ >Jython-dev mailing list ><mailto:Jyt...@li...>Jyt...@li... >https://lists.sourceforge.net/lists/listinfo/jython-dev > > > > >-- >Jim Baker ><mailto:jb...@zy...>jb...@zy... |
From: Philip C. <Phil.Cannata@Sun.COM> - 2010-01-04 17:32:24
|
At 05:40 PM 12/31/2009, Jim Baker wrote: >Here's my recommendation: > * Modify python.g to add support for the > select statement, as you've done with > query_stmt stuff you quote below. You don't > want to have the parser actually do things like > print, it's just not going to work too well. > And in particular, the parser has no easy > access to runtime values. You would have to at > least consider issues like PySystemState, etc., to find them. > * If you want to add AST > introspection/mutability, you probably need to > write an adapter in org.python.antlr.adapter. > (Frank would certainly know for certain on this > part.) This is certainly overkill for now. > * In org.python.compiler.CodeCompiler, add a > method to visit this query node. Something like visitQueryStatement. If I try to add something like @Override public Object visitQuery(Query node) throws Exception { . . . to CodeCompiler I need to have Query defined or I get compile: [javac] Compiling 526 source files to c:\MyJython\jython\jython\build\classes [javac] c:\MyJython\jython\jython\src\org\python\compiler\CodeCompiler.java:2286: cannot find symbol [javac] symbol : class Query [javac] location: class org.python.compiler.CodeCompiler [javac] public Object visitQuery(Query node) throws Exception { Where do I define the Query node? I tried adding Query.java to src\org\python\antlr\ast but that didn't do it. thanks phil > * This will be used to define the query > statement, which in Python is always a dynamic > construct. See visitClassDef for something > similar. You can add support to the Jython > runtime, or probably better just create an > appropriate class in Python. The easiest way to > do is do something like code.invokestatic(... > instantiate a QueryStatement object with slots > ...) - I'll let you figure out the signature. > One good example of this melding of Python code > into Java code is seen in > org.python.core.PyBytecode, which loads up the > dis module to support the dissassembly of ops for debugging purposes. > * Write your QueryStatement class such that > its __repr__ special method prints out as desired. > >That should do it. > >- Jim > >On Wed, Dec 30, 2009 at 10:07 PM, Philip Cannata ><<mailto:Phi...@su...>Phi...@su...> wrote: >Frank and Marc, thanks for your time. Let me explain a little bit >what I'm trying to do. For teaching purposes, I like to teach my >students to modify the grammar first before proceeding to the AST >etc. So, with the small change to Python.g below I've gotten the >following to be recognized: > >>> a=111 > >>> b=a+222 > >>> SELECT * FROM emp WHERE x = b >SELECT Statement is: SELECT *  FROM emp, WHERE x = b > >but, I'd like to get it to print out: >SELECT Statement is: SELECT *  FROM emp, WHERE x = 333 >by getting the value of "b" which I believe has already been parsed >and turned into a real object and therefore has a value when I'm >parsing the SELECT line. (i.e., I need something in place of $e.text). > >Here's the change to Python.g starting at line 568: >//small_stmt: (expr_stmt | print_stmt  | del_stmt | pass_stmt | flow_stmt | >//       import_stmt | global_stmt | exec_stmt | assert_stmt) >small_stmt : expr_stmt >      | print_stmt >      | del_stmt >      | pass_stmt >      | flow_stmt >      | import_stmt >      | global_stmt >      | exec_stmt >      | assert_stmt >      | query_stmt >      ; >//query_stmt: SELECT * FROM person WHERE x = value >query_stmt >  : SELECT STAR CAPSFROM n1 = NAME ( WHERE >n2 = NAME ASSIGN e = expr_stmt )? >    { System.out.println("SELECT Statement is: SELECT *  FROM " >+ $n1.text + ", WHERE " + $n2.text + " = " + $e.text); } >  -> ^(SELECT<Pass>[$SELECT]) >  ; > >At 03:35 PM 12/30/2009, Frank Wierzbicki wrote: > >On Wed, Dec 30, 2009 at 4:08 PM, Philip > Cannata <<mailto:Phi...@su...>Phi...@su...> wrote: > > > Yes, but if I put it in Python.g at line 639 as follows: > >Probably Python.g is not the place you want to be putting this, since > >the x in "x = a + b" is only a symbol from the viewpoint of parsing > >(which is all Python.g does).  The way you get from source to > >something at runtime goes roughly: > > > >Source --- (parse) ---> AST --- (compile) ---> Java bytecodes --- > >(class loading) ---> real objects ready to run --- (interpreter) ---> > >actual values like x = 333 > > > >-Frank > > >------------------------------------------------------------------------------ >This SF.Net email is sponsored by the Verizon Developer Community >Take advantage of Verizon's best-in-class app development support >A streamlined, 14 day to market process makes app distribution fast and easy >Join now and get one step closer to millions of Verizon customers ><http://p.sf.net/sfu/verizon-dev2dev>http://p.sf.net/sfu/verizon-dev2dev >_______________________________________________ >Jython-dev mailing list ><mailto:Jyt...@li...>Jyt...@li... >https://lists.sourceforge.net/lists/listinfo/jython-dev > > > > >-- >Jim Baker ><mailto:jb...@zy...>jb...@zy... |
From: Philip C. <Phil.Cannata@Sun.COM> - 2010-01-04 20:03:12
|
Never mind, I think I'm on my way to figuring it out. Thanks again for the help phil At 11:31 AM 1/4/2010, Philip Cannata wrote: >At 05:40 PM 12/31/2009, Jim Baker wrote: >>Here's my recommendation: >> * Modify python.g to add support for the >> select statement, as you've done with >> query_stmt stuff you quote below. You don't >> want to have the parser actually do things >> like print, it's just not going to work too >> well. And in particular, the parser has no >> easy access to runtime values. You would have >> to at least consider issues like PySystemState, etc., to find them. >> * If you want to add AST >> introspection/mutability, you probably need to >> write an adapter in org.python.antlr.adapter. >> (Frank would certainly know for certain on >> this part.) This is certainly overkill for now. >> * In org.python.compiler.CodeCompiler, add >> a method to visit this query node. Something like visitQueryStatement. > >If I try to add something like > @Override > public Object visitQuery(Query node) throws Exception { . . . >to CodeCompiler I need to have Query defined or I get > >compile: > [javac] Compiling 526 source files to > c:\MyJython\jython\jython\build\classes > [javac] > c:\MyJython\jython\jython\src\org\python\compiler\CodeCompiler.java:2286: > cannot find symbol > [javac] symbol : class Query > [javac] location: class org.python.compiler.CodeCompiler > [javac] public Object visitQuery(Query node) throws Exception { > >Where do I define the Query node? I tried adding >Query.java to src\org\python\antlr\ast but that didn't do it. >thanks >phil > >> * This will be used to define the query >> statement, which in Python is always a dynamic >> construct. See visitClassDef for something >> similar. You can add support to the Jython >> runtime, or probably better just create an >> appropriate class in Python. The easiest way >> to do is do something like >> code.invokestatic(... instantiate a >> QueryStatement object with slots ...) - I'll >> let you figure out the signature. One good >> example of this melding of Python code into >> Java code is seen in >> org.python.core.PyBytecode, which loads up the >> dis module to support the dissassembly of ops for debugging purposes. >> * Write your QueryStatement class such that >> its __repr__ special method prints out as desired. >> >>That should do it. >> >>- Jim >> >>On Wed, Dec 30, 2009 at 10:07 PM, Philip >>Cannata <<mailto:Phi...@su...>Phi...@su...> wrote: >>Frank and Marc, thanks for your time. Let me explain a little bit >>what I'm trying to do. For teaching purposes, I like to teach my >>students to modify the grammar first before proceeding to the AST >>etc. So, with the small change to Python.g below I've gotten the >>following to be recognized: >> >>> a=111 >> >>> b=a+222 >> >>> SELECT * FROM emp WHERE x = b >>SELECT Statement is: SELECT *  FROM emp, WHERE x = b >>but, I'd like to get it to print out: >>SELECT Statement is: SELECT *  FROM emp, WHERE x = 333 >>by getting the value of "b" which I believe has already been parsed >>and turned into a real object and therefore has a value when I'm >>parsing the SELECT line. (i.e., I need something in place of $e.text). >>Here's the change to Python.g starting at line 568: >>//small_stmt: (expr_stmt | print_stmt  | del_stmt | pass_stmt | flow_stmt | >>//       import_stmt | global_stmt | exec_stmt | assert_stmt) >>small_stmt : expr_stmt >>      | print_stmt >>      | del_stmt >>      | pass_stmt >>      | flow_stmt >>      | import_stmt >>      | global_stmt >>      | exec_stmt >>      | assert_stmt >>      | query_stmt >>      ; >>//query_stmt: SELECT * FROM person WHERE x = value >>query_stmt >>  : SELECT STAR CAPSFROM n1 = NAME ( WHERE >>n2 = NAME ASSIGN e = expr_stmt )? >>    { System.out.println("SELECT Statement is: SELECT *  FROM " >>+ $n1.text + ", WHERE " + $n2.text + " = " + $e.text); } >>  -> ^(SELECT<Pass>[$SELECT]) >>  ; >>At 03:35 PM 12/30/2009, Frank Wierzbicki wrote: >> >On Wed, Dec 30, 2009 at 4:08 PM, Philip >> Cannata <<mailto:Phi...@su...>Phi...@su...> wrote: >> > > Yes, but if I put it in Python.g at line 639 as follows: >> >Probably Python.g is not the place you want to be putting this, since >> >the x in "x = a + b" is only a symbol from the viewpoint of parsing >> >(which is all Python.g does).  The way you get from source to >> >something at runtime goes roughly: >> > >> >Source --- (parse) ---> AST --- (compile) ---> Java bytecodes --- >> >(class loading) ---> real objects ready to run --- (interpreter) ---> >> >actual values like x = 333 >> > >> >-Frank >> >>------------------------------------------------------------------------------ >> >>This SF.Net email is sponsored by the Verizon Developer Community >>Take advantage of Verizon's best-in-class app development support >>A streamlined, 14 day to market process makes app distribution fast and easy >>Join now and get one step closer to millions of Verizon customers >><http://p.sf.net/sfu/verizon-dev2dev>http://p.sf.net/sfu/verizon-dev2dev >>_______________________________________________ >>Jython-dev mailing list >><mailto:Jyt...@li...>Jyt...@li... >>https://lists.sourceforge.net/lists/listinfo/jython-dev >> >> >> >> >>-- >>Jim Baker >><mailto:jb...@zy...>jb...@zy... |