#! /usr/bin/gawk -f # Last edited on 2004-12-30 20:40:14 by stolfi # check-morf-format - VERIFICA O FORMATO DO DICIONARIO MORFOLOGICO # # Para checar arquivo de dicionario padrao completo (palavra classe canonica) # uso: check-morf-format mrf1 mrf2 mrf3 mrf4 ... BEGIN { # FORMATO DE PADROES MORFOLOGICOS clit = "cp" # clitico pronominal classemorf = clit # classe morfologica # FORMATO DE PADROES LEXICOS pron_at = "pna[di]es[123][fm][ps]" # pronome atono enclitico pron = pron_at # pronome classelex = pron # classe lexica lexico = "[^,;()]+[,][a-z0-9]+[,][^,;()]+" padrao = "[(]" lexico "([;]" lexico ")?[)]" # CONSTANTES morf = 1 # morfologico lex = 2 # lexico # VARIAVEIS prev = "" # nome do arquivo anterior ja lido erros = 0 # flag indicador de erros para o atual arquivo } # CODIGO DO PROGRAMA FILENAME != prev { # se esta iniciando novo arquivo de dicionario close(prev) # fecha arquivo ja lido prev = FILENAME # guarda nome deste arquivo erros = 0 # zera flag de erros para este arquivo } // { gsub(/[\r]+/,"") # retira carriage return se arquivo eh do dos gsub(/[ \t]+/," ") # converte espacos e tabs multiplos para um so espaco gsub(/^[ ]/,"") # retira espaco no inicio da linha gsub(/[ ]$/,"") # retira espaco no fim da linha printf("%s\n", $0) # imprime a linha modificada } /^[#]/ { next; } # ignora comentarios /^$/ { next; } # ignora linha em branco (NF != 3){ # formato do lexico deve ser: morfema classemorf composicao erro("número de campos diferente de 3") } (NF == 3) { # verifica se a(s) classe(s) morfologica indicada(s) existe(m) if (verifclasse($2,morf)==0) erro("classe morfologica " $2 " inexistente") else if ($2 ~ "^" clit "$") # se e' clitico pronominal if ($3 !~ "^" padrao "$") # verifica formato da composicao do clitico pronominal erro("formato incorreto da composicao do clitico pronominal") else # verifica classes da composicao do clitico pronominal { classe1 = gensub(/[(].+[,](.+)[,].+([;].+)?[)]/,"\\1","g",$3) # classe do primeiro lexico classe2 = gensub(/[(].+([;].+[,](.+)[,].+)?[)]/,"\\2","g",$3) # classe do segundo lexico (se existe) if (verifclasse(classe1,lex)==0) erro("classe lexica " classe1 " inexistente") if (classe2 != "") if (verifclasse(classe2,lex)==0) erro("classe lexica " classe2 " inexistente") } } function erro(msg) { if (erros == 0) { printf "Arquivo %s:\n", FILENAME > "/dev/stderr" erros = 1 } printf "linha %d - %s: %s\n", FNR, msg, $0 > "/dev/stderr"; } function verifclasse(categoria,tipo) { if (tipo == morf) return (categoria ~ "^" classemorf "$") else if (tipo == lex) return (categoria ~ "^" classelex "$") }