LINUX.ORG.RU

компилятор с использованием Flex, Bison и LLVM


0

2

Здравствуйте. Всё одно и тоже. Прочитав много информации о компиляторах и прочее очень много понял. А так как времени мало и надо что то делать. Вообщем вот. ТУт есть пример http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/ компилятор с использованием Flex, Bison и LLVM. Там же есть файлы с кодом. https://github.com/lsegal/my_toy_compiler Но я всё не могу понять как это заставить работать, через что открыть или.(очень бы хотелось на подробное обьяснение) Что бы увидеть работу этого написанного компилятора. Естественно попробую переделать его под свое задания, что бы переводил с Си в Паскаль, или наоборот. Троллинг приветствуется. Ваш неуч=)


make all надо сделать. Но у меня с ходу не скомпилилось, ибо какой-то хедер переместили в llvm.

Про make просвещаться начинать тут: http://ru.wikipedia.org/wiki/Make

Norgat ★★★★★
()

Поставь llvm-2.9 и ... Только фигню генерит (сначала + потом *)

kdev
()

Открываешь терминал (ставишь cygwin, если Windows), пишешь:

$ git clone https://github.com/lsegal/my_toy_compiler
Cloning into my_toy_compiler...
remote: Counting objects: 63, done.
remote: Compressing objects: 100% (35/35), done.
remote: Total 63 (delta 35), reused 51 (delta 27)
Unpacking objects: 100% (63/63), done.
$ cd my_toy_compiler
$ ls
codegen.cpp  example.txt  Makefile  parser.y
codegen.h    main.cpp     node.h    tokens.l
$ make all
bison -d -o parser.cpp parser.y
parser.y: конфликты: 24 сдвига/вывода
g++ -c `llvm-config --cppflags core jit native` -o parser.o parser.cpp
g++ -c `llvm-config --cppflags core jit native` -o codegen.o codegen.cpp
g++ -c `llvm-config --cppflags core jit native` -o main.o main.cpp
flex -o tokens.cpp tokens.l parser.hpp
g++ -c `llvm-config --cppflags core jit native` -o tokens.o tokens.cpp
g++ -o parser `llvm-config --ldflags core jit native` parser.o codegen.o main.o tokens.o  `llvm-config --libs core jit native`
$ ls
codegen.cpp  example.txt  Makefile  parser.cpp  parser.y    tokens.o
codegen.h    main.cpp     node.h    parser.hpp  tokens.cpp
codegen.o    main.o       parser    parser.o    tokens.l
$ echo "int fn(int a, int b) { a * 2 + b * 4 }" | ./parser
0x8eaa3c0
Generating code...
Generating code for 20NFunctionDeclaration
Creating variable declaration int a
Creating variable declaration int b
Generating code for 20NExpressionStatement
Generating code for 15NBinaryOperator
Creating binary operation 276
Creating binary operation 274
Creating binary operation 276
Creating integer: 4
Creating identifier reference: b
Creating integer: 2
Creating identifier reference: a
Creating block
Creating function: fn
Creating block
Code is generated.
; ModuleID = 'main'

define internal void @main() {
entry:
  ret void
}

define internal i64 @fn(i64, i64) {
entry:
  %a = alloca i64
  %b = alloca i64
  %2 = load i64* %b
  %3 = mul i64 %2, 4
  %4 = add i64 2, %3
  %5 = load i64* %a
  %6 = mul i64 %5, %4
  ret void
}
Running code...
Code was run.

Должны быть установлены GCC, LLVM (2.9), git, make (man gcc, man llvmc, man git, man make, соответственно).

quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.