.title AWK Language
.tabstop 6

Most of the AWK language features are supported. This documents shows notable language features that might be different from other implementations.

== Variable ==

A local variable and a global variable are supported if ASE_AWK_EXPLICIT is enabled. ASE_AWK_IMPLICIT is to enable a named variable. You may enable both options to support both types of variables. Either should be enabled for the language to be useful, however. 

A local variable can be declared at the top of each block before any statements are encountered. A global variable can be declared in any places outside a function and a pattern-action block.

{{{
global a, b;
global c;

BEGIN {
	local x, y;
	a = 30; x = 30; x = a + 40; print x; }
}
}}}

{{|
! Code
! Description
|-
| function a() { }
  BEGIN { ##-a=20;-## }
| A function and a named variable cannot have the same name. A named variable requires ASE_AWK_IMPLICIT to be enabled.
|-
| function a() { }

  BEGIN { 
  	local a;
  	a = 20; 
  }
| A local variable can shade the same function name. The deparsed output shows this.

  function a ()
  {
  }
  BEGIN {
  	local __l0;
  	__l0 = 20;
  }

  Local variable declaration requires ASE_AWK_EXPLICIT, though.
|-
| global a;
  function ##-a()-## { }
  
  function a() { }
  global  ##-a-##;
| A function and a global variable cannot have the same name.
|-
| function fn () { 
  	x = 20;
  	return x;
  }

  global x;

  BEGIN { 
  	x = 30;
  	print fn ();
  	print x; 
  }

| A global variable is visible after it is declared to the remaining part of the program. x inside fn is x named variable while x in BEGIN is a global variable.

  global __g17;
  function fn ()
  {
  	x = 20;
  	return x;
  }
  BEGIN {
  	__g17 = 30;
  	print fn ();
  	print __g17;
  }
|-
| global x;
  BEGIN {
  	x = 1;
  	{
  		local x;
  		x = 2;
  		{
  			local x;
  			x = 3;
  			print x;
  		}
  		print x;
  	}
  	print x;
  }
| A local variable can shade a global variable and a local variable at outer scope. 

  global __g17;

  BEGIN {
  	local __l0, __l1;
  	__g17 = 1;
  	{
  		__l0 = 2;
  		{
  			__l1 = 3;
  			print __l1;
  		}
  		print __l0;
  	}
  	print __g17;
  }
|}}


== Parameter ==

A parameter name can shade a enclosing function name. The following table shows the details.

{{|
! Code
! Description
|-
| function f(f) { print f; }
| A parameter name can be the same as the enclosing function name.
|-
| function f(f) { ##-f("hello")-##; }
| A resursive call to the function f is not possible as the third f is the parameter f.
|-
| function fn(f) { 
  	f = 20; 
  }
  BEGIN {
  	f = 50;
  	fn(100); 
  	print f; 
  }
| 50 is printed. The parameter f in fn doesn't affect the named variable f in BEGIN. The deparsed output shows this clearly.

  function fn (__p0)
  {
  	__p0 = 20;
  }
  BEGIN {
  	f = 50;
  	fn (100);
  	print f;
  }
|}}

== Statement Terminator ==
A statement must end with a semicolon. A new-line character is treated as whitespace. For this reason, no line continuator, a backslash, is supported. 

{{{
BEGIN { print "hello, world"; }
}}}


== Function ==
A blank is allowed between a function name and a left parenthesis. The left bracket for function body doesn't have to be on the same line as the function name and parameters.

{{{
function fn (x, y)
{
	return x + y;
}
BEGIN { print fn (10, 20); }
}}}

== Return ==
A return statement is allowed in BEGIN and END.
{{{
END { return 20; }
}}}

== Pattern-Action Block ==
ASE_AWK_BLOCKLESS enables the use of a action-less pattern-action block. Turning it off changes the parser behaviour to treat a block not following any patterns, BEGIN, END. 

{{{
BEGIN 
{ print "hello"; }
{ print "hello2"; }
}}}

In the code snippet above, the first block is associated with BEGIN while the second block is a patternless pattern-action block that matches any lines of input. It is the same as the following.

{{{
BEGIN {
        print "hello";
}

{
        print "hello2";
}
}}}

== Shift Operators ==

Turning on ASE_AWK_SHIFT enables the use of the shift operator for bit shifting. >> and << are the right and the left shift operator respectively.

{{{
BEGIN { print (0xFFFF >> 2);  print 0x00FF << 2; }
}}}