llvm-journey

LLVM Journey
git clone git://0xff.ir/g/llvm-journey.git
Log | Files | Refs | README | LICENSE

commit 6b606fbfcb6332ea426ff171f6526ecb863cff6f
parent 8ddcb6f0b36378a848efe265869639d7a69b7eb5
Author: Mohammad-Reza Nabipoor <m.nabipoor@yahoo.com>
Date:   Fri,  7 Aug 2020 03:25:07 +0430

Add example of usage for kal::lex

Diffstat:
M.gitignore | 1+
MMakefile | 31+++++++++++++++++++++++++++----
MREADME.md | 140+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/kaleidoscope_lexer.ex.cpp | 44++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 212 insertions(+), 4 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,3 +1,4 @@ *.o *.test +*.ex diff --git a/Makefile b/Makefile @@ -1,16 +1,28 @@ CXXFLAGS += -Wall -Wextra -O3 -std=c++14 -tflags += -I. -Itests +tflags += -I. -Itests # flags for tests +eflags += -I. # flags for examples catch2 = tests/catch2/catch.hpp +# tests tbin = kaleidoscope_lexer.test -.PHONY: all tests +# examples +ebin = kaleidoscope_lexer.ex + +.PHONY: all all: tests + +.PHONY: tests tests: $(tbin) $(foreach t,$(tbin),./$(t);) +.PHONY: examples +examples: $(ebin) + +#--- tests + kaleidoscope_lexer.test.o: CXXFLAGS += $(tflags) kaleidoscope_lexer.test.o: kaleidoscope_lexer.hpp $(catch2) kaleidoscope_lexer.test.o: tests/kaleidoscope_lexer.test.cpp @@ -18,10 +30,21 @@ kaleidoscope_lexer.test.o: tests/kaleidoscope_lexer.test.cpp kaleidoscope_lexer.test: kaleidoscope_lexer.test.o $(CXX) $(CXXFLAGS) -o $@ $< $(LDFLAGS) +#--- examples + +kaleidoscope_lexer.ex.o: CXXFLAGS += $(eflags) +kaleidoscope_lexer.ex.o: kaleidoscope_lexer.hpp +kaleidoscope_lexer.ex.o: examples/kaleidoscope_lexer.ex.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< +kaleidoscope_lexer.ex: kaleidoscope_lexer.ex.o + $(CXX) $(CXXFLAGS) -o $@ $< $(LDFLAGS) + +#--- + .PHONY: fmt -fmt: *.[ch]pp tests/*.[ch]pp +fmt: *.[ch]pp tests/*.[ch]pp examples/*.[ch]pp clang-format -i $^ .PHONY: clean clean: - $(RM) *.o $(tbin) + $(RM) *.o $(tbin) $(ebin) diff --git a/README.md b/README.md @@ -38,3 +38,143 @@ the following arguments: #### Return value Returns the end of input range (`l`). + +#### Example of usage + +File: `examples/ex_kaleidoscope_lexer.cpp` + +```c++ +#include <iostream> +#include <string> + +#include "kaleidoscope_lexer.hpp" + +int +main() +{ + std::string source{ + R"( +extern sin(arg); # C standard library function + +sin(3.14159265/2) +)" + }; + auto sBegin = source.cbegin(); + auto sEnd = source.cend(); + + kal::lex( + sBegin, sEnd, [&](kal::TkType type, const auto& tkBegin, const auto& tkEnd) { + auto b = std::distance(sBegin, tkBegin); + auto e = std::distance(sBegin, tkEnd); + + // clang-format off + + std::cout << "Token{" + << "\n /*type*/ kal::TkType::" + << kal::TKTYPE_STR[static_cast<int>(type)] + << ",\n /*begin*/ " << b + << ",\n /*end*/ " << e + << ",\n /*str*/ \"" << source.substr(b, e - b) << '"'; + + // clang-format on + + if (type == kal::TkType::Num) + std::cout << ",\n /*num*/ " << source.substr(b, e - b); + + std::cout << ",\n}\n"; + }); + + return 0; +} +``` + +Output of the program: + +```plain +Token{ + /*type*/ kal::TkType::Extern, + /*begin*/ 1, + /*end*/ 7, + /*str*/ "extern", +} +Token{ + /*type*/ kal::TkType::Id, + /*begin*/ 8, + /*end*/ 11, + /*str*/ "sin", +} +Token{ + /*type*/ kal::TkType::Etc, + /*begin*/ 11, + /*end*/ 12, + /*str*/ "(", +} +Token{ + /*type*/ kal::TkType::Id, + /*begin*/ 12, + /*end*/ 15, + /*str*/ "arg", +} +Token{ + /*type*/ kal::TkType::Etc, + /*begin*/ 15, + /*end*/ 16, + /*str*/ ")", +} +Token{ + /*type*/ kal::TkType::Etc, + /*begin*/ 16, + /*end*/ 17, + /*str*/ ";", +} +Token{ + /*type*/ kal::TkType::Comment, + /*begin*/ 18, + /*end*/ 47, + /*str*/ "# C standard library function", +} +Token{ + /*type*/ kal::TkType::Id, + /*begin*/ 49, + /*end*/ 52, + /*str*/ "sin", +} +Token{ + /*type*/ kal::TkType::Etc, + /*begin*/ 52, + /*end*/ 53, + /*str*/ "(", +} +Token{ + /*type*/ kal::TkType::Num, + /*begin*/ 53, + /*end*/ 63, + /*str*/ "3.14159265", + /*num*/ 3.14159265, +} +Token{ + /*type*/ kal::TkType::Etc, + /*begin*/ 63, + /*end*/ 64, + /*str*/ "/", +} +Token{ + /*type*/ kal::TkType::Num, + /*begin*/ 64, + /*end*/ 65, + /*str*/ "2", + /*num*/ 2, +} +Token{ + /*type*/ kal::TkType::Etc, + /*begin*/ 65, + /*end*/ 66, + /*str*/ ")", +} +Token{ + /*type*/ kal::TkType::END, + /*begin*/ 67, + /*end*/ 67, + /*str*/ "", +} +``` diff --git a/examples/kaleidoscope_lexer.ex.cpp b/examples/kaleidoscope_lexer.ex.cpp @@ -0,0 +1,44 @@ + +#include <iostream> +#include <string> + +#include "kaleidoscope_lexer.hpp" + +int +main() +{ + std::string source{ + R"( +extern sin(arg); # C standard library function + +sin(3.14159265/2) +)" + }; + auto sBegin = source.cbegin(); + auto sEnd = source.cend(); + + kal::lex(sBegin, + sEnd, + [&](kal::TkType type, const auto& tkBegin, const auto& tkEnd) { + auto b = std::distance(sBegin, tkBegin); + auto e = std::distance(sBegin, tkEnd); + + // clang-format off + + std::cout << "Token{" + << "\n /*type*/ kal::TkType::" + << kal::TKTYPE_STR[static_cast<int>(type)] + << ",\n /*begin*/ " << b + << ",\n /*end*/ " << e + << ",\n /*str*/ \"" << source.substr(b, e - b) << '"'; + + // clang-format on + + if (type == kal::TkType::Num) + std::cout << ",\n /*num*/ " << source.substr(b, e - b); + + std::cout << ",\n}\n"; + }); + + return 0; +}