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:
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;
+}