PageRenderTime 48ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/src/hudvark.sh

http://github.com/jimmyskull/Hudvark
Shell | 171 lines | 132 code | 33 blank | 6 comment | 13 complexity | c43a7e7a926bf6beb940da6ca56fe554 MD5 | raw file
  1. #!/bin/bash
  2. # Mostrar ajuda
  3. function sintaxe
  4. {
  5. echo "sintaxe: ./hudvark entrada.b [-o executavel]"
  6. echo "ex: ./bfc hello.b -o HelloWorld"
  7. echo -e "\t-o Definir o nome do arquivo executável gerado."
  8. echo -e "\t-s Apenas compilar, não fazer o link."
  9. echo -e "\t-v Mostrar detalhes do que está acontecendo."
  10. echo -e "\t-vv Mostrar muitos detalhes do que está acontecendo."
  11. echo -e "\t-vvv Mais ainda."
  12. echo -e "\t-V Mostrar versão atual compilador instalado."
  13. echo ""
  14. }
  15. # Imprimir um texto em negrito
  16. # echobf "Exemplo"
  17. function echobf {
  18. echo -e "\033[0;1m$1\033[0m"
  19. }
  20. versao=v1.0
  21. STR_VERSAO="Hudvärk: Compilador brainfuck $versao\nPaulo Roberto Urio (Outubro 2011)"
  22. RM="`which rm` -f"
  23. FONTE=""
  24. OUTPUT=a.out
  25. DEBUG=0
  26. NAO_LINKAR=0
  27. # Imprime uma mensagem de acordo com a 'verbosidade' definida.
  28. function debugbf {
  29. if [ $1 -gt $DEBUG ]; then
  30. echobf "$2"
  31. fi
  32. }
  33. # Imprime uma mensagem de acordo com a 'verbosidade' definida.
  34. function debug {
  35. if [ "$1" -le "$DEBUG" ]; then
  36. echo -e "$2\033[0m"
  37. fi
  38. }
  39. function mensagem {
  40. debug 1 "\033[31m* \033[32m$1"
  41. }
  42. function passo {
  43. mensagem "Passo $1\033[37m:\033[35m $2"
  44. }
  45. function erro {
  46. debug 0 "\033[31m* $1"
  47. }
  48. function checkret {
  49. ret="$?"
  50. sync
  51. if [ "$ret" -ne "0" ]; then
  52. if [ "$ret" -ne "127" ]; then
  53. erro "Erro ao compilar (Código $ret)."
  54. exit -1
  55. fi
  56. fi
  57. }
  58. function executar {
  59. debug 2 "$1"
  60. /bin/bash -c "$1"
  61. checkret
  62. }
  63. while [ "$1" != "" ]; do
  64. case $1 in
  65. -o ) shift
  66. OUTPUT=$1
  67. if [ "$OUTPUT" = "" ]; then
  68. echo "Você deve definir um arquivo de saída."
  69. xit 1
  70. fi
  71. ;;
  72. -s )
  73. NAO_LINKAR=1
  74. ;;
  75. -v )
  76. DEBUG=1
  77. ;;
  78. -vv )
  79. DEBUG=2
  80. ;;
  81. -vvv )
  82. DEBUG=3
  83. ;;
  84. -V | --versao )
  85. echo -e "$STR_VERSAO"
  86. exit 0
  87. ;;
  88. -h | --help ) sintaxe
  89. exit
  90. ;;
  91. * ) if [ "$FONTE" != "" ]; then
  92. echo "Só é possível definir um arquivo fonte."
  93. exit 1
  94. fi
  95. FONTE="$1"
  96. ;;
  97. esac
  98. shift
  99. done
  100. debug 1 "$STR_VERSAO"
  101. EXT_OUT=bof
  102. OUT_PRE=bffiltro.$EXT_OUT
  103. OUT_COD=bfcod.s
  104. OBJ_COD=bfcod.o
  105. ANALISADOR=`which dvarkan`
  106. checkret
  107. PROCESSADOR=`which dvarkpp`
  108. checkret
  109. if [[ "$FONTE" = "" ]]; then
  110. echo -e "Nenhum arquivo-fonte definido.\n"
  111. sintaxe
  112. exit 1
  113. fi
  114. passo 1 "Pré-processamento"
  115. executar "dvarkpp < $FONTE > $OUT_PRE"
  116. if [ "$?" != "0" ]; then
  117. erro "[Hudvärk] Erro ao pré-processar."
  118. exit 1
  119. fi
  120. passo 2 "Análise léxica"
  121. passo 3 "Análise sintática"
  122. passo 4 "Análise semântica"
  123. passo 5 "Geração de código"
  124. passo 6 "Otimização de código"
  125. executar "dvarkan < $OUT_PRE > $OUT_COD"
  126. if [[ "$NAO_LINKAR" = "1" ]]; then
  127. executar "$RM bffiltro.bof"
  128. mensagem "Arquivo assembly: $OUT_COD"
  129. exit 0
  130. fi
  131. passo 7 "Geração do código final"
  132. as=`which as`
  133. ld=`which ld`
  134. executar "$as --64 --noexecstack -mmnemonic=att $OUT_COD -o $OBJ_COD"
  135. executar "$ld $OBJ_COD -o $OUTPUT"
  136. mensagem "Removendo arquivos auxiliares"
  137. executar "$RM $OUT_PRE $OBJ_COD $OUT_COD"
  138. mensagem "Arquivo gerado: ./$OUTPUT"