1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
####################################################################
# PLParser.awk #
####################################################################
# Parse a list of tokens and return an AST.
function plParse(returnAST, tokens,
leftBrackets,
rightBrackets,
separators,
####
i, j, key, p, stack, token) {
# Default parameters
if (!leftBrackets[0]) {
leftBrackets[0] = "(" # left parenthesis
leftBrackets[1] = "[" # left bracket
leftBrackets[2] = "{" # left brace
}
if (!rightBrackets[0]) {
rightBrackets[0] = ")" # right parenthesis
rightBrackets[1] = "]" # right bracket
rightBrackets[2] = "}" # right brace
}
if (!separators[0]) {
separators[0] = "," # comma
}
stack[p = 0] = 0
for (i = 0; i < length(tokens); i++) {
token = tokens[i]
if (belongsTo(token, leftBrackets))
stack[++p] = 0
else if (belongsTo(token, rightBrackets))
--p
else if (belongsTo(token, separators))
stack[p]++
else {
key = stack[0]
for (j = 1; j <= p; j++)
key = key SUBSEP stack[j]
returnAST[key] = token
}
}
}
|