diff --git a/pkgs/development/interpreters/cg3/default.nix b/pkgs/development/interpreters/cg3/default.nix
new file mode 100644
index 000000000000..27db9bebcd0c
--- /dev/null
+++ b/pkgs/development/interpreters/cg3/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, runCommand
+, dieHook
+, cmake
+, icu
+, boost
+}:
+
+let cg3 = stdenv.mkDerivation rec {
+ pname = "cg3";
+ version = "1.3.7";
+
+ src = fetchFromGitHub {
+ owner = "GrammarSoft";
+ repo = "${pname}";
+ rev = "v${version}";
+ sha256 = "Ena3dGoZsXOIY6mbvnfI0H7QqRifoxWIBKQrK3yQSmY=";
+ };
+
+ nativeBuildInputs = [
+ cmake
+ ];
+
+ buildInputs = [
+ icu
+ boost
+ ];
+
+ doCheck = true;
+
+ passthru.tests.minimal = runCommand "${pname}-test" {
+ buildInputs = [
+ cg3
+ dieHook
+ ];
+ } ''
+ echo 'DELIMITERS = "."; ADD (tag) (*);' >grammar.cg3
+ printf '""\n\t"a" tag\n\n' >want.txt
+ printf '""\n\t"a"\n\n' | vislcg3 -g grammar.cg3 >got.txt
+ diff -s want.txt got.txt || die "Grammar application did not produce expected parse"
+ touch $out
+ '';
+
+
+ # TODO, consider optionals:
+ # - Enable tcmalloc unless darwin?
+ # - Enable python bindings?
+
+ meta = with lib; {
+ homepage = "https://github.com/GrammarSoft/cg3";
+ description = "Constraint Grammar interpreter, compiler and applicator vislcg3";
+ maintainers = with maintainers; [ unhammer ];
+ license = licenses.gpl3Plus;
+ platforms = platforms.all;
+ };
+};
+
+in
+ cg3
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 19d7b5f54c77..006c54fbb4b3 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -14587,6 +14587,8 @@ with pkgs;
ceptre = callPackage ../development/interpreters/ceptre { };
+ cg3 = callPackage ../development/interpreters/cg3 { };
+
cling = callPackage ../development/interpreters/cling { };
clips = callPackage ../development/interpreters/clips { };