qse/ase/doc/en/awk-lang.man
2007-12-27 21:03:41 +00:00

205 lines
4.3 KiB
Groff

.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; }
}}}