From 3417ad5adbf6a20257538697c0b6b874cfcc4b9a Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 17 Dec 2013 13:14:41 -0800 Subject: [PATCH] Add runtime specs --- TreeSitter.xcodeproj/project.pbxproj | 240 ++++++++++-- ...specs.xcscheme => compiler_specs.xcscheme} | 8 +- .../xcschemes/runtime_specs.xcscheme | 86 +++++ include/runtime.h | 71 ++++ spec/{ => compiler}/spec_helper.cpp | 0 spec/{ => compiler}/spec_helper.h | 2 +- spec/fixtures/parsers/arithmetic.c | 343 +++++------------- spec/runtime/arithmetic_spec.cpp | 10 + src/compiler/code_gen/c_code.cpp | 25 +- src/runtime/parser.c | 42 +++ src/runtime/tree.c | 9 + 11 files changed, 542 insertions(+), 294 deletions(-) rename TreeSitter.xcodeproj/xcshareddata/xcschemes/{specs.xcscheme => compiler_specs.xcscheme} (94%) create mode 100644 TreeSitter.xcodeproj/xcshareddata/xcschemes/runtime_specs.xcscheme create mode 100644 include/runtime.h rename spec/{ => compiler}/spec_helper.cpp (100%) rename spec/{ => compiler}/spec_helper.h (95%) create mode 100644 spec/runtime/arithmetic_spec.cpp create mode 100644 src/runtime/parser.c create mode 100644 src/runtime/tree.c diff --git a/TreeSitter.xcodeproj/project.pbxproj b/TreeSitter.xcodeproj/project.pbxproj index 2bd7c233..9280e21b 100644 --- a/TreeSitter.xcodeproj/project.pbxproj +++ b/TreeSitter.xcodeproj/project.pbxproj @@ -14,23 +14,45 @@ 12130614182C3A1700FCF928 /* seq.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130612182C3A1700FCF928 /* seq.cpp */; }; 12130617182C3D2900FCF928 /* string.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130615182C3D2900FCF928 /* string.cpp */; }; 1213061B182C84DF00FCF928 /* item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130619182C84DF00FCF928 /* item.cpp */; }; - 1213061F182C857100FCF928 /* item_set_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1213061D182C857100FCF928 /* item_set_spec.cpp */; }; 12130622182C85D300FCF928 /* item_set.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130620182C85D300FCF928 /* item_set.cpp */; }; 1214930E181E200B008E9BDA /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 121492E9181E200B008E9BDA /* main.cpp */; }; - 1214930F181E200B008E9BDA /* rules_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 121492EA181E200B008E9BDA /* rules_spec.cpp */; }; - 12512093182F307C00C9B56A /* parse_table_builder_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12512092182F307C00C9B56A /* parse_table_builder_spec.cpp */; }; 1251209B1830145300C9B56A /* rule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1251209A1830145300C9B56A /* rule.cpp */; }; 125120A018307DEC00C9B56A /* parse_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1251209E18307DEC00C9B56A /* parse_table.cpp */; }; 125120A4183083BD00C9B56A /* arithmetic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 125120A3183083BD00C9B56A /* arithmetic.cpp */; }; 129D242C183EB1EB00FE9F71 /* parse_table_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 129D242A183EB1EB00FE9F71 /* parse_table_builder.cpp */; }; - 12D1369D18328C5A005F3369 /* item_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D1369C18328C5A005F3369 /* item_spec.cpp */; }; - 12D136A1183570F5005F3369 /* pattern_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D136A0183570F5005F3369 /* pattern_spec.cpp */; }; 12D136A4183678A2005F3369 /* repeat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D136A2183678A2005F3369 /* repeat.cpp */; }; 12F8BE8E183C79B2006CCF99 /* char_class.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F8BE8C183C79B2006CCF99 /* char_class.cpp */; }; 12F9A64E182DD5FD00FAF50C /* spec_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F9A64C182DD5FD00FAF50C /* spec_helper.cpp */; }; 12F9A651182DD6BC00FAF50C /* grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F9A64F182DD6BC00FAF50C /* grammar.cpp */; }; 12FD4061185E68470041A84E /* c_code.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD405F185E68470041A84E /* c_code.cpp */; }; 12FD4064185E75290041A84E /* generate_parsers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD4063185E75290041A84E /* generate_parsers.cpp */; }; + 12FD40B3185EEB5E0041A84E /* seq.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130612182C3A1700FCF928 /* seq.cpp */; }; + 12FD40B4185EEB5E0041A84E /* parse_table_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 129D242A183EB1EB00FE9F71 /* parse_table_builder.cpp */; }; + 12FD40B6185EEB5E0041A84E /* arithmetic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 125120A3183083BD00C9B56A /* arithmetic.cpp */; }; + 12FD40B8185EEB5E0041A84E /* item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130619182C84DF00FCF928 /* item.cpp */; }; + 12FD40B9185EEB5E0041A84E /* string.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130615182C3D2900FCF928 /* string.cpp */; }; + 12FD40BA185EEB5E0041A84E /* char_class.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F8BE8C183C79B2006CCF99 /* char_class.cpp */; }; + 12FD40BB185EEB5E0041A84E /* blank.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1213060F182C3A1100FCF928 /* blank.cpp */; }; + 12FD40BD185EEB5E0041A84E /* choice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1213060C182C398300FCF928 /* choice.cpp */; }; + 12FD40BF185EEB5E0041A84E /* c_code.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD405F185E68470041A84E /* c_code.cpp */; }; + 12FD40C0185EEB5E0041A84E /* parse_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1251209E18307DEC00C9B56A /* parse_table.cpp */; }; + 12FD40C2185EEB5E0041A84E /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 121492E9181E200B008E9BDA /* main.cpp */; }; + 12FD40C3185EEB5E0041A84E /* grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F9A64F182DD6BC00FAF50C /* grammar.cpp */; }; + 12FD40C6185EEB5E0041A84E /* repeat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D136A2183678A2005F3369 /* repeat.cpp */; }; + 12FD40C7185EEB5E0041A84E /* item_set.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130620182C85D300FCF928 /* item_set.cpp */; }; + 12FD40C8185EEB5E0041A84E /* char.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130603182C348F00FCF928 /* char.cpp */; }; + 12FD40C9185EEB5E0041A84E /* symbol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130609182C389100FCF928 /* symbol.cpp */; }; + 12FD40CA185EEB5E0041A84E /* rule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1251209A1830145300C9B56A /* rule.cpp */; }; + 12FD40CB185EEB5E0041A84E /* pattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27A340F3EEB184C040521323 /* pattern.cpp */; }; + 12FD40D2185EEB970041A84E /* arithmetic.c in Sources */ = {isa = PBXBuildFile; fileRef = 12FD4065185E7C2F0041A84E /* arithmetic.c */; }; + 12FD40D5185FEEDB0041A84E /* item_set_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1213061D182C857100FCF928 /* item_set_spec.cpp */; }; + 12FD40D6185FEEDB0041A84E /* parse_table_builder_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12512092182F307C00C9B56A /* parse_table_builder_spec.cpp */; }; + 12FD40D7185FEEDB0041A84E /* item_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D1369C18328C5A005F3369 /* item_spec.cpp */; }; + 12FD40D8185FEEDF0041A84E /* rules_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 121492EA181E200B008E9BDA /* rules_spec.cpp */; }; + 12FD40D9185FEEDF0041A84E /* pattern_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D136A0183570F5005F3369 /* pattern_spec.cpp */; }; + 12FD40DB185FEF0D0041A84E /* arithmetic_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40DA185FEF0D0041A84E /* arithmetic_spec.cpp */; }; + 12FD40DD185FF12C0041A84E /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40DC185FF12C0041A84E /* parser.c */; }; + 12FD40DF1860064C0041A84E /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40DE1860064C0041A84E /* tree.c */; }; 27A343CA69E17E0F9EBEDF1C /* pattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27A340F3EEB184C040521323 /* pattern.cpp */; }; /* End PBXBuildFile section */ @@ -44,6 +66,15 @@ ); runOnlyForDeploymentPostprocessing = 1; }; + 12FD40CD185EEB5E0041A84E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -85,14 +116,19 @@ 12E71852181D081C0051A649 /* rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rules.h; path = src/compiler/rules/rules.h; sourceTree = SOURCE_ROOT; }; 12F8BE8C183C79B2006CCF99 /* char_class.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = char_class.cpp; sourceTree = ""; }; 12F8BE8D183C79B2006CCF99 /* char_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = char_class.h; sourceTree = ""; }; - 12F9A64C182DD5FD00FAF50C /* spec_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = spec_helper.cpp; path = spec/spec_helper.cpp; sourceTree = SOURCE_ROOT; }; - 12F9A64D182DD5FD00FAF50C /* spec_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spec_helper.h; path = spec/spec_helper.h; sourceTree = SOURCE_ROOT; }; + 12F9A64C182DD5FD00FAF50C /* spec_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = spec_helper.cpp; path = spec/compiler/spec_helper.cpp; sourceTree = SOURCE_ROOT; }; + 12F9A64D182DD5FD00FAF50C /* spec_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spec_helper.h; path = spec/compiler/spec_helper.h; sourceTree = SOURCE_ROOT; }; 12F9A64F182DD6BC00FAF50C /* grammar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = grammar.cpp; sourceTree = ""; }; 12F9A650182DD6BC00FAF50C /* grammar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = grammar.h; sourceTree = ""; }; 12FD405F185E68470041A84E /* c_code.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = c_code.cpp; path = src/compiler/code_gen/c_code.cpp; sourceTree = SOURCE_ROOT; }; 12FD4060185E68470041A84E /* c_code.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = c_code.h; path = src/compiler/code_gen/c_code.h; sourceTree = SOURCE_ROOT; }; 12FD4063185E75290041A84E /* generate_parsers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = generate_parsers.cpp; path = spec/compiler/generate_parsers.cpp; sourceTree = SOURCE_ROOT; }; 12FD4065185E7C2F0041A84E /* arithmetic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = arithmetic.c; path = spec/fixtures/parsers/arithmetic.c; sourceTree = SOURCE_ROOT; }; + 12FD40D1185EEB5E0041A84E /* runtime_specs */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = runtime_specs; sourceTree = BUILT_PRODUCTS_DIR; }; + 12FD40D4185FED9A0041A84E /* runtime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = runtime.h; sourceTree = ""; }; + 12FD40DA185FEF0D0041A84E /* arithmetic_spec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = arithmetic_spec.cpp; sourceTree = ""; }; + 12FD40DC185FF12C0041A84E /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parser.c; sourceTree = ""; }; + 12FD40DE1860064C0041A84E /* tree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tree.c; sourceTree = ""; }; 27A340F3EEB184C040521323 /* pattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pattern.cpp; sourceTree = ""; }; 27A3438C4FA59A3882E8493B /* pattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pattern.h; sourceTree = ""; }; /* End PBXFileReference section */ @@ -105,6 +141,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 12FD40CC185EEB5E0041A84E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -185,6 +228,7 @@ isa = PBXGroup; children = ( 12D1369E18342088005F3369 /* todo.md */, + 12FD40D3185FED630041A84E /* include */, 12E71701181D01890051A649 /* src */, 12E71796181D02A80051A649 /* spec */, 12E71795181D02A80051A649 /* Products */, @@ -204,6 +248,7 @@ isa = PBXGroup; children = ( 12E71794181D02A80051A649 /* specs */, + 12FD40D1185EEB5E0041A84E /* runtime_specs */, ); name = Products; sourceTree = ""; @@ -215,8 +260,6 @@ 12FD40AF185EE81D0041A84E /* fixtures */, 121492E9181E200B008E9BDA /* main.cpp */, 12FD40B0185EE97E0041A84E /* runtime */, - 12F9A64C182DD5FD00FAF50C /* spec_helper.cpp */, - 12F9A64D182DD5FD00FAF50C /* spec_helper.h */, ); path = spec; sourceTree = ""; @@ -254,6 +297,8 @@ 12FD40AD185EE5440041A84E /* runtime */ = { isa = PBXGroup; children = ( + 12FD40DC185FF12C0041A84E /* parser.c */, + 12FD40DE1860064C0041A84E /* tree.c */, ); path = runtime; sourceTree = ""; @@ -261,9 +306,11 @@ 12FD40AE185EE6610041A84E /* compiler */ = { isa = PBXGroup; children = ( - 12D1369F18357066005F3369 /* rules */, - 1213061C182C854F00FCF928 /* lr */, 12FD4063185E75290041A84E /* generate_parsers.cpp */, + 1213061C182C854F00FCF928 /* lr */, + 12D1369F18357066005F3369 /* rules */, + 12F9A64C182DD5FD00FAF50C /* spec_helper.cpp */, + 12F9A64D182DD5FD00FAF50C /* spec_helper.h */, ); name = compiler; sourceTree = ""; @@ -280,16 +327,25 @@ 12FD40B0185EE97E0041A84E /* runtime */ = { isa = PBXGroup; children = ( + 12FD40DA185FEF0D0041A84E /* arithmetic_spec.cpp */, ); - name = runtime; + path = runtime; + sourceTree = ""; + }; + 12FD40D3185FED630041A84E /* include */ = { + isa = PBXGroup; + children = ( + 12FD40D4185FED9A0041A84E /* runtime.h */, + ); + path = include; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 12E71793181D02A80051A649 /* specs */ = { + 12E71793181D02A80051A649 /* compiler_specs */ = { isa = PBXNativeTarget; - buildConfigurationList = 12E7179B181D02A80051A649 /* Build configuration list for PBXNativeTarget "specs" */; + buildConfigurationList = 12E7179B181D02A80051A649 /* Build configuration list for PBXNativeTarget "compiler_specs" */; buildPhases = ( 12E71790181D02A80051A649 /* Sources */, 12E71791181D02A80051A649 /* Frameworks */, @@ -299,11 +355,28 @@ ); dependencies = ( ); - name = specs; + name = compiler_specs; productName = Specs; productReference = 12E71794181D02A80051A649 /* specs */; productType = "com.apple.product-type.tool"; }; + 12FD40B1185EEB5E0041A84E /* runtime_specs */ = { + isa = PBXNativeTarget; + buildConfigurationList = 12FD40CE185EEB5E0041A84E /* Build configuration list for PBXNativeTarget "runtime_specs" */; + buildPhases = ( + 12FD40B2185EEB5E0041A84E /* Sources */, + 12FD40CC185EEB5E0041A84E /* Frameworks */, + 12FD40CD185EEB5E0041A84E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = runtime_specs; + productName = Specs; + productReference = 12FD40D1185EEB5E0041A84E /* runtime_specs */; + productType = "com.apple.product-type.tool"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -324,7 +397,8 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 12E71793181D02A80051A649 /* specs */, + 12E71793181D02A80051A649 /* compiler_specs */, + 12FD40B1185EEB5E0041A84E /* runtime_specs */, ); }; /* End PBXProject section */ @@ -334,25 +408,25 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 12FD40D7185FEEDB0041A84E /* item_spec.cpp in Sources */, + 12FD40D5185FEEDB0041A84E /* item_set_spec.cpp in Sources */, 12130614182C3A1700FCF928 /* seq.cpp in Sources */, 129D242C183EB1EB00FE9F71 /* parse_table_builder.cpp in Sources */, - 12D136A1183570F5005F3369 /* pattern_spec.cpp in Sources */, 125120A4183083BD00C9B56A /* arithmetic.cpp in Sources */, - 1214930F181E200B008E9BDA /* rules_spec.cpp in Sources */, 1213061B182C84DF00FCF928 /* item.cpp in Sources */, + 12FD40D9185FEEDF0041A84E /* pattern_spec.cpp in Sources */, 12130617182C3D2900FCF928 /* string.cpp in Sources */, 12F8BE8E183C79B2006CCF99 /* char_class.cpp in Sources */, 12130611182C3A1100FCF928 /* blank.cpp in Sources */, - 12D1369D18328C5A005F3369 /* item_spec.cpp in Sources */, 1213060E182C398300FCF928 /* choice.cpp in Sources */, 12F9A64E182DD5FD00FAF50C /* spec_helper.cpp in Sources */, 12FD4061185E68470041A84E /* c_code.cpp in Sources */, + 12FD40D8185FEEDF0041A84E /* rules_spec.cpp in Sources */, 125120A018307DEC00C9B56A /* parse_table.cpp in Sources */, 12FD4064185E75290041A84E /* generate_parsers.cpp in Sources */, 1214930E181E200B008E9BDA /* main.cpp in Sources */, 12F9A651182DD6BC00FAF50C /* grammar.cpp in Sources */, - 12512093182F307C00C9B56A /* parse_table_builder_spec.cpp in Sources */, - 1213061F182C857100FCF928 /* item_set_spec.cpp in Sources */, + 12FD40D6185FEEDB0041A84E /* parse_table_builder_spec.cpp in Sources */, 12D136A4183678A2005F3369 /* repeat.cpp in Sources */, 12130622182C85D300FCF928 /* item_set.cpp in Sources */, 12130605182C348F00FCF928 /* char.cpp in Sources */, @@ -362,6 +436,35 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 12FD40B2185EEB5E0041A84E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 12FD40B3185EEB5E0041A84E /* seq.cpp in Sources */, + 12FD40B4185EEB5E0041A84E /* parse_table_builder.cpp in Sources */, + 12FD40B6185EEB5E0041A84E /* arithmetic.cpp in Sources */, + 12FD40DD185FF12C0041A84E /* parser.c in Sources */, + 12FD40B8185EEB5E0041A84E /* item.cpp in Sources */, + 12FD40B9185EEB5E0041A84E /* string.cpp in Sources */, + 12FD40BA185EEB5E0041A84E /* char_class.cpp in Sources */, + 12FD40BB185EEB5E0041A84E /* blank.cpp in Sources */, + 12FD40BD185EEB5E0041A84E /* choice.cpp in Sources */, + 12FD40DF1860064C0041A84E /* tree.c in Sources */, + 12FD40BF185EEB5E0041A84E /* c_code.cpp in Sources */, + 12FD40D2185EEB970041A84E /* arithmetic.c in Sources */, + 12FD40DB185FEF0D0041A84E /* arithmetic_spec.cpp in Sources */, + 12FD40C0185EEB5E0041A84E /* parse_table.cpp in Sources */, + 12FD40C2185EEB5E0041A84E /* main.cpp in Sources */, + 12FD40C3185EEB5E0041A84E /* grammar.cpp in Sources */, + 12FD40C6185EEB5E0041A84E /* repeat.cpp in Sources */, + 12FD40C7185EEB5E0041A84E /* item_set.cpp in Sources */, + 12FD40C8185EEB5E0041A84E /* char.cpp in Sources */, + 12FD40C9185EEB5E0041A84E /* symbol.cpp in Sources */, + 12FD40CA185EEB5E0041A84E /* rule.cpp in Sources */, + 12FD40CB185EEB5E0041A84E /* pattern.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ @@ -477,6 +580,90 @@ }; name = Release; }; + 12FD40CF185EEB5E0041A84E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++11"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + externals/igloo, + include, + ); + MACOSX_DEPLOYMENT_TARGET = 10.8; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = runtime_specs; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = ""; + }; + name = Debug; + }; + 12FD40D0185EEB5E0041A84E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++11"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + externals/igloo, + include, + ); + MACOSX_DEPLOYMENT_TARGET = 10.8; + PRODUCT_NAME = runtime_specs; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -489,7 +676,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 12E7179B181D02A80051A649 /* Build configuration list for PBXNativeTarget "specs" */ = { + 12E7179B181D02A80051A649 /* Build configuration list for PBXNativeTarget "compiler_specs" */ = { isa = XCConfigurationList; buildConfigurations = ( 12E7179C181D02A80051A649 /* Debug */, @@ -498,6 +685,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 12FD40CE185EEB5E0041A84E /* Build configuration list for PBXNativeTarget "runtime_specs" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 12FD40CF185EEB5E0041A84E /* Debug */, + 12FD40D0185EEB5E0041A84E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 12E716FA181D010E0051A649 /* Project object */; diff --git a/TreeSitter.xcodeproj/xcshareddata/xcschemes/specs.xcscheme b/TreeSitter.xcodeproj/xcshareddata/xcschemes/compiler_specs.xcscheme similarity index 94% rename from TreeSitter.xcodeproj/xcshareddata/xcschemes/specs.xcscheme rename to TreeSitter.xcodeproj/xcshareddata/xcschemes/compiler_specs.xcscheme index 6da991f2..563d642a 100644 --- a/TreeSitter.xcodeproj/xcshareddata/xcschemes/specs.xcscheme +++ b/TreeSitter.xcodeproj/xcshareddata/xcschemes/compiler_specs.xcscheme @@ -16,7 +16,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "12E71793181D02A80051A649" BuildableName = "specs" - BlueprintName = "specs" + BlueprintName = "compiler_specs" ReferencedContainer = "container:TreeSitter.xcodeproj"> @@ -34,7 +34,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "12E71793181D02A80051A649" BuildableName = "specs" - BlueprintName = "specs" + BlueprintName = "compiler_specs" ReferencedContainer = "container:TreeSitter.xcodeproj"> @@ -53,7 +53,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "12E71793181D02A80051A649" BuildableName = "specs" - BlueprintName = "specs" + BlueprintName = "compiler_specs" ReferencedContainer = "container:TreeSitter.xcodeproj"> @@ -78,7 +78,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "12E71793181D02A80051A649" BuildableName = "specs" - BlueprintName = "specs" + BlueprintName = "compiler_specs" ReferencedContainer = "container:TreeSitter.xcodeproj"> diff --git a/TreeSitter.xcodeproj/xcshareddata/xcschemes/runtime_specs.xcscheme b/TreeSitter.xcodeproj/xcshareddata/xcschemes/runtime_specs.xcscheme new file mode 100644 index 00000000..9787e07f --- /dev/null +++ b/TreeSitter.xcodeproj/xcshareddata/xcschemes/runtime_specs.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/include/runtime.h b/include/runtime.h new file mode 100644 index 00000000..4d160564 --- /dev/null +++ b/include/runtime.h @@ -0,0 +1,71 @@ +#ifndef tree_sitter_runtime_h +#define tree_sitter_runtime_h + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#pragma mark - Tree + +typedef struct { +} TSTree; + +TSTree TSTreeMake(); + +#pragma mark - Parser + +typedef size_t TSSymbol; +typedef int TSState; + +typedef struct { + TSTree tree; + const char *input; + size_t position; + TSState *state_stack; + TSSymbol *symbol_stack; + size_t state_count; + size_t symbol_count; +} TSParser; + +TSParser TSParserMake(const char *input); +void TSParserShift(TSParser *parser, TSState state); +void TSParserReduce(TSParser *parser, TSSymbol symbol, int child_count); +void TSParserError(TSParser *parser); +TSState TSParserState(const TSParser *parser); +TSSymbol TSParserLookahead(const TSParser *parser); + +#pragma mark - DSL + +#define START_PARSER() \ + TSParser parser = TSParserMake(input); \ + start: + +#define LOOKAHEAD() \ + TSParserLookahead(&parser) + +#define PARSE_STATE() \ + TSParserState(&parser) + +#define SHIFT(number) \ + { TSParserShift(&parser, number); break; } + +#define ACCEPT() \ + { goto done; } + +#define REDUCE(symbol, child_count) \ + { TSParserReduce(&parser, symbol, child_count); break; } + +#define ERROR() \ + TSParserError(&parser) + +#define FINISH_PARSER() \ + done: \ + return parser.tree; + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/spec/spec_helper.cpp b/spec/compiler/spec_helper.cpp similarity index 100% rename from spec/spec_helper.cpp rename to spec/compiler/spec_helper.cpp diff --git a/spec/spec_helper.h b/spec/compiler/spec_helper.h similarity index 95% rename from spec/spec_helper.h rename to spec/compiler/spec_helper.h index 9c912179..57b9d5be 100644 --- a/spec/spec_helper.h +++ b/spec/compiler/spec_helper.h @@ -11,7 +11,7 @@ #include "parse_table.h" #include "parse_table_builder.h" -#include "fixtures/grammars/arithmetic.h" +#include "../fixtures/grammars/arithmetic.h" using namespace tree_sitter; diff --git a/spec/fixtures/parsers/arithmetic.c b/spec/fixtures/parsers/arithmetic.c index b99535b6..53603021 100644 --- a/spec/fixtures/parsers/arithmetic.c +++ b/spec/fixtures/parsers/arithmetic.c @@ -1,4 +1,4 @@ -#include +#include "runtime.h" #include @@ -16,354 +16,193 @@ typedef enum { } ts_symbol_type; -TSTree * ts_parse_arithmetic() { - SETUP_PARSER() -start: +TSTree ts_parse_arithmetic(const char *input) { + START_PARSER(); switch (PARSE_STATE()) { - case 0: { + case 0: switch (LOOKAHEAD()) { - case ts_symbol_type_left_paren: { + case ts_symbol_type_left_paren: SHIFT(9); - break; - } - case ts_symbol_type_variable: { + case ts_symbol_type_variable: SHIFT(8); - break; - } - case ts_symbol_type_factor: { + case ts_symbol_type_factor: SHIFT(5); - break; - } - case ts_symbol_type_number: { + case ts_symbol_type_number: SHIFT(8); - break; - } - case ts_symbol_type_term: { + case ts_symbol_type_term: SHIFT(2); - break; - } - case ts_symbol_type_expression: { + case ts_symbol_type_expression: SHIFT(1); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 1: { + case 1: switch (LOOKAHEAD()) { - case ts_symbol_type___END__: { + case ts_symbol_type___END__: ACCEPT(); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 2: { + case 2: switch (LOOKAHEAD()) { - case ts_symbol_type_plus: { + case ts_symbol_type_plus: SHIFT(3); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 3: { + case 3: switch (LOOKAHEAD()) { - case ts_symbol_type_variable: { + case ts_symbol_type_variable: SHIFT(8); - break; - } - case ts_symbol_type_factor: { + case ts_symbol_type_factor: SHIFT(5); - break; - } - case ts_symbol_type_left_paren: { + case ts_symbol_type_left_paren: SHIFT(9); - break; - } - case ts_symbol_type_number: { + case ts_symbol_type_number: SHIFT(8); - break; - } - case ts_symbol_type_term: { + case ts_symbol_type_term: SHIFT(4); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 4: { + case 4: switch (LOOKAHEAD()) { - case ts_symbol_type_expression: { + case ts_symbol_type_expression: REDUCE(ts_symbol_type_expression, 3); - break; - } - case ts_symbol_type_term: { + case ts_symbol_type_term: REDUCE(ts_symbol_type_expression, 3); - break; - } - case ts_symbol_type_right_paren: { + case ts_symbol_type_right_paren: REDUCE(ts_symbol_type_expression, 3); - break; - } - case ts_symbol_type_number: { + case ts_symbol_type_number: REDUCE(ts_symbol_type_expression, 3); - break; - } - case ts_symbol_type_factor: { + case ts_symbol_type_factor: REDUCE(ts_symbol_type_expression, 3); - break; - } - case ts_symbol_type_variable: { + case ts_symbol_type_variable: REDUCE(ts_symbol_type_expression, 3); - break; - } - case ts_symbol_type_times: { + case ts_symbol_type_times: REDUCE(ts_symbol_type_expression, 3); - break; - } - case ts_symbol_type_plus: { + case ts_symbol_type_plus: REDUCE(ts_symbol_type_expression, 3); - break; - } - case ts_symbol_type_left_paren: { + case ts_symbol_type_left_paren: REDUCE(ts_symbol_type_expression, 3); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 5: { + case 5: switch (LOOKAHEAD()) { - case ts_symbol_type_times: { + case ts_symbol_type_times: SHIFT(6); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 6: { + case 6: switch (LOOKAHEAD()) { - case ts_symbol_type_left_paren: { + case ts_symbol_type_left_paren: SHIFT(9); - break; - } - case ts_symbol_type_number: { + case ts_symbol_type_number: SHIFT(8); - break; - } - case ts_symbol_type_variable: { + case ts_symbol_type_variable: SHIFT(8); - break; - } - case ts_symbol_type_factor: { + case ts_symbol_type_factor: SHIFT(7); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 7: { + case 7: switch (LOOKAHEAD()) { - case ts_symbol_type_expression: { + case ts_symbol_type_expression: REDUCE(ts_symbol_type_term, 3); - break; - } - case ts_symbol_type_term: { + case ts_symbol_type_term: REDUCE(ts_symbol_type_term, 3); - break; - } - case ts_symbol_type_right_paren: { + case ts_symbol_type_right_paren: REDUCE(ts_symbol_type_term, 3); - break; - } - case ts_symbol_type_number: { + case ts_symbol_type_number: REDUCE(ts_symbol_type_term, 3); - break; - } - case ts_symbol_type_factor: { + case ts_symbol_type_factor: REDUCE(ts_symbol_type_term, 3); - break; - } - case ts_symbol_type_variable: { + case ts_symbol_type_variable: REDUCE(ts_symbol_type_term, 3); - break; - } - case ts_symbol_type_times: { + case ts_symbol_type_times: REDUCE(ts_symbol_type_term, 3); - break; - } - case ts_symbol_type_plus: { + case ts_symbol_type_plus: REDUCE(ts_symbol_type_term, 3); - break; - } - case ts_symbol_type_left_paren: { + case ts_symbol_type_left_paren: REDUCE(ts_symbol_type_term, 3); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 8: { + case 8: switch (LOOKAHEAD()) { - case ts_symbol_type_expression: { + case ts_symbol_type_expression: REDUCE(ts_symbol_type_factor, 1); - break; - } - case ts_symbol_type_term: { + case ts_symbol_type_term: REDUCE(ts_symbol_type_factor, 1); - break; - } - case ts_symbol_type_right_paren: { + case ts_symbol_type_right_paren: REDUCE(ts_symbol_type_factor, 1); - break; - } - case ts_symbol_type_number: { + case ts_symbol_type_number: REDUCE(ts_symbol_type_factor, 1); - break; - } - case ts_symbol_type_factor: { + case ts_symbol_type_factor: REDUCE(ts_symbol_type_factor, 1); - break; - } - case ts_symbol_type_variable: { + case ts_symbol_type_variable: REDUCE(ts_symbol_type_factor, 1); - break; - } - case ts_symbol_type_times: { + case ts_symbol_type_times: REDUCE(ts_symbol_type_factor, 1); - break; - } - case ts_symbol_type_plus: { + case ts_symbol_type_plus: REDUCE(ts_symbol_type_factor, 1); - break; - } - case ts_symbol_type_left_paren: { + case ts_symbol_type_left_paren: REDUCE(ts_symbol_type_factor, 1); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 9: { + case 9: switch (LOOKAHEAD()) { - case ts_symbol_type_left_paren: { + case ts_symbol_type_left_paren: SHIFT(9); - break; - } - case ts_symbol_type_variable: { + case ts_symbol_type_variable: SHIFT(8); - break; - } - case ts_symbol_type_factor: { + case ts_symbol_type_factor: SHIFT(5); - break; - } - case ts_symbol_type_number: { + case ts_symbol_type_number: SHIFT(8); - break; - } - case ts_symbol_type_term: { + case ts_symbol_type_term: SHIFT(2); - break; - } - case ts_symbol_type_expression: { + case ts_symbol_type_expression: SHIFT(10); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 10: { + case 10: switch (LOOKAHEAD()) { - case ts_symbol_type_right_paren: { + case ts_symbol_type_right_paren: SHIFT(11); - break; - } - default: { + default: ERROR(); - } } - break; - } - case 11: { + case 11: switch (LOOKAHEAD()) { - case ts_symbol_type_expression: { + case ts_symbol_type_expression: REDUCE(ts_symbol_type_factor, 3); - break; - } - case ts_symbol_type_term: { + case ts_symbol_type_term: REDUCE(ts_symbol_type_factor, 3); - break; - } - case ts_symbol_type_right_paren: { + case ts_symbol_type_right_paren: REDUCE(ts_symbol_type_factor, 3); - break; - } - case ts_symbol_type_number: { + case ts_symbol_type_number: REDUCE(ts_symbol_type_factor, 3); - break; - } - case ts_symbol_type_factor: { + case ts_symbol_type_factor: REDUCE(ts_symbol_type_factor, 3); - break; - } - case ts_symbol_type_variable: { + case ts_symbol_type_variable: REDUCE(ts_symbol_type_factor, 3); - break; - } - case ts_symbol_type_times: { + case ts_symbol_type_times: REDUCE(ts_symbol_type_factor, 3); - break; - } - case ts_symbol_type_plus: { + case ts_symbol_type_plus: REDUCE(ts_symbol_type_factor, 3); - break; - } - case ts_symbol_type_left_paren: { + case ts_symbol_type_left_paren: REDUCE(ts_symbol_type_factor, 3); - break; - } - default: { + default: ERROR(); - } } - break; - } - default: { - ERROR() - } + default: + ERROR(); } -done: - return PARSE_TREE(); + FINISH_PARSER(); } diff --git a/spec/runtime/arithmetic_spec.cpp b/spec/runtime/arithmetic_spec.cpp new file mode 100644 index 00000000..6ee0ba1f --- /dev/null +++ b/spec/runtime/arithmetic_spec.cpp @@ -0,0 +1,10 @@ +#include +#include "../fixtures/parsers/arithmetic.c" + +using namespace igloo; + +Describe(arithmetic) { + It(parses_numbers) { + ts_parse_arithmetic("5"); + }; +}; diff --git a/src/compiler/code_gen/c_code.cpp b/src/compiler/code_gen/c_code.cpp index a2ac9c39..a0e9ca26 100644 --- a/src/compiler/code_gen/c_code.cpp +++ b/src/compiler/code_gen/c_code.cpp @@ -30,21 +30,18 @@ namespace tree_sitter { string _switch(string condition, string body) { return "switch (" + condition + ") {\n" + - indent(body) + "\n" + + indent(body) + "}"; } string _case(string value, string body) { - return "case " + value + ": {\n" + - indent(body) + "\n" + - indent("break;") + "\n" - "}\n"; + return "case " + value + ":\n" + + indent(body) + "\n"; } string _default(string body) { - return "default: {\n" + - indent(body) + "\n" - "}"; + return "default:\n" + + indent(body) + "\n"; } class CCodeGenerator { @@ -99,7 +96,7 @@ namespace tree_sitter { string body = ""; for (int i = 0; i < parse_table.states.size(); i++) body += _case(std::to_string(i), switch_on_lookahead(parse_table.states[i])); - body += _default("ERROR()"); + body += _default("ERROR();"); return _switch("PARSE_STATE()", body); } @@ -114,18 +111,16 @@ namespace tree_sitter { string parse_function() { return - "TSTree * ts_parse_arithmetic() {\n" + - indent("SETUP_PARSER()") + "\n" + - "start:\n" + + "TSTree ts_parse_arithmetic(const char *input) {\n" + + indent("START_PARSER();") + "\n" + indent(switch_on_current_state(parse_table)) + "\n" + - "done:\n" + - indent("return PARSE_TREE();") + "\n" + indent("FINISH_PARSER();") + "\n" "}"; } string code() { return - "#include \n" + "#include \"runtime.h\"\n" "#include \n" "\n\n" + symbol_enum() + diff --git a/src/runtime/parser.c b/src/runtime/parser.c new file mode 100644 index 00000000..eb161a94 --- /dev/null +++ b/src/runtime/parser.c @@ -0,0 +1,42 @@ +#include "runtime.h" + + +static int INITIAL_STATE_STACK_SIZE = 100; +static int INITIAL_SYMBOL_STACK_SIZE = 100; + + +TSParser TSParserMake(const char *input) { + TSState *state_stack = calloc(INITIAL_STATE_STACK_SIZE, sizeof(*state_stack)); + TSSymbol *symbol_stack = calloc(INITIAL_SYMBOL_STACK_SIZE, sizeof(*symbol_stack)); + TSParser result = { + .input = input, + .tree = TSTreeMake(), + .position = 0, + .state_stack = state_stack, + .symbol_stack = symbol_stack, + .state_count = 0, + .symbol_count = 0 + }; + return result; +} + +void TSParserShift(TSParser *parser, TSState state) { + +} + +void TSParserReduce(TSParser *parser, TSSymbol symbol, int child_count) { + +} + +void TSParserError(TSParser *parser) { + +} + +TSSymbol TSParserLookahead(const TSParser *parser) { + return 1; +} + +TSState TSParserState(const TSParser *parser) { + return 5; +} + diff --git a/src/runtime/tree.c b/src/runtime/tree.c new file mode 100644 index 00000000..1f4a2b5b --- /dev/null +++ b/src/runtime/tree.c @@ -0,0 +1,9 @@ +#include "runtime.h" + + +TSTree TSTreeMake() { + TSTree result = { + + }; + return result; +} \ No newline at end of file