A method in a computing system for debugging source code in a visual debugger using breakpoints to facilitate step-based evaluation of expressions, the source code being written in an interpreted programming language, the method comprising: presenting a visual user interface for receiving debugging commands; receiving a debug command to set or change an indicated breakpoint in a segment of the source code that is expressed in the interpreted programming language and that defines one or more expressions; in response to receiving the debug command to set or change the indicated breakpoint, determining the nearest enclosing expression to the indicated breakpoint, including determining the nearest enclosing expression that begins on a line of the source code associated with the segment that is different from a line of the associated source code that contains the indicated breakpoint, and generating a breakpoint address that indicates a location in the segment that corresponds to the beginning of the determined enclosing expression when the segment is evaluated, wherein the breakpoint address corresponds to a logical address in a parse tree wherein said parse tree includes references to source code and is generated by a secondary parser; causing the segment to be evaluated using an interpreter for the interpreted programming language, such that evaluation automatically stops when the location in the code segment that corresponds to the breakpoint address is encountered, wherein the interpreter for the interpreted programming language comprises a primary parser that generates a parse tree arranged according a grammar of the interpreted programming language, the parse tree generated by the primary parser containing no information regarding the corresponding source code or line numbers; causing one or more source code statements that correspond to and indicate the location in the segment where the evaluation stopped to be displayed in the visual user interface, wherein the parse tree generated by the secondary parser has the same structure as the parse tree generated by the primary parser, and wherein the generated breakpoint address that corresponds to the parse tree of the secondary parser is mapped to a memory address that corresponds to a node in the parse tree of the primary parser; and receiving one or more additional debug commands to further control the evaluation of the segment or to examine aspects of the segment under evaluation. presenting a visual user interface for receiving debugging commands; receiving a debug command to set or change an indicated breakpoint in a segment of the source code that is expressed in the interpreted programming language and that defines one or more expressions; in response to receiving the debug command to set or change the indicated breakpoint, determining the nearest enclosing expression to the indicated breakpoint, including determining the nearest enclosing expression that begins on a line of the source code associated with the segment that is different from a line of the associated source code that contains the indicated breakpoint, and generating a breakpoint address that indicates a location in the segment that corresponds to the beginning of the determined enclosing expression when the segment is evaluated, wherein the breakpoint address corresponds to a logical address in a parse tree determining the nearest enclosing expression to the indicated breakpoint, including determining the nearest enclosing expression that begins on a line of the source code associated with the segment that is different from a line of the associated source code that contains the indicated breakpoint, and generating a breakpoint address that indicates a location in the segment that corresponds to the beginning of the determined enclosing expression when the segment is evaluated, wherein the breakpoint address corresponds to a logical address in a parse tree wherein said parse tree includes references to source code and is generated by a secondary parser; causing the segment to be evaluated using an interpreter for the interpreted programming language, such that evaluation automatically stops when the location in the code segment that corresponds to the breakpoint address is encountered, wherein the interpreter for the interpreted programming language comprises a primary parser that generates a parse tree arranged according a grammar of the interpreted programming language, the parse tree generated by the primary parser containing no information regarding the corresponding source code or line numbers; causing one or more source code statements that correspond to and indicate the location in the segment where the evaluation stopped to be displayed in the visual user interface, wherein the parse tree generated by the secondary parser has the same structure as the parse tree generated by the primary parser, and wherein the generated breakpoint address that corresponds to the parse tree of the secondary parser is mapped to a memory address that corresponds to a node in the parse tree of the primary parser; and wherein the parse tree generated by the secondary parser has the same structure as the parse tree generated by the primary parser, and wherein the generated breakpoint address that corresponds to the parse tree of the secondary parser is mapped to a memory address that corresponds to a node in the parse tree of the primary parser; and receiving one or more additional debug commands to further control the evaluation of the segment or to examine aspects of the segment under evaluation.