#! /usr/bin/gawk -f # Last edited on 2004-12-30 20:51:31 by stolfi # # uso: gawk -f word2arc -v arqarcos="fileoutarc" fileout # BEGIN { # CONSTANTES DE VALORES cjminus = "abcdefghijklmnopqrstuvwxyzàáâãçéêíóôõúü" cjmaius = "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÇÉÊÍÓÔÕÚÜ" cjabre = "{[(`'\"" cjfecha = "}])´'\"" # CONSTANTES DE FORMATO PADRAO capit = "[" cjmaius "][" cjminus "]*" descapit = "[" cjminus "]+" couscapit = "[" cjmaius cjminus "][" cjminus "]*" minuscula1 = descapit "[.ªº]?([-'´]" descapit "[.]?)*" # ex. casa, beija-flor, d'água, cel., dec.-lei, nº maiuscula1 = capit "[.ªº]?([-'´]" descapit "[.]?)*" # ex. Casa, Maria, D'água, Dr., Exª simbolo1 = "[&]" simbolo2 = descapit capit # ex. kW, kiloWatts abrev = "([" cjmaius "][" cjmaius "]+[.])+" # ex. AA., EE., VV.AA. ordinal = "[0-9]+[ªºao][s]?" # ex. 1ª, 12º sigla1 = "(" capit ")+([-/](" capit ")+)*" # ex. Detran, CPqD, CNPq, PFL-ES, S/A sigla2 = couscapit "[.ªº](" couscapit "[.ªº])+" # ex. a.C., P.S., i.e., V.ExªRevª, V.Sª, V.Sas. minuscula2 = descapit "[-]" sigla1 # ex. ex-Raimundo, pró-CPI maiuscula2 = capit "[-]" sigla1 # ex. Ex-Raimundos moeda = "[A-Z£]+[$]" numero = "[-+]?[0-9][0-9]?[0-9]?([.]?[0-9][0-9][0-9])*([,][0-9]+)?" codigo = "[0-9]+([-./][0-9]+)+" # inclui tambem data e numeros fracionarios email = "[A-Za-z0-9_]+([.][A-Za-z0-9_]+)?[@][A-Za-z0-9_]+([.][A-Za-z0-9_]+)*" site = "([A-Za-z]+[:][/][/])?[A-Za-z0-9_]+([.][A-Za-z0-9_]+)*" reticencias = "[.][.][.]" travessao = "[-][-]" maiuscula = "(" maiuscula1 "|" maiuscula2 ")" minuscula = "(" minuscula1 "|" minuscula2 ")" seqfrase = "(" minuscula "|" reticencias "|[,;:?!%&])" preinifrase = "(" reticencias "|[\\[\\-({\"'´`.!?])" abrevponto = ".*[^.][.]" pontuacao = "(" reticencias "|" travessao "|[(){}?!.,:;&%'´`\"\\[\\]\\-])" palvalida = "(" minuscula "|" maiuscula "|" simbolo2 "|" abrev "|" ordinal "|" \ sigla1 "|" sigla2 "|" moeda "|" numero "|" codigo "|" email "|" site "|" \ pontuacao ")" palvalidapto = palvalida "[.]?" abrepar = "[{\\[(`'\"]" fechapar = "[}\\])´'\"]" marcamaius = "M" # marca de palavra maiuscula marcaminus = "m" # marca de palavra nao maiuscula marcainicio = "i" # marca de possivel inicio de frase marcameio = "m" # marca de meio de frase passo = 3 # indica de quanto em quanto se aumenta o no' # VARIAVEIS palavra = "" # guarda ultima palavra lida - linha anterior marca = marcaminus # indica se palavra e' maiuscula ou nao posicao = marcainicio # indica se e' inicio de frase ou meio no = 1 # indica o no' atual nivel = 0 # indica o nivel de parentisacao foifecha = 0 # indica se palavra anterior foi fechamento de parentisacao parentese[0] = "" # pilha indicando o marcador de cada nivel # arqarcos # guarda o nome do arquivo onde serao impressos os arcos master # somente um para cada palavra de entrada } ($0 !~ "^" palvalidapto "$") { # se nao e' palavra valida seguida ou nao de pto if ($0 != "") erro("palavra invalida") } ($0 ~ "^[^.]*[.][.]$") { # se e' abrev valida mas tem um p. final a mais if ($0 ~ "^" palvalidapto "$") # impede duplicacao de mensagem de erro para lixo.. erro("palavra invalida") } // { # Caso especial da primeira linha if (palavra == "") { palavra = $0 next } } ($0 !~ "^" seqfrase "$") { # abreviatura seguida de possivel inicio de frase if (palavra ~ "^" abrevponto "$") # palavra termina em ponto { if (palavra ~ "^" palvalida "$") # palavra e' abreviatura { if (palavra ~ "^" maiuscula "$") # gera palavra descapitalizada se for maiuscula { marca = marcamaius printf("%05d %05d %s %s %s\n", no, no+2*passo, descapitaliza(palavra), palavra, marcaminus marca posicao nivel) printf("%05d %05d %s %s %s\n", no, no+passo, descapitaliza(palavra), palavra, marcaminus marca posicao nivel) } printf("%05d %05d %s %s %s\n", no, no+2*passo, palavra, palavra, marca marca posicao nivel) printf("%05d %05d %s %s %s\n", no, no+passo, palavra, palavra, marca marca posicao nivel) } palsempto = substr(palavra,1,length(palavra)-1) if (palsempto ~ "^" maiuscula "$") # gera palavra descapitalizada se for maiuscula { marca = marcamaius printf("%05d %05d %s %s %s\n", no, no+passo, descapitaliza(palsempto), palsempto, marcaminus marca posicao nivel) } printf("%05d %05d %s %s %s\n", no, no+passo, palsempto, palsempto, marca marca posicao nivel) printf("%05d %05d %s %s %s\n", no+passo, no+2*passo, ".", ".", marcaminus marcaminus marcameio nivel) posicao = marcainicio marca = marcaminus if (eabre(palavra) == 1) nivel = abre(palavra) imprime_arco(no, no+2*passo, palavra, nivel) palavra = $0 foifecha = 0 # reseta flag indicador de fechamento de parentisacao if (efecha(palavra) == 1) nivel = fecha(palavra) no += 2*passo next } } // { if (palavra ~ "^" maiuscula "$") # escreve palavra descapitalizada { marca = marcamaius printf("%05d %05d %s %s %s\n", no, no+passo, descapitaliza(palavra), palavra, marcaminus marca posicao nivel) } printf("%05d %05d %s %s %s\n", no, no+passo, palavra, palavra, marca marca posicao nivel) if (palavra ~ "^" preinifrase "$") # provavel inicio de frase a seguir posicao = marcainicio else posicao = marcameio marca = marcaminus if (eabre(palavra) == 1) nivel = abre(palavra) imprime_arco(no, no+passo, palavra, nivel) palavra = $0 foifecha = 0 # reseta flag indicador de fechamento de parentisacao if (efecha(palavra) == 1) nivel = fecha(palavra) no += passo } function parfecha(caractere) { return substr(cjfecha,index(cjabre,caractere),1) } function efecha(palav) { for (i = nivel; i > 0; i--) if (palav == parfecha(parentese[i])) return 1 return 0 } function eabre(palav) { if (foifecha == 1) return 0 if (palav ~ "^" abrepar "$") return 1 - efecha(palav) else return 0 } function fecha(palav) { foifecha = 1 for (i = nivel; i > 0; i--) if (palav == parfecha(parentese[i])) { delete parentese[i] return i-1 } else delete parentese[i] } function abre(palav) { parentese[++nivel] = palav return nivel } function convminus(letra) { return substr(cjminus,index(cjmaius,letra),1) } function descapitaliza(palav) { return convminus(substr(palav,1,1)) substr(palav,2) } function imprime_arco(no_ini,no_fim,palav,niv) { if (arqarcos != "") if (palav == "'") printf("arco(%05d,%05d,''%s',%d).\n", no_ini, no_fim, palav, niv) > arqarcos else printf("arco(%05d,%05d,'%s',%d).\n", no_ini, no_fim, palav, niv) > arqarcos } function erro(msg) { printf "palavra %d - %s: %s\n", NR, msg, $0 > "/dev/stderr"; }