 0 400 400   %% Correctly defined arguments block
 2 400 401 + function y = foo (x)
 0 401 401 | % Some comment here
 0 401 401 | % And, maybe, here
 1 401 401 | 
 2 401 402 + arguments
 0 402 402 |     x (1,2) {mustBeReal(x)}
 0 402 401 | end
 1 401 401 | 
 0 401 401 | y = x*2;
 0 401 401 | arguments = 1;
 0 401 401 | y = y + arguments;
 0 401 400 | end
 1 400 400   
 0 400 400   %% No arguments block, "arguments" is used 
 0 400 400   %  as a variable name (identifier)
 0 400 400   % Prevent arguments from folding with an identifier
 2 400 401 + function y = foo (x)
 0 401 401 | % Some comment here
 0 401 401 | x = x + 1;
 0 401 401 | arguments = 10;
 0 401 401 | y = x + arguments;
 0 401 400 | end
 1 400 400   
 0 400 400   % Prevent arguments from folding with a number
 2 400 401 + function y = foo (x)
 0 401 401 | 4
 0 401 401 | arguments = 10;
 0 401 401 | y = x + arguments;
 0 401 400 | end
 1 400 400   
 0 400 400   % With a double quote string
 2 400 401 + function y = foo (x)
 0 401 401 | "test"
 0 401 401 | arguments = 10;
 0 401 401 | y = x + arguments;
 0 401 400 | end
 1 400 400   
 0 400 400   % With a string
 2 400 401 + function y = foo (x)
 0 401 401 | 'test'
 0 401 401 | arguments = 10;
 0 401 401 | y = x + arguments;
 0 401 400 | end
 1 400 400   
 0 400 400   % With a keyword
 2 400 401 + function y = foo (x)
 2 401 402 + if x == 0;
 0 402 402 |     return 0;
 0 402 401 | end
 0 401 401 | arguments = 10;
 0 401 401 | y = x + arguments;
 0 401 400 | end
 1 400 400   
 0 400 400   % With an operator (illegal syntax)
 2 400 401 + function y = foo (x)
 0 401 401 | *
 0 401 401 | arguments = 10;
 0 401 401 | y = x + arguments;
 0 401 400 | end
 1 400 400   
 0 400 400   % Semicolon is equivalent to a comment
 2 400 401 + function y = foo(x)
 0 401 401 | ;;;;;;;
 2 401 402 + arguments
 0 402 402 |     x
 0 402 401 | end
 0 401 401 | y = x + 2;
 0 401 400 | end
 1 400 400   
 0 400 400   % Arguments block is illegal in nested functions,
 0 400 400   % but lexer should process it anyway
 2 400 401 + function y = foo (x)
 2 401 402 + arguments
 0 402 402 |     x (1,2) {mustBeReal(x)}
 0 402 401 | end
 1 401 401 | 
 2 401 402 +     function y = foo (x)
 2 402 403 +     arguments
 0 403 403 |         x (1,2) {mustBeReal(x)}
 0 403 402 |     end
 0 402 402 |     var = 0;
 0 402 402 |     arguments = 5;
 0 402 402 |     y = arguments + x;
 0 402 401 |     end
 1 401 401 | 
 0 401 401 | % Use as a variable, just in case
 0 401 401 | arguments = 10;
 0 401 400 | end
 1 400 400   
 0 400 400   % Erroneous use of arguments block
 2 400 401 + function y = foo(x)
 0 401 401 | % Some comment
 0 401 401 | x = x + 1;
 0 401 401 | arguments
 0 401 401 |     x
 0 401 400 | end
 0 400 400   y = x;
 0 400 3ff   end
 1 3ff 3ff   
 0 3ff 3ff   % "arguments" is an argument name too
 2 3ff 400 + function r = foo(x, arguments)
 2 400 401 + arguments
 0 401 401 |     x
 0 401 401 |     arguments
 0 401 400 | end
 0 400 400   r = bar(x, arguments{:});
 0 400 3ff   end
 1 3ff 3ff   
 0 3ff 3ff   % Multiple arguments blocks
 2 3ff 400 + function [a, b] = foo(x, y, varargin)
 1 400 400   
 2 400 401 + arguments(Input)
 0 401 401 |     x (1,4) {mustBeReal}
 0 401 401 |     y (1,:) {mustBeInteger} = x(2:end);
 0 401 400 | end
 1 400 400   
 2 400 401 + arguments(Input, Repeating)
 0 401 401 |     varargin
 0 401 400 | end
 1 400 400   
 2 400 401 + arguments(Output)
 0 401 401 |     a (1,1) {mustBeReal}
 0 401 401 |     b (1,1) {mustBeNonNegative}
 0 401 400 | end
 1 400 400   
 0 400 400   var = 10;
 0 400 400   arguments = {"now", "it's", "variable"};
 1 400 400   
 0 400 400   [a, b] = bar(x, y, arguments);
 1 400 400   
 0 400 3ff   end
 1 3ff 3ff   
 0 3ff 3ff   % One line function with arguments block.
 0 3ff 3ff   % This code style is rarely used (if at all), but the
 0 3ff 3ff   % lexer shouldn't break
 0 3ff 3ff   function y = foo(x); arguments; x; end; y = bar(x); end
 1 3ff 3ff   