function append(line) { if (doc) { doc = doc "\n" } doc = doc line } function output(name, type) { print "↙ " type print name print doc exit } function reset() { doc = "" } BEGIN { RE_ANY = "(.*)" RE_CONST = "([_A-Z][_0-9A-Z]*)" RE_SET = "=.*" RE_SPACE = "[[:space:]]" RE_SPACES = RE_SPACE "*" RE_VAR = "([_a-z][_0-9a-z]*)" RE_BEGIN = "^" RE_END = RE_SPACES "$" RE_FUNC = RE_SPACES "\\(" RE_SPACES "\\)" RE_SPACES "{" RE_ALIAS = RE_BEGIN "#=" RE_SPACES RE_VAR RE_END RE_CLOSE = RE_BEGIN "}" RE_SPACES RE_END RE_CONSTANT = RE_BEGIN RE_CONST RE_SET RE_END RE_DOC = RE_BEGIN "#" RE_SPACE RE_ANY RE_END RE_FUNCTION = RE_BEGIN RE_VAR RE_FUNC RE_END RE_MODULE = RE_BEGIN "#." RE_SPACES RE_ANY RE_END RE_SHEBANG = RE_BEGIN "#!" RE_SPACES RE_ANY RE_END RE_VARIABLE = RE_BEGIN RE_VAR RE_SET RE_END alias = 0 reset() module = 0 } { if (action == "alias") { if (match($0, RE_ALIAS, m)) { append(m[1]) } else if (match($0, RE_FUNCTION, m)) { n = split(doc, array, "\n") for (i = 1; i<= n; i++) { print array[i] " = " m[1] } reset() } else { reset() } } else if (action == "doc") { # doc if (match($0, RE_SHEBANG, m)) { append("! " m[1]) } else if (match($0, RE_DOC, m)) { append(m[1]) } else if (match($0, RE_ALIAS, m)) { append("= " m[1]) if (m[1] == target) { alias = 1 } # set } else if (match($0, RE_CONSTANT, m)) { if (m[1] == target) { output(m[1], "constant") } else { reset() } } else if (match($0, RE_VARIABLE, m)) { if (m[1] == target) { output(m[1], "variable") } else { reset() } # others } else if (match($0, RE_MODULE, m)) { reset() if (m[1] == target) { module = 1 } } else if (match($0, RE_FUNCTION, m)) { if (alias) { print "= " target output(m[1], "function") } else if (m[1] == target) { output(target, "function") } else { reset() } } else if (match($0, RE_CLOSE, m)) { # TODO } else { if (module) { output(target, "module") } else { reset() } } } }