@c DO NOT EDIT!  Generated automatically by munge-texi.pl.

@c Copyright (C) 1996-2023 The Octave Project Developers
@c
@c This file is part of Octave.
@c
@c Octave is free software: you can redistribute it and/or modify it
@c under the terms of the GNU General Public License as published by
@c the Free Software Foundation, either version 3 of the License, or
@c (at your option) any later version.
@c
@c Octave is distributed in the hope that it will be useful, but
@c WITHOUT ANY WARRANTY; without even the implied warranty of
@c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
@c GNU General Public License for more details.
@c
@c You should have received a copy of the GNU General Public License
@c along with Octave; see the file COPYING.  If not, see
@c <https://www.gnu.org/licenses/>.

@node Grammar and Parser
@appendix Grammar and Parser
@cindex grammar rules
@cindex language definition

This appendix will eventually contain a semi-formal description of
Octave's language.

@menu
* Keywords::
* Parser::
@end menu

@node Keywords
@section Keywords
@cindex keywords

The following identifiers are keywords, and may not be used as variable
or function names:

@multitable @columnfractions .33 .33 .33
@item @code{__FILE__} @tab @code{__LINE__} @tab @code{break}
@item @code{case} @tab @code{catch} @tab @code{classdef}
@item @code{continue} @tab @code{do} @tab @code{else}
@item @code{elseif} @tab @code{end} @tab @code{end_try_catch}
@item @code{end_unwind_protect} @tab @code{endclassdef} @tab @code{endenumeration}
@item @code{endevents} @tab @code{endfor} @tab @code{endfunction}
@item @code{endif} @tab @code{endmethods} @tab @code{endparfor}
@item @code{endproperties} @tab @code{endswitch} @tab @code{endwhile}
@item @code{enumeration} @tab @code{events} @tab @code{for}
@item @code{function} @tab @code{global} @tab @code{if}
@item @code{methods} @tab @code{otherwise} @tab @code{parfor}
@item @code{persistent} @tab @code{properties} @tab @code{return}
@item @code{switch} @tab @code{try} @tab @code{until}
@item @code{unwind_protect} @tab @code{unwind_protect_cleanup} @tab @code{while}
@end multitable

The function @code{iskeyword} can be used to quickly check whether an
identifier is reserved by Octave.

@c iskeyword libinterp/parse-tree/lex.ll
@anchor{XREFiskeyword}
@deftypefn  {} {} iskeyword ()
@deftypefnx {} {} iskeyword (@var{name})
Return true if @var{name} is an Octave keyword.

If @var{name} is omitted, return a list of keywords.
@xseealso{@ref{XREFisvarname,,isvarname}, @ref{XREFexist,,exist}}
@end deftypefn


@node Parser
@section Parser
@cindex parser

The parser has a number of variables that affect its internal operation.
These variables are generally documented in the manual alongside the code that
they affect.

In addition, there are three non-specific parser customization functions.
@code{add_input_event_hook} can be used to schedule a user function for
periodic evaluation.  @code{remove_input_event_hook} will stop a user function
from being evaluated periodically.

@c add_input_event_hook libinterp/corefcn/input.cc
@anchor{XREFadd_input_event_hook}
@deftypefn  {} {@var{id} =} add_input_event_hook (@var{fcn})
@deftypefnx {} {@var{id} =} add_input_event_hook (@var{fcn}, @var{data})
Add the named function or function handle @var{fcn} to the list of functions
to call periodically when Octave is waiting for input.

The function should have the form

@example
@var{fcn} (@var{data})
@end example

If @var{data} is omitted, Octave calls the function without any arguments.

The returned identifier may be used to remove the function handle from the
list of input hook functions.
@xseealso{@ref{XREFremove_input_event_hook,,remove_input_event_hook}}
@end deftypefn


@c remove_input_event_hook libinterp/corefcn/input.cc
@anchor{XREFremove_input_event_hook}
@deftypefn  {} {} remove_input_event_hook (@var{name})
@deftypefnx {} {} remove_input_event_hook (@var{fcn_id})
Remove the named function or function handle with the given identifier
from the list of functions to call periodically when Octave is waiting
for input.
@xseealso{@ref{XREFadd_input_event_hook,,add_input_event_hook}}
@end deftypefn


Finally, when the parser cannot identify an input token it calls a particular
function to handle this.  By default, this is the internal function
@qcode{"__unimplemented__"} which makes suggestions about possible Octave
substitutes for @sc{matlab} functions.

@c missing_function_hook libinterp/corefcn/variables.cc
@anchor{XREFmissing_function_hook}
@deftypefn  {} {@var{val} =} missing_function_hook ()
@deftypefnx {} {@var{old_val} =} missing_function_hook (@var{new_val})
@deftypefnx {} {@var{old_val} =} missing_function_hook (@var{new_val}, "local")
Query or set the internal variable that specifies the function to call
to provide extra information when an unknown identifier is referenced.

When called from inside a function with the @qcode{"local"} option, the
variable is changed locally for the function and any subroutines it calls.
The original variable value is restored when exiting the function.
@xseealso{@ref{XREFmissing_component_hook,,missing_component_hook}}
@end deftypefn

