functionend ignored
David Grundberg
individ at acc.umu.se
Thu Jul 16 01:40:39 CDT 2009
John W. Eaton skrev:
> On 13-Jul-2009, David Grundberg wrote:
>
> | Hi,
> |
> | been working on lint, but I got stuck on this behavior I don't agree with.
> |
> | Bug report for Octave 3.1.55 configured for i686-pc-linux-gnu
> |
> | hg tip:
> | changeset: 9431:bfc7b000a229
> | tag: tip
> | user: John W. Eaton <jwe at octave.org>
> | date: Sat Jul 11 12:46:10 2009 -0400
> | summary: file-ops.cc (file_ops::symlink, file_ops::readlink): avoid
> | incorrectly sized buffer
> |
> | Description:
> | -----------
> |
> | * A user function may end with any number of 'functionend's, and no
> | error will be given.
> |
> | Repeat-By:
> | ---------
> |
> | 1. Create a file buggy.m:
> |
> | cat > buggy.m << EOF
> | function [] = buggy()
> | endfunction
> | endfunction
> | EOF
> |
> | 2. Run octave like
> |
> | /opt/octave-head/bin/octave --eval 'addpath("."); __display_tokens__(1);
> | buggy'
> |
> | 3. Expected behavior is a syntax error. But the experienced behavior
> | is that the function runs as normal.
> |
> | Note that running
> |
> | /opt/octave-head/bin/octave --eval '__display_tokens__(1);' buggy.m
> |
> | does raise a syntax error because of the extra endfunction.
> |
> | Comments:
> | --------
> |
> | * Ends seems to be ignored? In the following excerpts, note that the
> | end token is replaced with a '\n' in the first run.
> |
> | Running as a function from the Octave prompt:
> |
> | octave:1> buggy
> | NAME
> | \n
> | FCN
> | [
> | ]
> | '='
> | NAME
> | (
> | )
> | \n
> | \n
> | \n
> | END_OF_INPUT
> |
> | parsed function end as end of input!
> | END_OF_INPUT
> |
> | octave:2>
> |
> | Running buggy.m as an argument to octave:
> |
> | FCN
> | [
> | ]
> | '='
> | NAME
> | (
> | )
> | \n
> | END
> | parsed function end as a end token!
> | \n
> | END
> | parse error near line 3 of file buggy.m
> |
> | syntax error
> |
> | >>> endfunction
> |
> | For completeness, here are the changes I have done to the tip:
>
> OK, what is happening is that endfunction tokens (and end tokens that
> should match function keywords) are ignored by the lexer. I think
> this was done as a semi-tricky way to handle subfunctions. I guess we
> should fix that in some other way so that the parser does see end
> keywords instead of just EOF. I'll try to take a look a this part of
> the problem, but I can't guarantee that I will get to it any time
> soon.
>
> jwe
>
Looked further into the lexer yesterday and pretty much came to the same
conclusion (special cases for parsing subfunctions). I think this is an
interesting problem (and such a challenging tokenizer/parser) so I'll
look at it more.
regards,
David
More information about the Bug-octave
mailing list