Compare commits

..

736 Commits

Author SHA1 Message Date
Dax Raad a205b1e7f5 enhance ripgrep files function with query filtering and limit support
publish / publish (push) Has been cancelled
🤖 Generated with [opencode](https://opencode.ai)

Co-Authored-By: opencode <noreply@opencode.ai>
2025-06-15 21:26:32 -04:00
Dax Raad 89c49bf253 first pass making system prompt less fast
publish / publish (push) Has been cancelled
2025-06-15 20:25:04 -04:00
George Potoshin a8c4a6b3da Fix: Improve Help UI Readability (Issue #99) (#117) 2025-06-15 18:38:44 -05:00
adamdottv 742eed5ce4 fix: background color rendering issues
publish / publish (push) Has been cancelled
2025-06-15 15:07:05 -05:00
Pierre B. 4c033aa9b2 fix: spelling, grammar and typos (#121) 2025-06-15 14:23:18 -05:00
Dax Raad 1fe40495d2 Improve LSP server initialization with timeout handling and skip failed servers
publish / publish (push) Has been cancelled
🤖 Generated with [opencode](https://opencode.ai)

Co-Authored-By: opencode <noreply@opencode.ai>
2025-06-15 13:52:57 -04:00
Dax Raad d142ec3b1d ignore: add timer log helper 2025-06-15 13:33:24 -04:00
Dax Raad 9d8f080da1 fix postinstall script for node
publish / publish (push) Has been cancelled
2025-06-15 13:11:11 -04:00
Pierre B. 3eece9d138 chore: ignore intellij, vscode (#122) 2025-06-15 10:40:34 -05:00
adamdottv 1a4f17a827 fix: background color rendering issues
publish / publish (push) Has been cancelled
2025-06-15 05:57:15 -05:00
szymon bf231d5469 remove .DS_Store (#112) 2025-06-15 05:34:46 -05:00
Dax Raad 44cc41abb0 beginning of upgrade command 2025-06-14 22:05:41 -04:00
Dax Raad e140c098ed revert ctrl+d - conflicts with page down
publish / publish (push) Has been cancelled
2025-06-14 21:29:02 -04:00
Dax Raad 9871d97af1 fix aborting issue
publish / publish (push) Has been cancelled
2025-06-14 21:23:57 -04:00
Dax Raad 502098549b fix issue with follow up tool calls and cancelation
publish / publish (push) Has been cancelled
2025-06-14 21:03:44 -04:00
Dax Raad 24f1399bcf fix issue continuing session after aborted 2025-06-14 20:24:50 -04:00
nitishxyz 1e0a50bf89 Add Ayu dark theme (#109)
publish / publish (push) Has been cancelled
2025-06-14 20:08:31 -04:00
Berr 233e07c66f fix: improve browser opening error handling in AuthLoginCommand (#111) 2025-06-14 20:07:41 -04:00
Dax Raad 32f82e91d2 sync 2025-06-14 20:04:41 -04:00
Dax Raad 70405b2705 ci: ignore commits 2025-06-14 18:59:05 -04:00
Dax Raad d8085d6609 docs: typo 2025-06-14 18:58:27 -04:00
Rohan Godha c4f03b1039 tui: fix help dialog background (#110)
publish / publish (push) Has been cancelled
2025-06-14 18:57:15 -04:00
Conor O'Brien 1ef5a6b321 nit: update commands displayed on home to match commands available (#108) 2025-06-14 18:56:44 -04:00
Gal Schlezinger 86b27f602d make ctrl+d quit too, just like shells (#105) 2025-06-14 18:56:34 -04:00
Dax Raad a760394536 docs: use ollama example 2025-06-14 18:55:39 -04:00
Dax Raad ec9555e957 downgrade to ai sdk v4.x
publish / publish (push) Has been cancelled
2025-06-14 18:44:08 -04:00
Gal Schlezinger def232321f add focus tracking for tui so cursor will hide when not in focus (#103) 2025-06-14 14:53:43 -05:00
Dax Raad 158e0d6e1c docs: readme 2025-06-14 14:52:02 -04:00
Dax Raad 1ad42d91ec docs: provider config 2025-06-14 14:45:59 -04:00
Dax Raad 1c6cfee713 docs: faq 2025-06-14 14:39:13 -04:00
Mantena Rama Raju ed53b3e331 typo (#94) 2025-06-14 14:36:29 -04:00
Dax Raad 9ba49a23cd Enhance provider system with dynamic package resolution and improved logging
publish / publish (push) Has been cancelled
- Add npm registry lookup for AI SDK packages with fallback support
- Enhance error logging with cause information
- Add timing deltas to log output for performance monitoring

🤖 Generated with [opencode](https://opencode.ai)

Co-Authored-By: opencode <noreply@opencode.ai>
2025-06-14 14:35:33 -04:00
Albert Ilagan 6438647eef tui: remove quit dialog (#97) 2025-06-14 12:47:34 -05:00
Dax Raad b3068ac292 doc: remove dev script 2025-06-14 13:05:23 -04:00
Dax Raad 76ba37611b docs: contributing
publish / publish (push) Has been cancelled
2025-06-14 12:45:26 -04:00
Dax Raad 5862327e26 sync 2025-06-14 12:32:41 -04:00
Dax Raad 81468d6ee4 docs: mcp 2025-06-14 12:25:26 -04:00
Dax Raad a1d5ac0c45 docs: config schema 2025-06-14 12:22:07 -04:00
Dax Raad 88bf2e3e77 ci: update publish script 2025-06-14 12:13:59 -04:00
Dax Raad 7f4d13b76d docs: readme 2025-06-14 12:13:46 -04:00
Dax Raad 7ae04a8797 naming fixes
publish / publish (push) Has been cancelled
2025-06-14 01:54:28 -04:00
Dax Raad 986c354a39 Add flag system and auto-share functionality
publish / publish (push) Has been cancelled
- Add Flag module for environment variable configuration
- Implement OPENCODE_AUTO_SHARE flag to automatically share new sessions
- Update session creation to conditionally auto-share based on flag

🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-14 01:51:04 -04:00
Dax Raad a568f4058d Improve logging and simplify fzf implementation
- Refactor fzf search to use Bun's $ syntax for cleaner command execution
- Add request/response duration logging to server middleware
- Set default service name for logging to improve log clarity

🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-14 01:51:04 -04:00
Alireza Bahrami 6f1d970962 fix(install): check if the path export command already exists (#28) 2025-06-13 23:28:33 -04:00
Dax Raad 7da025f4fb Clean up workflows and enhance file discovery tools to include dot files
publish / publish (push) Has been cancelled
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-13 23:24:46 -04:00
Dax Raad a86c9511c7 sync 2025-06-13 17:42:56 -04:00
Dax Raad 6c802425ee screenshot 2025-06-13 17:42:14 -04:00
Dax Raad 6c9b8b010f disable autoshare
publish / publish (push) Has been cancelled
2025-06-13 17:30:17 -04:00
Dax Raad 048958d7f7 sync 2025-06-13 17:24:45 -04:00
Dax Raad f42e4b7443 sync
publish / publish (push) Has been cancelled
2025-06-13 17:23:22 -04:00
adamdottv e57cf4a4ce wip: refactoring tui 2025-06-13 15:56:33 -05:00
Dax Raad e02b728a81 sync
publish / publish (push) Has been cancelled
2025-06-13 16:47:15 -04:00
Dax Raad 0a7c4a5389 sync 2025-06-13 16:46:48 -04:00
Dax Raad a177d3fa37 sync 2025-06-13 16:45:58 -04:00
Dax Raad f386dd5789 sync 2025-06-13 16:43:53 -04:00
Dax Raad 574b4eda99 commit and push 2025-06-13 16:42:31 -04:00
Dax Raad 2af22d2ec8 sync 2025-06-13 16:37:58 -04:00
Dax Raad 93e3be05a3 sync
publish / publish (push) Has been cancelled
2025-06-13 16:29:57 -04:00
Dax Raad 3f1700cc34 reset readme 2025-06-13 16:26:34 -04:00
Dax Raad b6c79abca2 ci
publish / publish (push) Has been cancelled
2025-06-13 16:23:38 -04:00
Dax Raad b86c1c9151 homebrew
publish / publish (push) Has been cancelled
2025-06-13 16:17:27 -04:00
adamdottv 50d6057777 wip: refactoring tui
publish / publish (push) Has been cancelled
2025-06-13 11:27:05 -05:00
adamdottv 8cd554f84c wip: refactoring tui 2025-06-13 11:18:46 -05:00
adamdottv 9ad13b3197 wip: refactoring tui 2025-06-13 10:47:51 -05:00
adamdottv 453298c1c0 wip: refactoring tui 2025-06-13 09:57:54 -05:00
adamdottv 2d8ce02971 wip: refactoring tui 2025-06-13 09:44:09 -05:00
adamdottv 09492cfeb7 wip: refactoring tui 2025-06-13 09:19:51 -05:00
adamdottv eda1445856 wip: refactoring tui 2025-06-13 08:30:57 -05:00
adamdottv 161634d663 wip: refactoring tui 2025-06-13 08:30:56 -05:00
Dax Raad ba1d90b1b9 do not strip aur package
publish / publish (push) Has been cancelled
2025-06-13 08:27:17 -04:00
adamdottv fe1d09b88d wip: refactoring tui
publish / publish (push) Has been cancelled
2025-06-13 07:01:26 -05:00
adamdottv fae45d757f wip: refactoring tui 2025-06-13 06:56:12 -05:00
adamdottv 93db8564a5 wip: refactoring tui 2025-06-13 06:49:59 -05:00
adamdottv da824c82b6 wip: refactoring tui 2025-06-13 06:23:12 -05:00
Dax Raad 30176d32ba load API keys
publish / publish (push) Has been cancelled
2025-06-13 00:53:46 -04:00
Dax Raad aa330249c4 Enhance auth command with dynamic provider selection
- Add support for dynamically loading providers from ModelsDev
- Prioritize anthropic as recommended provider
- Add "other" provider option for manual entry
- Include special handling for amazon-bedrock with AWS config guidance
- Expand provider selection UI to show up to 8 providers

🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-13 00:33:54 -04:00
Dax Raad d0f3211c7f sync 2025-06-13 00:06:15 -04:00
Dax Raad 899e5f38b2 Refactor AI SDK provider loading to use BunProc.install
Simplifies provider installation by using BunProc.install() instead of manual path construction and file system checks.

🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-12 23:50:26 -04:00
Dax Raad fba34a04fa bedrock loader
publish / publish (push) Has been cancelled
2025-06-12 23:39:52 -04:00
Dax Raad 3c0a28dbed Update provider configuration and server handling
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-12 23:10:03 -04:00
Thomas Meire c45233e3ff Update error message to say opencode instead of sst (#81)
publish / publish (push) Has been cancelled
2025-06-12 18:38:59 -04:00
Dax Raad c3c3fcd3c8 ci
publish / publish (push) Has been cancelled
2025-06-12 18:30:19 -04:00
Dax Raad 76e9b68e11 ci
publish / publish (push) Has been cancelled
2025-06-12 18:21:08 -04:00
Dax Raad bf5435821e sync
publish / publish (push) Has been cancelled
2025-06-12 18:14:04 -04:00
Dax Raad 833d5f312a Update CLI run command and session handling
publish / publish (push) Has been cancelled
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-12 18:07:31 -04:00
Dax Raad 073df4d75f subagent 2025-06-12 18:07:31 -04:00
Jay V 4f16fa6944 updating logo 2025-06-12 17:30:24 -04:00
adamdottv 40f193a630 wip: refactoring tui 2025-06-12 16:04:45 -05:00
adamdottv c1c488c545 wip: refactoring tui 2025-06-12 16:00:26 -05:00
adamdottv 4bac47ab25 wip: refactoring tui 2025-06-12 16:00:25 -05:00
adamdottv c590a9cec6 wip: refactoring tui 2025-06-12 16:00:25 -05:00
adamdottv e97bb2639c wip: refactoring tui 2025-06-12 16:00:25 -05:00
adamdottv 6bb6a8714c wip: refactoring tui 2025-06-12 16:00:25 -05:00
adamdottv fd76c78ebf wip: refactoring tui 2025-06-12 16:00:24 -05:00
adamdottv 1db78332b9 wip: refactoring tui 2025-06-12 16:00:24 -05:00
adamdottv 6e35dc52f9 wip: refactoring tui 2025-06-12 16:00:24 -05:00
Dax Raad 9e4f0f3393 ci 2025-06-12 14:15:44 -04:00
Dax Raad ceee72eb98 sync 2025-06-12 14:11:01 -04:00
Dax Raad 17919fd496 Update publish workflow to support snapshot releases on dontlook branch
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-12 14:10:29 -04:00
Dax Raad 8caa6e5f52 sync
publish / publish (push) Has been cancelled
2025-06-12 14:06:06 -04:00
Dax Raad bcff8a8292 Update index.ts
publish / publish (push) Has been cancelled
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-12 13:59:42 -04:00
Dax Raad eae59a759f sync
publish / publish (push) Has been cancelled
2025-06-12 13:49:43 -04:00
Jay V df5c05934e fix share page edit 2025-06-12 13:42:10 -04:00
Dax Raad 550f417682 do not output bunproc
publish / publish (push) Has been cancelled
2025-06-12 13:39:03 -04:00
Dax Raad 1b27c1529a Fix AUR SSH key path handling in publish script
publish / publish (push) Has been cancelled
Quote and trim AUR_KEY environment variable to handle paths with spaces and multiline content properly.

🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-12 13:37:12 -04:00
Dax Raad 02da0e1787 Simplify BunProc.which() to use process.execPath directly
publish / publish (push) Has been cancelled
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-12 13:32:31 -04:00
Dax Raad 73b81c241a update bun integration
publish / publish (push) Has been cancelled
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-12 13:29:14 -04:00
Dax Raad 4b4df65a4e sync
publish / publish (push) Has been cancelled
2025-06-12 13:19:24 -04:00
Dax Raad 31e1709c52 token
publish / publish (push) Has been cancelled
2025-06-12 13:17:06 -04:00
Dax Raad 3af67dd2f5 skip nil values
publish / publish (push) Has been cancelled
2025-06-12 13:13:34 -04:00
Jay V 84160a39c2 share page handle undefined 2025-06-12 13:11:34 -04:00
Dax Raad db4babbd6d sync
publish / publish (push) Has been cancelled
2025-06-12 13:04:01 -04:00
Dax Raad 882730c9be sync
release / goreleaser (push) Has been cancelled
2025-06-12 12:48:38 -04:00
Dax Raad 57e567bb38 npm token
release / goreleaser (push) Has been cancelled
2025-06-12 12:09:13 -04:00
Dax Raad d92611d67c sync 2025-06-12 11:58:41 -04:00
Dax Raad be627906c2 sync
release / goreleaser (push) Has been cancelled
2025-06-12 11:57:57 -04:00
Dax Raad 7dac4db214 sync
release / goreleaser (push) Has been cancelled
2025-06-12 11:56:52 -04:00
Dax Raad 42f966513d sync
release / goreleaser (push) Has been cancelled
2025-06-12 11:56:06 -04:00
Dax Raad 61630059fa tweak
release / goreleaser (push) Has been cancelled
2025-06-12 11:55:07 -04:00
Dax Raad 07077d34b7 sync
release / goreleaser (push) Has been cancelled
2025-06-12 11:18:17 -04:00
Dax Raad 0ef68306a7 sync
release / goreleaser (push) Has been cancelled
2025-06-12 11:02:51 -04:00
Dax Raad 2e3ad15d06 sync
release / goreleaser (push) Has been cancelled
2025-06-12 11:00:37 -04:00
Dax Raad 287a0b519d Add postinstall script and update session/release configuration
release / goreleaser (push) Has been cancelled
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-12 00:50:49 -04:00
Dax Raad f3dc4bd937 Refactor external tools organization and add file search API endpoint
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-11 23:59:51 -04:00
Dax Raad 1fec4b47e5 Add search function to fzf and move version constant to namespace level
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-11 23:58:13 -04:00
Dax Raad 468ce2019b add title temp 2025-06-11 19:09:08 -04:00
Dax Raad c6f381ab3a sync 2025-06-11 19:00:09 -04:00
Dax Raad acb23eb995 sync 2025-06-11 18:45:18 -04:00
Dax Raad 8f43c59091 sync 2025-06-11 18:19:21 -04:00
adamdottv 70a3a19c88 wip: refactoring tui 2025-06-11 12:05:54 -05:00
adamdottv 17f6a60ef7 wip: refactoring tui 2025-06-11 11:58:25 -05:00
Dax Raad e52fb7ff3f sync 2025-06-11 12:58:06 -04:00
Dax Raad 60f3b52996 sync 2025-06-11 12:44:21 -04:00
adamdottv 775e5ecbf0 wip: refactoring tui 2025-06-11 11:43:28 -05:00
Dax Raad 70d291afdf sync 2025-06-11 12:35:20 -04:00
Dax Raad aac32a0a5e sync 2025-06-11 11:41:10 -04:00
Dax Raad d759b814c7 turn on tool call streaming 2025-06-11 11:36:12 -04:00
Jay V 7d9edc53db share page scroll anchor 2025-06-11 09:43:52 -05:00
Dax Raad 6fd8f1034b fix bash 2025-06-11 00:37:43 -04:00
Dax Raad c1a9c33a62 Standardize styling in auth commands by replacing Bun.color with UI.Style constants
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-11 00:34:55 -04:00
Dax Raad c2c1f8e54b sync 2025-06-11 00:27:46 -04:00
Dax Raad d3197c6d15 Refactor authentication system to consolidate auth flow and remove provider-based commands
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-11 00:21:46 -04:00
Dax Raad a26c53875c sync 2025-06-10 22:18:27 -04:00
Dax Raad b5f59b3bcc fix rendering 2025-06-10 19:37:25 -04:00
Dax Raad e553e64e77 Fix shutdown handling, error management, and process lifecycle issues
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-10 18:58:47 -04:00
Dax Raad 567ad1e69a fix bunfile bug 2025-06-10 18:23:19 -04:00
Dax Raad 8975092d91 sync 2025-06-10 18:10:30 -04:00
Dax Raad 5a192393b8 add abort signals 2025-06-10 17:56:05 -04:00
Dax Raad 37cf5c07a6 webfetch spoof browser 2025-06-10 16:39:06 -04:00
Dax Raad 6edb6024db kill 2025-06-10 16:35:02 -04:00
Dax Raad 51c5048570 lsp 2025-06-10 16:29:35 -04:00
Dax Raad e054d5ecca merge deep config 2025-06-10 16:19:02 -04:00
Frank 3ac6381350 Share: render url on frontend 2025-06-10 15:50:42 -04:00
Dax Raad a269194d1e onboarding progress 2025-06-10 15:43:14 -04:00
Dax Raad e1cc298e95 fix share link 2025-06-10 13:36:47 -04:00
Dax Raad e7c8654e7c sync 2025-06-10 13:30:13 -04:00
Dax Raad 160913e061 Update LSP client/server and CLI scrap command functionality
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-10 13:30:13 -04:00
Jay V 11ca89ea69 moving share urls 2025-06-10 11:52:02 -05:00
Dax Raad e64fe86149 Enhance ripgrep error handling and utility functions
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-10 11:06:01 -04:00
Jay V 6c25bbe80d share page fix 2025-06-10 09:33:28 -05:00
Dax Raad b2d5a8a488 sync 2025-06-10 10:14:03 -04:00
Dax Raad bd41ad730a Improve ripgrep error handling with structured error types
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-10 10:14:03 -04:00
Frank b65bc68367 Share: og image 2025-06-09 23:37:32 -04:00
Frank 93e8522fd6 ssr sync 2025-06-09 23:07:29 -04:00
Dax Raad cea7df2c5e aborted toolcalls should be cleaned up 2025-06-09 20:48:50 -04:00
Dax Raad 25b5de1fca properly support codex mini 2025-06-09 20:24:18 -04:00
Dax Raad de16cad6e4 notice 2025-06-09 19:58:08 -04:00
Jay V e46952a9e5 share og image 2025-06-09 16:42:13 -05:00
Jay V fee3ee9155 edits 2025-06-09 16:09:15 -05:00
Dax Raad b356744e69 file permissions for anthropic credentials 2025-06-09 17:07:52 -04:00
Jay V 495d105088 share page show lsp diag 2025-06-09 15:41:19 -05:00
Jay V 423bc72edb share page fix ai text 2025-06-09 15:02:46 -05:00
Jay V 213fac68c8 fix duplicates models 2025-06-09 15:02:46 -05:00
Dax Raad 10219b14d4 improve AGENTS.md 2025-06-09 15:28:06 -04:00
Dax Raad d9af524676 sync 2025-06-09 15:00:48 -04:00
Dax Raad 902ee2e1db Refactor logging system to centralize initialization and remove printLogs parameter
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-09 14:52:30 -04:00
Dax Raad 5db2410770 optional 2025-06-09 14:02:58 -04:00
Dax Raad 8d6c253c16 sync 2025-06-09 14:01:11 -04:00
Dax Raad a080eab5c0 Add TypeScript server initialization config to LSP server
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-08 13:22:07 -04:00
Dax Raad 100a8c5821 fix ts lsp 2025-06-08 12:57:33 -04:00
Dax Raad 9af89c5fc7 sync 2025-06-08 12:46:32 -04:00
Frank 66ccc67a4d Share: load server data on page load 2025-06-08 01:17:54 -04:00
Frank a7473daf7b Remove unused package 2025-06-07 23:47:45 -04:00
Frank 79f839215f Infra: use Astro component 2025-06-07 23:46:56 -04:00
Dax Raad 37929c6bc2 sync 2025-06-07 17:15:40 -04:00
Dax Raad 96218334eb logs 2025-06-06 23:58:09 -04:00
Dax Raad b683b4e51e add go version 2025-06-06 23:26:11 -04:00
Dax Raad a23908a136 autodownload lsp 2025-06-06 23:21:57 -04:00
Dax Raad c84fb15216 make lsp better 2025-06-06 17:20:08 -04:00
Jay V 7c2f97f0d8 share page styles 2025-06-06 12:18:02 -04:00
Dax Raad 482fe2b8c9 lsp progress 2025-06-05 23:42:04 -04:00
Dax Raad d9986aa6c2 update auth and provider configuration
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-05 20:11:56 -04:00
Jay V c1b5af5ffa share page markdown 2025-06-05 19:14:35 -04:00
Jay V 3a755eadce share write tool 2025-06-05 16:41:44 -04:00
Jay V a50e389df6 share page 2025-06-05 16:35:23 -04:00
Dax Raad f8d2695e56 fix webfetch 2025-06-05 15:59:17 -04:00
Jay V 9fd5d25f1f share ssr 2025-06-05 15:37:23 -04:00
Dax Raad 61ee871243 fix cost 2025-06-05 15:06:42 -04:00
Dax Raad d9e4815d71 integrate with models.dev 2025-06-05 14:59:16 -04:00
Jay V f52d1a4bee share page fetch 2025-06-05 14:17:43 -04:00
adamdottv a79f270202 wip: refactoring tui 2025-06-05 13:10:20 -05:00
Jay V 8671607e1b share page todos 2025-06-05 13:52:44 -04:00
Dax Raad c1410091c7 sync 2025-06-05 13:51:18 -04:00
Dax Raad 06c1f06493 gopls 2025-06-05 13:51:18 -04:00
Dax Raad 47532b9f03 sync 2025-06-05 13:51:18 -04:00
adamdottv 580ff78958 wip: refactoring tui 2025-06-05 12:38:25 -05:00
adamdottv a6f8c4c5ce feat: opus 4 2025-06-05 11:39:13 -05:00
Dax Raad b2edf44898 sync 2025-06-05 12:06:21 -04:00
Dax Raad fc7d4c1e54 fixed 2025-06-05 11:58:04 -04:00
Dax Raad 2e15770085 claude oauth support 2025-06-05 11:51:06 -04:00
adamdottv 49209a9f78 wip: refactoring tui 2025-06-05 10:46:07 -05:00
adamdottv 1c87a48522 wip: refactoring tui 2025-06-05 05:43:33 -05:00
Dax Raad b6f9913d78 fix cost 2025-06-05 02:23:11 -04:00
Dax Raad f09d53ffa7 Add session share URL display to CLI output
🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-04 21:01:36 -04:00
Dax Raad f89481b727 sync 2025-06-04 20:49:33 -04:00
Jay V e7e30c8274 share page glob 2025-06-04 20:14:14 -04:00
Jay V 91418a5c44 share page glob 2025-06-04 19:34:15 -04:00
Jay V 09d34cc7cb read tool share page 2025-06-04 18:39:06 -04:00
Dax Raad 3aad1a9c7d sync 2025-06-04 18:32:10 -04:00
Dax Raad 3f26b0174c rework 2025-06-04 18:03:04 -04:00
Dax Raad da0795ef88 track errors 2025-06-04 17:55:14 -04:00
Jay V 79b89127fa share page tool args 2025-06-04 17:48:42 -04:00
Dax Raad 16c37de95d Refactor session module structure and improve error handling
- Rename session.ts to index.ts for cleaner module imports
- Update all imports to use new session module structure
- Add error metadata tracking to message schema
- Improve error handling in session stream processing

🤖 Generated with [OpenCode](https://opencode.ai)

Co-Authored-By: OpenCode <noreply@opencode.ai>
2025-06-04 17:38:54 -04:00
Jay V bf2eeb14c1 styles share 2025-06-04 17:01:04 -04:00
Dax Raad f8317c2d38 implemented todo tool 2025-06-04 15:09:50 -04:00
adamdottv 5fe1f105c0 wip: refactoring tui 2025-06-04 13:52:23 -05:00
adamdottv 7f0dbb1a8d wip: refactoring tui 2025-06-04 12:57:17 -05:00
Jay V 12a78352f6 share collapse system prompt 2025-06-04 13:37:07 -04:00
Dax Raad 472e03be40 sync 2025-06-04 13:33:53 -04:00
Dax Raad 44ce3e9727 more tools 2025-06-04 13:33:25 -04:00
Dax Raad b3bebdabca sync 2025-06-04 13:12:55 -04:00
Dax Raad 1cb48d5c24 tool updates 2025-06-04 13:12:48 -04:00
adamdottv d71754a704 wip: refactoring tui 2025-06-04 11:48:01 -05:00
adamdottv 29377e8dcb wip: refactoring tui 2025-06-04 11:48:01 -05:00
Jay V a2cb7e93ba styles share 2025-06-04 12:44:36 -04:00
Jay V 34725efdf2 styles 2025-06-04 12:32:25 -04:00
adamdottv 6f1e4a1545 wip: refactoring tui 2025-06-04 09:20:48 -05:00
Dax Raad f296a67855 sync 2025-06-04 10:20:29 -04:00
Dax Raad 5f044228f9 fix tokens 2025-06-04 10:14:42 -04:00
Jay V 8c2ea63e34 share paage durations 2025-06-03 18:08:46 -04:00
Jay V 844adb645a share page bugs 2025-06-03 17:20:30 -04:00
adamdottv dda3d41aca wip: refactoring tui 2025-06-03 15:49:41 -05:00
Dax Raad 90f300438d fix port issue 2025-06-03 16:35:37 -04:00
Dax Raad 320f23a8dc mcp support 2025-06-03 15:57:48 -04:00
Jay V 844acfe572 styles 2025-06-03 15:57:00 -04:00
Jay V cb2cca75c7 Styling share 2025-06-03 15:55:34 -04:00
Jay V fb57778f01 lock 2025-06-03 15:55:34 -04:00
Dax Raad 88fc35a41f Fix bash tool stream handling by ensuring consistent stdout/stderr pipe configuration
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-06-03 14:48:05 -04:00
Dax Raad ca446d6ce4 Replace env-paths with xdg-basedir for better XDG compliance and cross-platform directory handling
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-06-03 14:46:28 -04:00
Dax Raad cf5ef05ddf change file name again 2025-06-03 14:28:50 -04:00
Dax Raad 98ea791f43 sync 2025-06-03 14:25:25 -04:00
Dax Raad fae6e568a0 initialized 2025-06-03 14:24:45 -04:00
Dax Raad 42a876cb2f max output tokens 2025-06-03 13:46:39 -04:00
adamdottv 6aefa320b9 wip: refactoring tui 2025-06-03 12:45:28 -05:00
Dax Raad c86d7fe6b9 do not list files if not git 2025-06-03 13:19:44 -04:00
Dax Raad ff6cef3da1 include env 2025-06-03 13:18:42 -04:00
Dax Raad a9dc21d782 sync 2025-06-03 13:08:47 -04:00
Dax Raad 58701d364a sync 2025-06-03 13:00:27 -04:00
Dax Raad be03feb20d initialzie 2025-06-03 12:38:48 -04:00
Dax Raad c6562cb167 sync
release / goreleaser (push) Has been cancelled
2025-06-03 12:08:07 -04:00
Dax Raad bf8c451953 added app 2025-06-03 12:02:21 -04:00
Dax Raad 66685b4917 Refactor app context system to use Zod schemas and sync access pattern
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-06-03 11:59:03 -04:00
Dax Raad 375257a559 check in generated files 2025-06-02 22:14:12 -04:00
Dax Raad 19a42597af scope filetimes to session 2025-06-02 20:24:32 -04:00
Dax Raad e696710502 add permission system 2025-06-02 19:51:37 -04:00
adamdottv 0ae62d2d24 wip: refactoring tui 2025-06-02 14:14:13 -05:00
adamdottv b3f7ea6566 wip: refactoring tui 2025-06-02 13:33:05 -05:00
adamdottv 02ab71e91e wip: refactoring tui 2025-06-02 12:30:03 -05:00
adamdottv b24e7cf4e1 wip: refactoring tui 2025-06-02 12:00:21 -05:00
adamdottv 1b69195c4e wip: refactoring tui 2025-06-02 11:33:01 -05:00
Dax Raad c481538ed4 spawn from anywhere in dev mode 2025-06-02 11:40:28 -04:00
Dax Raad 7fd6392ca0 remove json 2025-06-01 15:03:25 -04:00
Dax Raad fcc44590e3 sync 2025-06-01 15:01:57 -04:00
Dax Raad 215a20b9a9 Fix TypeScript errors and clean up unused imports
- Remove unused fs import from app.ts
- Remove unused LLM import and missing module reference from server.ts
- Fix parameter naming inconsistency in fetch.ts execute function
- Add missing metadata property to fetch.ts return statement
- Update test file to use correct API signatures and parameter names
- Remove unused parameters from example.ts

🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-06-01 14:46:04 -04:00
Dax Raad 059d76ce82 Refactor application path handling and data storage architecture
Replace simple directory-based path system with git-aware data management that uses global data directories and proper workspace detection.

🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-06-01 14:40:44 -04:00
Dax Raad 68608753d9 fix tool name change 2025-05-31 20:33:21 -04:00
Dax Raad 49f7fb040f sync
release / goreleaser (push) Has been cancelled
2025-05-31 18:45:36 -04:00
Dax Raad 7a085616f5 sync 2025-05-31 18:42:43 -04:00
Dax Raad 92dec846c0 sync 2025-05-31 18:10:49 -04:00
Dax Raad 7284f50ac3 tool rework
release / goreleaser (push) Has been cancelled
2025-05-31 17:12:16 -04:00
Dax Raad d1d26e929d fix generate 2025-05-31 16:06:51 -04:00
Dax Raad 1ddf77093d lazy load LLMs even harder 2025-05-31 16:05:12 -04:00
Dax Raad 27c92a478f run formatter 2025-05-31 14:41:00 -04:00
Dax Raad bad8d2aa87 Standardize code style to no semicolons and remove unused @types/node dependency
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-30 22:14:09 -04:00
Dax Raad 9323685fc4 Update package dependencies and lock file
Synchronized package.json and bun.lock with latest dependency versions and optimized package structure.

🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-30 22:02:22 -04:00
Dax Raad 56806b6914 Optimize package management with catalog and exact versions
- Add catalog feature to centralize common dependency versions
- Convert all package versions to exact (remove ^ prefixes)
- Move prettier to root package only to reduce duplication
- Configure bunfig.toml for exact dependency installs
- Improve version consistency across workspace packages

🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-30 21:56:37 -04:00
Dax Raad 8a0e75f755 sync 2025-05-30 21:42:03 -04:00
Dax Raad 1b97dd1eb7 embed go 2025-05-30 21:26:53 -04:00
Dax Raad fcdff9f578 sync 2025-05-30 20:48:36 -04:00
Jay V 1d5db25ed4 listing themes explicitly 2025-05-30 17:06:03 -04:00
Jay V 61c97595dd tweaking styles 2025-05-30 17:00:18 -04:00
Dax Raad 1e28333fe5 sync 2025-05-30 16:43:42 -04:00
Jay V 9c238b0be0 tweaking share edit 2025-05-30 16:42:59 -04:00
adamdottv 707ddafebe wip: refactoring tui 2025-05-30 15:37:04 -05:00
adamdottv ad903b4dca wip: refactoring tui 2025-05-30 15:34:25 -05:00
Dax Raad d4f73aaa02 sync 2025-05-30 14:45:10 -04:00
Dax Raad fb3d11fd99 sync 2025-05-30 14:40:59 -04:00
Dax Raad 8a8bb99bdc sync 2025-05-30 14:40:59 -04:00
Jay V e36826dba6 refactor 2025-05-30 14:08:21 -04:00
Jay V 4fcf708f9d import 2025-05-30 14:02:15 -04:00
Jay V 2b953108e4 share page diff 2025-05-30 13:58:34 -04:00
Jay V ec8cb68dba adding diff 2025-05-30 13:58:34 -04:00
adamdottv 04cce74682 wip: refactoring tui 2025-05-30 12:29:27 -05:00
adamdottv 3b49eb6744 wip: refactoring tui 2025-05-30 10:37:09 -05:00
adamdottv 8f2481c743 wip: refactoring tui 2025-05-30 08:35:59 -05:00
adamdottv cf7f0fdc5a wip: refactoring tui 2025-05-30 08:29:37 -05:00
adamdottv b598922f40 wip: refactoring tui 2025-05-30 06:47:44 -05:00
adamdottv 87dca9912a wip: refactoring tui 2025-05-30 06:03:34 -05:00
adamdottv 77dcda776b wip: refactoring tui 2025-05-30 05:32:42 -05:00
adamdottv f4051294d9 wip: refactoring tui 2025-05-29 15:42:18 -05:00
adamdottv aa80b13d33 wip: refactoring tui 2025-05-29 15:41:13 -05:00
adamdottv 70197f6acf wip: refactoring tui 2025-05-29 15:40:37 -05:00
adamdottv 98d5d2e538 wip: refactoring tui 2025-05-29 15:37:06 -05:00
adamdottv b4a45cc2f4 wip: refactoring tui 2025-05-29 15:30:39 -05:00
adamdottv 63993485a6 wip: refactoring tui 2025-05-29 15:22:25 -05:00
adamdottv 6378fcae95 wip: refactoring tui 2025-05-29 15:18:47 -05:00
adamdottv 85e46b0b6c wip: refactoring tui 2025-05-29 15:10:44 -05:00
adamdottv e6ea2f4939 wip: refactoring tui 2025-05-29 15:02:22 -05:00
adamdottv bd1830bdcc wip: refactoring tui 2025-05-29 14:39:37 -05:00
adamdottv 3fd04414b3 wip: refactoring tui 2025-05-29 14:20:55 -05:00
Dax Raad 8553c1af50 Improve async share handling and enhance diagnostic output with filenames
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-29 15:16:42 -04:00
Dax Raad 8e1e21d5a9 Fix working indicator to only show when message is incomplete
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-29 15:10:23 -04:00
Dax Raad 3fcd265845 remov elog 2025-05-29 15:05:44 -04:00
adamdottv 4adaf38e12 wip: refactoring tui 2025-05-29 14:04:49 -05:00
adamdottv e450d5884a wip: refactoring tui 2025-05-29 14:04:49 -05:00
adamdottv 35c2003f92 wip: refactoring tui 2025-05-29 14:04:48 -05:00
adamdottv eb6053a7b8 wip: refactoring tui 2025-05-29 14:04:48 -05:00
Dax Raad c512eca865 support continuation 2025-05-29 14:29:08 -04:00
Jay V 143f8d5be1 styling tool calls 2025-05-29 14:24:25 -04:00
Dax Raad 04b35b6d6b Remove React/Ink dependencies and add context window management
- Remove unused React and Ink CLI dependencies to simplify package
- Update provider schema to use maxOutputTokens for clarity
- Add automatic summarization when approaching context window limits
- Simplify message event handling and add cost/token metadata display

🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-29 14:16:15 -04:00
Dax Raad e31f49d4ed add summarize 2025-05-29 13:17:56 -04:00
Dax Raad 982de7ad55 fix race 2025-05-29 13:15:58 -04:00
Dax Raad a36ed60745 add summarize 2025-05-29 13:02:48 -04:00
Dax Raad 2add77a8da type error fix 2025-05-29 11:58:40 -04:00
Dax Raad 8d9e88378b sync 2025-05-29 11:38:55 -04:00
Dax Raad 2573d87f05 sync 2025-05-29 11:35:56 -04:00
Dax Raad 9fe70d71ca remove secondary codegen 2025-05-29 11:32:55 -04:00
Dax Raad 5d64fd8c14 event 2025-05-29 11:17:34 -04:00
Dax Raad a7f8f706bb rework types 2025-05-29 10:22:07 -04:00
adamdottv 66a38dc727 wip: refactoring tui 2025-05-29 06:45:34 -05:00
adamdottv 37460223c4 wip: refactoring tui 2025-05-29 06:42:58 -05:00
adamdottv 8d120ca81d wip: refactoring tui 2025-05-29 06:32:44 -05:00
Jay V b92de0aec7 styling share 2025-05-28 20:04:58 -04:00
Jay V 3a4aac83e3 styling share 2025-05-28 18:32:40 -04:00
Dax Raad 7ed8034b81 autoshare 2025-05-28 17:34:37 -04:00
Dax Raad 30773ebfbe sync 2025-05-28 17:25:00 -04:00
Dax Raad 335de4226a sync 2025-05-28 17:24:21 -04:00
Jay V b44d634229 refactor share 2025-05-28 16:42:44 -04:00
adamdottv f9144e6406 wip: refactoring tui 2025-05-28 15:36:36 -05:00
adamdottv 5f105a35c0 wip: refactoring tui 2025-05-28 15:36:35 -05:00
adamdottv 439571454f wip: refactoring tui 2025-05-28 15:36:35 -05:00
adamdottv 4098b44149 wip: refactoring tui 2025-05-28 15:36:35 -05:00
adamdottv 05802f2c28 chore: cleanup unused imports 2025-05-28 15:36:35 -05:00
adamdottv a290711326 chore: remove dead code 2025-05-28 15:36:35 -05:00
Dax Raad df839ee79b sync 2025-05-28 15:40:35 -04:00
Dax Raad 50c37fbb17 sync 2025-05-28 15:39:51 -04:00
Dax Raad efb684d9c6 abort 2025-05-28 15:07:51 -04:00
Dax Raad 690a5cb323 more 2025-05-28 14:17:02 -04:00
Jay V 48bdcb6f2b styling share 2025-05-28 14:10:20 -04:00
Dax Raad 0d7b0ca49f sync 2025-05-28 13:58:55 -04:00
Dax Raad 8dc9100e36 added cost field 2025-05-28 13:57:24 -04:00
Dax Raad 554702db4c add cost 2025-05-28 13:57:02 -04:00
Dax Raad 8dd39e57b1 better discriminator 2025-05-28 13:35:05 -04:00
Dax Raad a2a67e1d8c add runtime 2025-05-28 13:24:35 -04:00
Dax Raad 058268e54e generate message type 2025-05-28 13:22:48 -04:00
Dax Raad 66e1c46021 add provider_list 2025-05-28 12:53:22 -04:00
Dax Raad fbcb8955a2 return tool errors properly 2025-05-27 21:53:21 -04:00
Jay V 513b610b40 styling share 2025-05-27 20:38:29 -04:00
Dax Raad a4d301bac4 title 2025-05-27 17:22:29 -04:00
Dax Raad f8a5970c9f sync 2025-05-27 16:56:12 -04:00
Dax Raad c639fdae35 sync 2025-05-27 15:41:44 -04:00
Dax Raad 3545e16516 sync 2025-05-27 15:37:46 -04:00
Dax Raad c1b11346a6 regen client 2025-05-27 15:35:48 -04:00
Dax Raad 6bd7d81fa8 fix 2025-05-27 15:35:31 -04:00
Dax Raad b4430d2767 add session list 2025-05-27 15:34:46 -04:00
Dax Raad f3ad292bac fix type errors 2025-05-27 15:28:58 -04:00
Dax Raad b84ad710c2 vomit 2025-05-27 15:26:49 -04:00
Dax Raad e247f83033 stripped 2025-05-27 15:20:43 -04:00
Dax Raad aea9638e40 trust sharp 2025-05-27 14:36:23 -04:00
Dax Raad 6aeeed2c34 sync 2025-05-27 14:31:53 -04:00
Dax Raad d7b7be7a8e Add manual trigger option to deployment workflow
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-27 14:30:52 -04:00
Dax Raad 8d5a92d055 Add GitHub Actions deployment workflow to automate deployments
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-27 14:29:36 -04:00
Dax Raad 319e6993bf Refactor grep tool output generation and fix ls directory traversal bug
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-27 02:26:53 -04:00
Dax Raad d1a51ef875 Refactor LSP tools and add hover functionality
- Split diagnostics tool into separate lsp-diagnostics.ts file
- Add new lsp-hover.ts tool for LSP hover information
- Update tool exports and session integration
- Remove old diagnostics.ts file

🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-27 02:17:35 -04:00
Dax Raad d45a43d6ce Add automatic CONTEXT.md loading and improve share sync reliability
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-26 23:04:40 -04:00
Dax Raad e3a26b362b Fix race condition in share sync by implementing request queue
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-26 22:56:58 -04:00
Dax Raad dcf7c9a2e3 track tokens progressively 2025-05-26 22:35:30 -04:00
Dax Raad cb4bd505a8 Remove debug console.log statements and improve LSP diagnostic handling
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-26 22:25:17 -04:00
Dax Raad 2eeeaafa59 Standardize API parameters to camelCase and improve LSP client reliability
- Convert tool parameters from snake_case to camelCase for consistency
- Add file existence check in LSP client before opening files
- Fix version increment timing in LSP textDocument operations
- Optimize session token tracking using onStepFinish callback
- Add debugging logs for diagnostics troubleshooting

🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-26 22:08:50 -04:00
Dax Raad 7e4b8c0b66 sync 2025-05-26 21:44:55 -04:00
Dax Raad c7b1ce4e6d add context.md 2025-05-26 21:38:17 -04:00
Dax Raad 22db857df4 Fix session update to use proper getter and correct operation order
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-26 21:25:20 -04:00
Dax Raad 9bf86ff076 Clean up code formatting and remove unused imports for better consistency
🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-05-26 21:22:38 -04:00
Dax Raad d3379da49c sync 2025-05-26 21:13:46 -04:00
Dax Raad a5920dfb5d title 2025-05-26 21:08:22 -04:00
Jay V fe128238f1 styles 2025-05-26 20:33:21 -04:00
Jay V 07d7a5ee7a styles 2025-05-26 19:05:17 -04:00
Jay V cf65d54b4d adding styles 2025-05-26 19:01:50 -04:00
Frank ebe91d8c2e Share: sync 2025-05-26 18:54:11 -04:00
Dax Raad 64be35213c sync 2025-05-26 18:14:36 -04:00
Dax Raad 9dc6e0bb95 sync 2025-05-26 18:10:10 -04:00
Dax Raad b2ca38a79f sync 2025-05-26 18:06:47 -04:00
Jay V e6a05a755b Merging docs and share app 2025-05-26 17:25:12 -04:00
Jay V 1ffa8b086f Adding share page 2025-05-26 17:25:12 -04:00
Dax Raad f481cd889a sync 2025-05-26 17:22:31 -04:00
Dax Raad ddc08afb5e sync 2025-05-26 17:15:47 -04:00
Dax Raad 58ac540188 sync 2025-05-26 17:15:47 -04:00
Frank fa6af1d73b Share: sync 2025-05-26 16:35:03 -04:00
Dax Raad 2b640fa036 shutdown 2025-05-26 14:52:38 -04:00
Dax Raad 29c78cbf98 fixed id generation 2025-05-26 14:36:45 -04:00
Dax Raad 7a11aad464 sync 2025-05-26 14:18:07 -04:00
Dax Raad e8fc7446a4 more tools 2025-05-26 14:09:17 -04:00
Dax Raad 5957205946 ls tool 2025-05-26 13:44:59 -04:00
Dax Raad b39b1fa9b7 sync 2025-05-26 13:39:16 -04:00
Dax Raad 98d144b1ba exit properly 2025-05-26 13:21:15 -04:00
Frank 583228c2b1 Share: sync 2025-05-26 12:40:17 -04:00
Frank f61a0997d9 Share: sync 2025-05-26 12:40:17 -04:00
Dax Raad 155de8748f sync 2025-05-26 12:40:17 -04:00
Dax Raad c0c428e6c6 sync 2025-05-26 12:40:17 -04:00
Dax Raad 117de445bc share 2025-05-26 12:40:17 -04:00
Frank e2bd83bd0d Share: sync 2025-05-26 12:40:17 -04:00
Frank 2be0d26b7b Share: fix types 2025-05-26 12:40:17 -04:00
Frank c0b03e123b Share: sync 2025-05-26 12:40:17 -04:00
Frank 590223f216 Share: sync 2025-05-26 12:40:17 -04:00
Frank 7d411092d0 Share: sync 2025-05-26 12:40:17 -04:00
Frank 50bd9e3f3d Share: sync 2025-05-26 12:40:17 -04:00
Frank 54e9b76eba Share: syc 2025-05-26 12:40:17 -04:00
Frank fb24ac103b Share: sync 2025-05-26 12:40:17 -04:00
Dax Raad 978878c4e0 add diagnostics meta 2025-05-26 12:40:17 -04:00
Dax Raad 00b78204c8 add tool tests 2025-05-26 12:40:17 -04:00
Dax Raad 6101648bea sync 2025-05-26 12:40:17 -04:00
Dax Raad 8d783143a5 sync 2025-05-26 12:40:17 -04:00
Dax Raad 4348532496 tool meta 2025-05-26 12:40:17 -04:00
Dax Raad 8fdc8119e5 toolz 2025-05-26 12:40:17 -04:00
Dax Raad f19f7cd700 codegen 2025-05-26 12:40:17 -04:00
Dax Raad f787ce1273 sync 2025-05-26 12:40:17 -04:00
Dax Raad 17ce46a0c7 openapi 2025-05-26 12:40:17 -04:00
Dax Raad 69daeba433 sync 2025-05-26 12:40:17 -04:00
Dax Raad 67c6a0d017 fix 2025-05-26 12:40:17 -04:00
Dax Raad 9f50ec5783 sync 2025-05-26 12:40:17 -04:00
Dax Raad d7ea1aa6ed sync 2025-05-26 12:40:17 -04:00
Dax Raad a56bf837a4 sync 2025-05-26 12:40:17 -04:00
Dax Raad 5ce5d0d120 process 2025-05-26 12:40:17 -04:00
Dax Raad 90cfbfe793 sync 2025-05-26 12:40:17 -04:00
Martin Palma cb19f2db09 feat: ayu theme (#60) 2025-05-26 06:45:06 -05:00
Ed Zynda 45d75bb304 feat: add support for piped input to CLI (#51) 2025-05-23 06:54:09 -05:00
Ed Zynda 72c3c5fe14 really disable history nav when completions dialog is open (#50) 2025-05-23 06:43:30 -05:00
Jay 95a352d88b Merge pull request #52 from sst/docs
Adding website
2025-05-22 15:23:09 -04:00
Jay V f300b10c98 editing docs 2025-05-22 15:10:08 -04:00
Dax Raad 379b7dfd54 switch default to claude sonnet 4
release / goreleaser (push) Has been cancelled
2025-05-22 13:17:32 -04:00
Jay V 6779f11ce6 adding other chapters 2025-05-21 19:34:50 -04:00
Jay V 0730bd74e6 Merge branch 'dev' into docs 2025-05-21 15:01:25 -04:00
Jay V 1caf8fa0c7 Moving readme to docs 2025-05-21 15:01:12 -04:00
Jay V 865048f01a Moving readme to docs 2025-05-21 14:59:09 -04:00
Jay V 1e3defdba1 adding docs site 2025-05-21 14:58:30 -04:00
Jay V 8217929cf6 adding docs site 2025-05-21 14:24:53 -04:00
Alvin Johansson 6c05542c94 docs: add clearer bedrock instructions (#40) 2025-05-20 08:23:51 -05:00
Ed Zynda 47d96e0c17 fix: disable history navigation when filepicker is open (#39) 2025-05-18 18:41:34 -05:00
phantomreactor 3c0ccf179f Codex mini (#34) 2025-05-18 08:29:53 -05:00
Ed Zynda 9282cd9520 feat: Add message history navigation with arrow keys (#30) 2025-05-17 13:35:49 -05:00
Pierre B. 5c07f1b15c fix: log pane text wrapping (#32) 2025-05-17 13:33:47 -05:00
Pierre Berube 6de39ee2e2 fix: typo 2025-05-17 08:50:30 -05:00
Pierre Berube a00bc46761 fix: split out bedrock models 2025-05-17 08:48:51 -05:00
Ed Zynda 191084817c feat: Add tool restriction flags for non-interactive mode (#29)
release / goreleaser (push) Has been cancelled
2025-05-17 08:23:13 -05:00
phantomreactor ec4ed11a6e paste images with ctrl+v (#26) 2025-05-16 14:31:50 -05:00
Ed Zynda d719c62986 feat: Add tools dialog accessible via F9 (#24)
* Add tools dialog

* Remove sorting and double items

* Update key handling
2025-05-16 10:57:35 -05:00
Ed Zynda f0540b714d fix: Show correct file paths in permission window (#25)
* Fix paths in permission window to show relative paths

* Fix paths in permission window to show actual file paths
2025-05-16 10:56:39 -05:00
Ed Zynda 55832bad31 feat: Make shell configurable via config file (#23) 2025-05-16 06:27:28 -05:00
Ed Zynda 52dafc5cf5 feat: Add non-interactive mode (#18) 2025-05-16 06:06:28 -05:00
adamdottv 7315d6d369 feat: 0-255 color support in custom themes 2025-05-15 19:02:27 -05:00
adamdottv 6abb6add0c fix: layout
release / goreleaser (push) Has been cancelled
2025-05-15 15:57:15 -05:00
adamdottv 2e63a4deff chore: cleanup 2025-05-15 15:45:22 -05:00
adamdottv df23b75059 fix: build 2025-05-15 14:49:30 -05:00
adamdottv eb96a62d11 fix: redundant status msg 2025-05-15 14:42:10 -05:00
adamdottv 6eeae3ff99 fix: build 2025-05-15 13:36:58 -05:00
mineo ea7475255e feat: support VertexAI provider (#153)
* support: vertexai

fix

fix

set default for vertexai

added comment

fix

fix

* create schema

* fix README.md

* fix order

* added pupularity

* set tools if tools is exists

restore commentout

* fix comment

* set summarizer model
2025-05-15 13:35:06 -05:00
phantomreactor a5955213ff add support to preview webp images and paste file paths
release / goreleaser (push) Has been cancelled
2025-05-15 12:55:36 -05:00
adamdottv 9f08b8ec09 fix: init ordering 2025-05-15 12:52:42 -05:00
adamdottv 59f36d7078 feat: batch tool 2025-05-15 12:44:16 -05:00
adamdottv 130ee699e0 fix: tui height 2025-05-15 12:18:28 -05:00
adamdottv 9f31df716a fix: don't limit session logs 2025-05-15 12:05:26 -05:00
adamdottv f14625615a feat: better status bar 2025-05-15 12:04:15 -05:00
Ed Zynda 2094f1f8c8 feat: Support named arguments in custom commands (#158)
* Allow multiple named args

* fix: Fix styling in multi-arguments dialog

* Remove old unused modal

* Focus on only one input at a time
2025-05-15 09:43:33 -05:00
Adictya 5caaeb8257 fix(complete-module): change completion start key to slash
release / goreleaser (push) Has been cancelled
2025-05-15 08:29:54 -05:00
Adictya 01e5c0fd7e chore(complete-module): lint 2025-05-15 08:29:54 -05:00
Adictya c85d25f77e fix(complete-module): logging 2025-05-15 08:29:54 -05:00
Adictya f342a49de0 feat(complete-module): add completions logic, dialog and providers 2025-05-15 08:29:54 -05:00
adamdottv 6478c2f87a chore: cleanup dead code 2025-05-15 07:19:17 -05:00
adamdottv 66fd38d6c1 chore: update icon in readme 2025-05-15 07:03:58 -05:00
rekram1-node e059180229 feat: add configuration persistence for model selections 2025-05-14 16:32:05 -05:00
adamdottv fdea47829b feat: codeAction tool
release / goreleaser (push) Has been cancelled
2025-05-14 14:57:47 -05:00
Dax Raad 477b93684e add screenshot 2025-05-14 15:50:25 -04:00
adamdottv e527550148 feat: docSymbols and workspaceSymbols tools
release / goreleaser (push) Has been cancelled
2025-05-14 14:40:45 -05:00
adamdottv 9c92d464c2 feat: definition and references tools 2025-05-14 14:25:15 -05:00
Dax Raad e3cb863f7b ci
release / goreleaser (push) Has been cancelled
2025-05-14 14:30:47 -04:00
Dax Raad a57f1b96c7 ci 2025-05-14 14:27:18 -04:00
adamdottv 98a2f09ae7 fix: tweak 2025-05-14 13:15:39 -05:00
adamdottv 5056a67f57 feat: session specific logs 2025-05-14 13:06:09 -05:00
adamdottv d68a8bc622 chore: remove sourcegraph tool 2025-05-14 10:42:16 -05:00
adamdottv 3004d5f6e1 fix: log display 2025-05-14 07:47:15 -05:00
adamdottv 0b2eb32c80 fix: log perf 2025-05-14 07:38:21 -05:00
adamdottv 4cbd861309 chore: cleanup 2025-05-14 06:00:34 -05:00
adamdottv 2d059776f9 chore: refactor db 2025-05-13 13:08:43 -05:00
adamdottv 15d42ba15e chore: refactoring 2025-05-13 11:34:48 -05:00
adamdottv eddc313483 chore: refactoring 2025-05-13 11:15:14 -05:00
adamdottv 5ef089a8b8 chore: refactoring 2025-05-13 11:07:34 -05:00
adamdottv 4465c17a7e chore: refactoring 2025-05-13 10:45:58 -05:00
adamdottv ff107556d7 chore: refactoring 2025-05-13 10:27:09 -05:00
adamdottv e0ed9e8f4a chore: rename 2025-05-13 10:02:39 -05:00
adamdottv e2a0554c39 chore: cleanup 2025-05-13 09:26:54 -05:00
adamdottv b488272602 chore: cleanup 2025-05-13 07:15:58 -05:00
adamdottv 10c60aedbd chore: cleanup 2025-05-13 07:04:27 -05:00
adamdottv 5fce335a29 chore: cleanup 2025-05-13 06:55:18 -05:00
adamdottv 5ef94946a5 chore: cleanup 2025-05-13 06:51:28 -05:00
adamdottv e540fc8ccb chore: refactor diff 2025-05-12 15:17:50 -05:00
adamdottv dd7dca34e2 chore: refactor diff 2025-05-12 14:48:13 -05:00
adamdottv 0a6651f090 chore: refactor agent.go 2025-05-12 14:43:12 -05:00
adamdottv c0da60e14a chore: rename coder -> primary 2025-05-12 14:32:27 -05:00
adamdottv 6d046c322d fix: show context % 2025-05-12 14:08:57 -05:00
adamdottv 75165869f4 chore: cleanup 2025-05-12 13:01:59 -05:00
adamdottv ed99df4bf6 fix: log status messages 2025-05-12 12:53:20 -05:00
adamdottv 9f52b0ace0 chore: cleanup 2025-05-12 11:38:07 -05:00
adamdottv dde9f63ece fix: timestamp formatting 2025-05-12 11:33:52 -05:00
adamdottv 05643e2090 chore: cleanup 2025-05-12 11:22:19 -05:00
adamdottv 06f91a4705 chore: cleanup 2025-05-12 10:53:13 -05:00
adamdottv 75f7a98b73 chore: cleanup 2025-05-12 10:46:14 -05:00
adamdottv 6a772d6453 chore: cleanup 2025-05-12 10:45:03 -05:00
Nicholas Hamilton e422a9cb95 Fix filepicker manual input (#146)
* fix: allows to type i while manual inputting filepath

* fix: file selection in filepicker focus mode

* remove duplicate code
2025-05-12 10:01:56 -05:00
adamdottv 8013a6a1a1 fix: build 2025-05-12 09:59:57 -05:00
Ed Zynda af021e57f6 feat: custom commands (#133)
* Implement custom commands

* Add User: prefix

* Reuse var

* Check if the agent is busy and if so report a warning

* Update README

* fix typo

* Implement user and project scoped custom commands

* Allow for $ARGUMENTS

* UI tweaks

* Update internal/tui/components/dialog/arguments.go

Co-authored-by: Kujtim Hoxha <kujtimii.h@gmail.com>

* Also search in $HOME/.opencode/commands

---------

Co-authored-by: Kujtim Hoxha <kujtimii.h@gmail.com>
2025-05-12 09:58:59 -05:00
mineo 0418d303a2 replace github.com/google/generative-ai-go with github.com/googleapis/go-genai (#138)
* replace to github.com/googleapis/go-genai

* fix history logic

* small fixes

---------

Co-authored-by: Kujtim Hoxha <kujtimii.h@gmail.com>
2025-05-12 09:56:30 -05:00
adamdottv 32da3cf431 fix: visual tweaks 2025-05-12 09:54:20 -05:00
adamdottv 0cf8042b23 wip: refactoring 2025-05-12 09:44:56 -05:00
adamdottv d314c32ed3 wip: refactoring 2025-05-12 08:43:34 -05:00
adamdottv 547af3a0f5 wip: logging improvements 2025-05-09 13:37:13 -05:00
adamdottv 3976e8adb8 chore: refactoring status updates 2025-05-08 12:03:59 -05:00
adamdottv 750d03e1df fix: log page nav 2025-05-08 07:59:15 -05:00
adamdottv 6d60787d63 feat: session manager 2025-05-08 07:58:37 -05:00
adamdottv ff30937f9f chore: logging token usage 2025-05-06 14:40:00 -05:00
adamdottv 864f2585ac feat: better logs page 2025-05-06 14:22:37 -05:00
adamdottv 09f06caaec fix: openrouter require_parameters 2025-05-06 11:17:32 -05:00
adamdottv 7e70b9ec7b feat: add qwen3 models 2025-05-06 10:19:07 -05:00
adamdottv bdf931494a fix: auto-compact logic 2025-05-06 10:03:21 -05:00
adamdottv bc15aeec4f fix: hide empty messages 2025-05-05 14:38:33 -05:00
adamdottv 63698e1c31 fix: pubsub leak and shutdown seq 2025-05-05 14:23:29 -05:00
adamdottv 9673414102 fix: anthropic non-empty blocks 2025-05-05 12:00:09 -05:00
adamdottv 4f14530e47 feat: hide tool calls 2025-05-05 11:25:34 -05:00
adamdottv 29f577d9e7 feat: show sender name and timestamp 2025-05-05 11:02:02 -05:00
adamdottv 02048c1987 fix: diagnostics visual in status bar 2025-05-05 07:04:33 -05:00
Joshua LaMorey-Salzmann 1cdb451798 Config fix correcting loose viper string check, default model now set correctly (#147) 2025-05-05 06:56:10 -05:00
adamdottv 84b8707911 fix: bedrock supports attachments 2025-05-02 15:35:24 -05:00
phantomreactor 176ef7460d feat: add support for images 2025-05-02 15:29:46 -05:00
adamdottv 01807a969c chore: cleanup and logging 2025-05-02 15:24:47 -05:00
adamdottv 8978f241a3 fix: diagnostics tool init 2025-05-02 15:24:47 -05:00
adamdottv 77f0ea69ee fix: bedrock context window 2025-05-02 15:24:47 -05:00
adamdottv b09f4eb711 fix: anthropic non-empty blocks 2025-05-02 15:24:47 -05:00
adamdottv 92813f1078 feat: compact command with auto-compact 2025-05-02 15:24:47 -05:00
adamdottv eb75f9aec7 feat: write to context.md by default 2025-05-02 15:24:47 -05:00
adamdottv 8dd89afea0 feat: better diagnostic visuals in status bar 2025-05-02 15:24:47 -05:00
adamdottv d3e01ab7fc feat: better logs page 2025-05-02 15:24:47 -05:00
adamdottv f0da8f8642 fix: wording 2025-05-01 11:54:35 -05:00
adamdottv 4ee6eddd08 fix: don't truncate task tool output 2025-05-01 11:35:54 -05:00
Kujtim Hoxha b8e57305bc add xai support (#135) 2025-05-01 11:08:26 -05:00
Aiden Cline c6c8478990 fix: tweak the logic in config to ensure that env vs file configurations merge properly (#115) 2025-05-01 11:08:17 -05:00
Garrett Ladley eadf0a8ab7 feat: test for getContextFromPaths (#105)
* feat: test for getContextFromPaths

* fix: use testify
2025-05-01 11:08:06 -05:00
Kujtim Hoxha 7d3be2773c some small fixes 2025-05-01 11:07:47 -05:00
adamdottv 6b19933dca feat: show hunk headers 2025-05-01 09:02:14 -05:00
adamdottv 43d5d88fb7 fix: pass input to EDITOR 2025-05-01 07:58:27 -05:00
adamdottv fc221d8478 fix: visual tweaks 2025-05-01 07:32:04 -05:00
adamdottv 1901265e05 fix: remove lsp tool 2025-05-01 07:28:37 -05:00
adamdottv 32b0bbd6b0 fix: remove manual lsp definition 2025-05-01 07:24:53 -05:00
adamdottv ca9e155be9 fix: logo 2025-05-01 06:43:59 -05:00
adamdottv df0ddd32a9 fix: don't mark as init 2025-05-01 06:43:30 -05:00
adamdottv 6e4b45c715 fix: logo 2025-05-01 06:36:30 -05:00
adamdottv a5553c7246 fix: minor prompt fix 2025-05-01 06:35:47 -05:00
adamdottv d02d2a0b8f feat: lsp discovery 2025-05-01 06:26:20 -05:00
adamdottv 2d9d09f57d fix: better diagnostics visual 2025-04-30 15:23:19 -05:00
adamdottv 19873ebf12 fix: lsp issues with tmp and deleted files 2025-04-30 12:20:51 -05:00
adamdottv 9eccfd4137 fix: more intuitive keybinds 2025-04-30 11:34:21 -05:00
adamdottv 51108868bf fix: minor icon tweak 2025-04-30 11:33:30 -05:00
adamdottv c394d582fc feat: custom themes 2025-04-30 11:05:59 -05:00
adamdottv c140001de5 fix: info and hint icons 2025-04-30 07:47:14 -05:00
adamdottv 7b8ad4efcd fix: status sizing 2025-04-30 07:47:10 -05:00
adamdottv e236d6477d feat: tron theme 2025-04-30 07:46:35 -05:00
adamdottv 1e171bc075 feat: tokyonight theme 2025-04-30 07:46:35 -05:00
adamdottv b245a0f3b5 feat: dracula theme 2025-04-30 07:46:35 -05:00
adamdottv 6805500c06 feat: opencode theme (default) 2025-04-30 07:46:35 -05:00
adamdottv a15f384d67 feat: monokai pro theme 2025-04-30 07:46:34 -05:00
adamdottv e8158f0b60 feat: onedark theme 2025-04-30 07:46:34 -05:00
adamdottv 5c95f247a4 feat: flexoki theme 2025-04-30 07:46:34 -05:00
adamdottv 2ba130f3a9 feat: themes 2025-04-30 07:46:34 -05:00
Adam 986110fc4d fix: allow text selection (#127) 2025-04-30 12:52:30 +02:00
Hunter Casten 7ac47f42f5 fix(openrouter): set api key from env (#129) 2025-04-30 12:50:57 +02:00
Isaac Scarrott 6168954b93 feat: Add support for OpenRouter (#92)
release / goreleaser (push) Has been cancelled
* Add support for OpenRouter as a new model provider

- Introduced `ProviderOpenRouter` in the `models` package.
- Added OpenRouter-specific models, including `GPT41`, `GPT41Mini`, `GPT4o`, and others, with their configurations and costs.
- Updated `generateSchema` to include OpenRouter as a provider.
- Added OpenRouter-specific environment variable handling (`OPENROUTER_API_KEY`) in `config.go`.
- Implemented default model settings for OpenRouter agents in `setDefaultModelForAgent`.
- Updated `getProviderAPIKey` to retrieve the OpenRouter API key.
- Extended `SupportedModels` to include OpenRouter models.
- Added OpenRouter client initialization in the `provider` package.
- Modified `processGeneration` to handle `FinishReasonUnknown` in addition to `FinishReasonToolUse`.

* [feature/openrouter-provider] Add new models and provider to schema

- Added "deepseek-chat-free" and "deepseek-r1-free" to the list of supported models in `opencode-schema.json`.

* [feature/openrouter-provider] Add OpenRouter provider support and integrate new models

- Updated README.md to include OpenRouter as a supported provider and its configuration details.
- Added `OPENROUTER_API_KEY` to environment variable configuration.
- Introduced OpenRouter-specific models in `internal/llm/models/openrouter.go` with mappings to existing cost and token configurations.
- Updated `internal/config/config.go` to set default models for OpenRouter agents.
- Extended `opencode-schema.json` to include OpenRouter models in the schema definitions.
- Refactored model IDs and names to align with OpenRouter naming conventions.

* [feature/openrouter-provider] Refactor finish reason handling and tool call logic in agent and OpenAI provider

- Simplified finish reason check in `agent.go` by removing redundant variable assignment.
- Updated `openai.go` to override the finish reason to `FinishReasonToolUse` when tool calls are present.
- Ensured consistent finish reason handling in both `send` and `stream` methods of the OpenAI provider.

[feature/openrouter-provider] Refactor finish reason handling and tool call logic in agent and OpenAI provider

- Simplified finish reason check in `agent.go` by removing redundant variable assignment.
- Updated `openai.go` to override the finish reason to `FinishReasonToolUse` when tool calls are present.
- Ensured consistent finish reason handling in both `send` and `stream` methods of the OpenAI provider.

* **[feature/openrouter-provider] Add support for custom headers in OpenAI client configuration**

- Introduced a new `extraHeaders` field in the `openaiOptions` struct to allow specifying additional HTTP headers.
- Added logic in `newOpenAIClient` to apply `extraHeaders` to the OpenAI client configuration.
- Implemented a new option function `WithOpenAIExtraHeaders` to set custom headers in `openaiOptions`.
- Updated the OpenRouter provider configuration in `NewProvider` to include default headers (`HTTP-Referer` and `X-Title`) for OpenRouter API requests.

* Update OpenRouter model config and remove unsupported models

* [feature/openrouter-provider] Update OpenRouter models and default configurations

- Added new OpenRouter models: `claude-3.5-sonnet`, `claude-3-haiku`, `claude-3.7-sonnet`, `claude-3.5-haiku`, and `claude-3-opus` in `openrouter.go`.
- Updated default agent models in `config.go`:
  - `agents.coder.model` now uses `claude-3.7-sonnet`.
  - `agents.task.model` now uses `claude-3.7-sonnet`.
  - `agents.title.model` now uses `claude-3.5-haiku`.
- Updated `opencode-schema.json` to include the new models in the allowed list for schema validation.
- Adjusted logic in `setDefaultModelForAgent` to reflect the new default models.

* [feature/openrouter-provider] Remove unused ProviderEvent emission in stream function

The changes remove the emission of a `ProviderEvent` with type `EventContentStop` in the `stream` function of the `openaiClient` implementation. This event was sent upon successful stream completion but is no longer used.
2025-04-29 13:56:49 +02:00
Kujtim Hoxha 3054f62fe8 fix diagnostics for deleted files 2025-04-28 19:37:42 +02:00
Aiden Cline 88adff87d6 feat: model selection for given provider (#57)
release / goreleaser (push) Has been cancelled
* feat: model selection for given provider

* tweak: adjust cfg validation func, remove duplicated logic, consolidate agent updating into agent.go

* tweak: make the model dialog scrollable, adjust padding slightly for modal"

* feat: add provider selection, add hints, simplify some logic, add horizontal scrolling support, additional scroll indicators"

* remove nav help

* update docs

* increase number of visible models, make horizontal scroll "wrap"

* add provider popularity rankings
2025-04-28 19:25:06 +02:00
YJG ed1070b38f feat: add azure openai models (#74) 2025-04-28 15:42:57 +02:00
Kujtim Hoxha fc97308a59 fix duplicate context
release / goreleaser (push) Has been cancelled
2025-04-27 20:43:27 +02:00
Kujtim Hoxha ff59510f90 remove unnecessary var 2025-04-27 20:34:20 +02:00
Kujtim Hoxha 0c94b9a576 fix context
release / goreleaser (push) Has been cancelled
2025-04-27 20:31:53 +02:00
Garrett Ladley 0b9088eb28 feat: configure context paths (#86)
release / goreleaser (push) Has been cancelled
2025-04-27 20:11:09 +02:00
Kujtim Hoxha 0172dcddf5 fix minor issue
release / goreleaser (push) Has been cancelled
2025-04-27 19:24:46 +02:00
Kujtim Hoxha b387a7d30b fix gemini provider
release / goreleaser (push) Has been cancelled
2025-04-27 19:12:02 +02:00
Lukáš Loukota dacaaf7465 fix: gemini tool calling 2025-04-27 19:12:02 +02:00
Kujtim Hoxha c7c723ee7f small glob fixes 2025-04-27 18:01:31 +02:00
isaac-scarrott 63617f4345 [feature/ripgrep-glob] Add ripgrep-based file globbing to improve performance
- Introduced `globWithRipgrep` function to perform file globbing using the `rg` (ripgrep) command.
- Updated `globFiles` to prioritize ripgrep-based globbing and fall back to doublestar-based globbing if ripgrep fails.
- Added logic to handle ripgrep command execution, output parsing, and filtering of hidden files.
- Ensured results are sorted by path length and limited to the specified maximum number of matches.
- Modified imports to include `os/exec` and `bytes` for ripgrep integration.
2025-04-27 18:01:31 +02:00
Kujtim Hoxha b362dd2182 fix provider config
release / goreleaser (push) Has been cancelled
2025-04-27 14:44:40 +02:00
Sam Ottenhoff 0e783fbbfa Handle new Cursor rules format
1. Check if a path ends with a slash (/)
2. If it does, treat it as a directory and read all files within it
3. For directories like .cursor/rules/, it will scan all files and include their content in the prompt
4. Each file from a directory will be prefixed with "# From filename" for clarity
2025-04-27 14:17:06 +02:00
Kujtim Hoxha 8cad545138 fix retry warning
release / goreleaser (push) Has been cancelled
2025-04-27 14:08:09 +02:00
Garrett Mitchell Ladley 108ba90f13 feat: simpler diff implementation 2025-04-27 13:56:57 +02:00
Fuad f83e9980f0 use workingDir if shellInstance is nil otherwise use cwd if shellInstance is not nil 2025-04-27 13:46:59 +02:00
Fuad 869dc96ac1 use provided workingg dir 2025-04-27 13:46:59 +02:00
Fuad 024118757d Fix nil pointer dereference in GetPersistentShell
Added nil check in GetPersistentShell before accessing
shellInstance.isAlive
to prevent panic when newPersistentShell returns nil due to shell
startup
errors. This resolves the "invalid memory address or nil pointer
dereference"
error that was occurring in the shell tool.
2025-04-27 13:46:59 +02:00
Kujtim Hoxha 7710a5c8cb fix acc error
release / goreleaser (push) Has been cancelled
2025-04-25 21:58:14 +02:00
Kujtim Hoxha e0da02457b small fixes 2025-04-25 14:42:47 +02:00
Hunter Casten 8f31eb3ba0 feat(groq): add support for Groq using the OpenAI provider 2025-04-25 11:11:52 +02:00
Kujtim Hoxha bd986442e8 remove tool timeout 2025-04-24 22:35:17 +02:00
Dax Raad 99099458ed add more installation options 2025-04-24 16:34:57 -04:00
Kujtim Hoxha 36a7f2fb51 try fix 2025-04-24 22:27:51 +02:00
Kujtim Hoxha f6427a32dc try fix 2025-04-24 22:27:51 +02:00
Kujtim Hoxha 75170dac12 change db driver 2025-04-24 22:27:51 +02:00
Kujtim Hoxha f59ee986a4 fix kitty issues 2025-04-24 19:57:04 +02:00
Dax Raad c8f1148b8e back to disablign cgo 2025-04-24 12:46:11 -04:00
Dax Raad 30586e2710 force CGO
release / goreleaser (push) Has been cancelled
2025-04-24 12:34:55 -04:00
Dax Raad 484dff2677 turn on cgo
release / goreleaser (push) Has been cancelled
2025-04-24 12:30:33 -04:00
Dax Raad e35a914ccc fix version ldflags
release / goreleaser (push) Has been cancelled
2025-04-24 12:26:42 -04:00
Kujtim Hoxha 6e33817b30 change package name 2025-04-24 18:26:16 +02:00
Kujtim Hoxha dcc3012f1b change additions/removals 2025-04-24 16:40:36 +02:00
Kujtim Hoxha 5c7850576b small fixes 2025-04-24 16:40:36 +02:00
Kujtim Hoxha 4c9ee89ff3 update mainter email 2025-04-24 16:40:36 +02:00
Kujtim Hoxha b90d7e3a9b small changes 2025-04-24 16:40:36 +02:00
Kujtim Hoxha a29f155feb remove edit/normal mode 2025-04-24 16:40:36 +02:00
Dax Raad e3419bb8b3 sync 2025-04-22 21:29:32 -04:00
Dax Raad dd79157a62 remove cache
release / goreleaser (push) Has been cancelled
2025-04-22 21:23:20 -04:00
Dax Raad ebeb8c6973 sync
release / goreleaser (push) Has been cancelled
2025-04-22 21:21:53 -04:00
Dax Raad c7ca4ababf attempt cache builds 2025-04-22 21:20:35 -04:00
Dax d9d6dbcd9a CI (#43)
release / goreleaser (push) Has been cancelled
* sync

* ci test

* ci test

* tag

* sync

* sync

* ci

* sync

* enable cgo

* sync

* add back brew

* switch to main
2025-04-22 21:16:14 -04:00
Kujtim Hoxha fe98959d41 Merge pull request #38 from rgodha24/fix-provider-defaults
fix: set provider defaults correctly in AWS projects
2025-04-22 12:15:27 +02:00
Rohan Godha 7ee99cbd99 fix: set provider defaults correctly in AWS projects 2025-04-22 00:53:05 -04:00
Kujtim Hoxha 1367d34159 Merge pull request #34 from shreyassanthu77/main 2025-04-22 00:06:03 +02:00
Shreyas Mididoddi 1234559d0b look for $HOME/.config for config in addition to $XDG_CONFIG_HOME/ 2025-04-22 00:49:23 +05:30
Kujtim Hoxha 893ff09cdb Merge pull request #27 from kujtimiihoxha/opencode
OpenCode - Initial Implementation
2025-04-21 19:59:35 +02:00
Kujtim Hoxha 6344673f23 init command 2025-04-21 19:53:55 +02:00
Kujtim Hoxha 4a9496e9df prevent the editor when agent busy 2025-04-21 16:50:10 +02:00
Kujtim Hoxha 68d518a639 small things 2025-04-21 16:24:38 +02:00
Kujtim Hoxha ece6959947 update readme 2025-04-21 16:22:52 +02:00
Kujtim Hoxha cf8d32c091 add description 2025-04-21 15:52:32 +02:00
Kujtim Hoxha 94271b528f config validation 2025-04-21 14:29:28 +02:00
Kujtim Hoxha 0094dd728c remove old logs 2025-04-21 13:46:32 +02:00
Kujtim Hoxha dc0894025e fix the memory bug 2025-04-21 13:42:29 +02:00
Kujtim Hoxha 77cf4bf688 fix anthropic 2025-04-21 13:42:29 +02:00
Kujtim Hoxha 39375ed352 add context to the prompt 2025-04-21 13:42:29 +02:00
Kujtim Hoxha baff25ad6b improve cache 2025-04-21 13:42:29 +02:00
Kujtim Hoxha 6411617f7f initial tool call stream 2025-04-21 13:42:29 +02:00
Kujtim Hoxha 304d666856 lsp improvements 2025-04-21 13:42:29 +02:00
Kujtim Hoxha 20c28668ca add bedrock model 2025-04-21 13:42:29 +02:00
Kujtim Hoxha d6ab3ab3e9 small fixes 2025-04-21 13:42:29 +02:00
Kujtim Hoxha b7e86f61cd implement patch, update ui, improve rendering 2025-04-21 13:42:27 +02:00
Kujtim Hoxha 0768c372c9 update logs 2025-04-21 13:42:02 +02:00
Kujtim Hoxha 7c8ec7d5ca add license 2025-04-21 13:42:02 +02:00
Kujtim Hoxha cdc80c64e1 small improvements 2025-04-21 13:42:02 +02:00
Kujtim Hoxha 524d2080b0 small fixes 2025-04-21 13:42:02 +02:00
Kujtim Hoxha d6035dc40c Update agent prompt, improve TUI patch UI, remove obsolete tool tests
- Replace and expand agent coder prompt for clarity and safety
- Add patch tool and TUI dialog support for patch diffs
- Sort sidebar modified files by name
- Remove Bash/Edit/Sourcegraph/Write tool tests

🤖 Generated with opencode
Co-Authored-By: opencode <noreply@opencode.ai>
2025-04-21 13:42:02 +02:00
Kujtim Hoxha 91b1a8f064 rename to opencode 2025-04-21 13:42:02 +02:00
Kujtim Hoxha e5eea7b9bf reimplement agent,provider and add file history 2025-04-21 13:42:00 +02:00
Kujtim Hoxha 8082c1e386 update gitignore 2025-04-21 13:41:27 +02:00
Kujtim Hoxha 49b0be8f48 minor fixes 2025-04-21 13:41:27 +02:00
Kujtim Hoxha 959a011765 fix segment diff and add new theme 2025-04-21 13:41:27 +02:00
Kujtim Hoxha d4f7d48594 fix diff 2025-04-21 13:41:27 +02:00
Kujtim Hoxha 555361d8da remove node dependency and implement diff format 2025-04-21 13:41:27 +02:00
Kujtim Hoxha b3fde7a583 handle errors correctly in the other tools 2025-04-21 13:41:27 +02:00
Kujtim Hoxha e17d587bdc handle errors correctly in the edit tool 2025-04-21 13:41:27 +02:00
Kujtim Hoxha 38d8e6a649 handle errros correctly in the bash tool 2025-04-21 13:41:27 +02:00
Kujtim Hoxha 8bcf9dde55 handle errors correctly in the agent tool 2025-04-21 13:41:27 +02:00
Kujtim Hoxha 312688a809 cleanup diff, cleanup agent 2025-04-21 13:41:27 +02:00
Kujtim Hoxha a8c22808dc cleanup app, config and root 2025-04-21 13:41:25 +02:00
Kujtim Hoxha 5f955a460d cleanup config 2025-04-21 13:40:35 +02:00
Kujtim Hoxha f48c3a00ba wip files 2025-04-21 13:38:42 +02:00
Kujtim Hoxha 1990da9d4a add initial git support 2025-04-21 13:38:42 +02:00
Kujtim Hoxha 79deb616d7 implement nested tool calls and initial setup for result metadata 2025-04-21 13:38:42 +02:00
Kujtim Hoxha 6a5e910883 add initial message handling 2025-04-21 13:38:42 +02:00
Kujtim Hoxha 961af93479 add initial mock sidebar 2025-04-21 13:38:42 +02:00
Kujtim Hoxha 296266cdf7 intiial layout 2025-04-21 13:38:42 +02:00
Kujtim Hoxha 48866db7ac Merge pull request #30 from jdlms/update/config-GPT4.1
OpenAI model config changed to GPT-4.1
2025-04-15 11:54:38 +02:00
jdlms f911d957ca OpenAI model config changed to GPT-4.1 2025-04-15 09:36:47 +02:00
Kujtim Hoxha 0fa07e4b20 Merge pull request #28 from naxodev/refactor/improve-process-management
refactor: use context for automatic lsp process cleanup
2025-04-13 12:41:55 +02:00
Nacho Vazquez 619fb42791 refactor: use context for automatic lsp process cleanup 2025-04-12 12:43:23 -03:00
Kujtim Hoxha a6c8769290 small change 2025-04-11 13:21:41 +02:00
Kujtim Hoxha 7d3bf2d02f fix cancell 2025-04-10 15:27:42 +02:00
Kujtim Hoxha e7e57c4c3d fix logs and add cancellation 2025-04-10 13:29:44 +02:00
Kujtim Hoxha 7056391f5f add logs border title 2025-04-09 20:10:40 +02:00
Kujtim Hoxha 71f342e78f default the region to us 2025-04-09 20:05:22 +02:00
Kujtim Hoxha 45e079a895 minor fixes 2025-04-09 20:04:44 +02:00
Kujtim Hoxha 77a5f68977 Merge pull request #25 from kujtimiihoxha/cleanup-logs-status
Cleanup Logs and Status
2025-04-09 19:19:45 +02:00
Kujtim Hoxha 7b8b9bdc29 small fixes 2025-04-09 19:18:51 +02:00
Kujtim Hoxha 58a7aee0c4 finish logs page 2025-04-09 19:07:39 +02:00
Kujtim Hoxha 2408a13138 remove logs 2025-04-09 17:51:00 +02:00
Kujtim Hoxha 333e6d1238 Merge pull request #26 from kujtimiihoxha/bedrock
Add initial support for bedrock
2025-04-09 17:49:24 +02:00
Kujtim Hoxha 753c468476 add bedrock support 2025-04-09 17:45:41 +02:00
Kujtim Hoxha a061dca915 cleanup retry 2025-04-08 20:46:40 +02:00
Kujtim Hoxha ceccfad49d Merge pull request #22 from adamdottv/adam/retries
fix(anthropic): better 429/529 handling
2025-04-08 20:32:57 +02:00
Kujtim Hoxha a4fc735617 Merge pull request #24 from kujtimiihoxha/cleanup-tools
Cleanup tools
2025-04-08 19:42:59 +02:00
Kujtim Hoxha c571283ac2 fix typo 2025-04-08 19:41:21 +02:00
Kujtim Hoxha 94923948e1 structure tools the same
- add some tests
- fix some tests
- change how we handle permissions
2025-04-08 19:15:23 +02:00
adamdottv 4385fb3219 fix: status messages 2025-04-08 11:45:26 -05:00
Kujtim Hoxha f463ce6694 improve status message handling 2025-04-07 19:43:31 +02:00
adamdottv 57a2210d8d fix: handle anthropic 429s 2025-04-07 10:43:54 -05:00
Kujtim Hoxha 5acf0cba60 update readme 2025-04-07 15:37:47 +02:00
Kujtim Hoxha a6db4f652c remove test code 2025-04-07 12:56:54 +02:00
adamdottv 50d8fbbb40 fix(anthropic): increase max retries 2025-04-05 15:07:43 -05:00
Kujtim Hoxha b8383f5590 Merge pull request #21 from adamdottv/adam/anthropic-empty-messages 2025-04-05 09:32:07 +02:00
adamdottv 781b296180 fix(anthropic): skip empty messages 2025-04-04 14:33:55 -05:00
Kujtim Hoxha 6419973667 Enhance bash tool security and improve permission dialog UI
- Expand safe command list with common dev tools (git, go, node, python, etc.)
- Improve multi-word command detection for better security checks
- Add scrollable viewport to permission dialog for better diff viewing
- Fix command batching in TUI update to properly handle multiple commands

🤖 Generated with termai
Co-Authored-By: termai <noreply@termai.io>
2025-04-04 15:41:25 +02:00
Kujtim Hoxha 8f8b403bbc Make tool error results visually distinct with red border
- Change tool result border color to red when displaying errors
- Keep green border for successful results
- Improve visual distinction between error and success states

🤖 Generated with termai
Co-Authored-By: termai <noreply@termai.io>
2025-04-04 15:08:32 +02:00
Kujtim Hoxha fa5840cf75 Modernize min/max usage in permission dialog
- Replace if statements with direct min/max function calls
- Fix linter hint about using modern min/max functions
- Simplify code for better readability

🤖 Generated with termai
Co-Authored-By: termai <noreply@termai.io>
2025-04-04 15:05:48 +02:00
Kujtim Hoxha 1d467dfda3 Fix status message clearing issue
- Add missing case for ClearStatusMsg in main TUI update function
- Ensures status messages are properly cleared after timeout

🤖 Generated with termai
Co-Authored-By: termai <noreply@termai.io>
2025-04-04 15:04:58 +02:00
Kujtim Hoxha 3aef4dedcf Improve LSP diagnostics handling for file operations
- Split LSP file notification into separate functions
- Add waitForLspDiagnostics function to wait for diagnostics after file changes
- Move LSP diagnostics to after file operations in edit and write tools
- Fix string splitting in diff generation
- Reduce diagnostics timeout from 10 to 5 seconds

🤖 Generated with termai
Co-Authored-By: termai <noreply@termai.io>
2025-04-04 15:03:50 +02:00
Kujtim Hoxha a1f6147506 Add auto-removal of status bar messages after timeout
🤖 Generated with termai
Co-Authored-By: termai <noreply@termai.io>
2025-04-04 14:52:30 +02:00
Kujtim Hoxha b28c1e0c03 Improve diff display with colored formatting in permission dialogs
- Add colored formatting for diff display (green for additions, red for removals)
- Create a dedicated formatDiff function to handle diff styling
- Restructure permission dialog render function for better organization
- Apply custom styling to different line types in diffs

🤖 Generated with termai
Co-Authored-By: termai <noreply@termai.io>
2025-04-04 14:45:02 +02:00
Kujtim Hoxha ef15976f5d Make permission dialog height dynamic based on content
- Adjust dialog height for bash commands based on content length
- Reduce default dialog size for bash commands to be more compact
- Add strings import for string splitting

🤖 Generated with termai
Co-Authored-By: termai <noreply@termai.io>
2025-04-04 14:40:41 +02:00
Kujtim Hoxha c185dc84d6 Enhance UI feedback and improve file diff visualization
- Improve diff display in permission dialogs with better formatting
- Add visual indicators for focus changes in permission dialogs
- Increase diagnostics timeout from 5 to 10 seconds
- Fix write tool to show proper diffs for existing files
- Update status component to properly handle messages

🤖 Generated with termai
Co-Authored-By: termai <noreply@termai.io>
2025-04-04 14:36:57 +02:00
Kujtim Hoxha 6bb1c84f7f Improve Sourcegraph tool with context window and fix diagnostics
- Add context_window parameter to control code context display
- Fix LSP diagnostics notification handling with proper async waiting
- Switch to keyword search pattern for better results
- Add Sourcegraph tool to task agent

🤖 Generated with termai
Co-Authored-By: termai <noreply@termai.io>
2025-04-04 14:23:08 +02:00
Kujtim Hoxha eb9877ee20 add sourcegraph tool 2025-04-04 13:31:21 +02:00
Kujtim Hoxha f8e05a0d9a small improvements to the prompt 2025-04-03 20:30:30 +02:00
Kujtim Hoxha 49b593d9dd small fixes 2025-04-03 19:50:31 +02:00
Kujtim Hoxha 230917bbbf add termai config 2025-04-03 17:40:05 +02:00
Kujtim Hoxha 795b369219 small fixes 2025-04-03 17:38:28 +02:00
Kujtim Hoxha cfdd687216 add initial lsp support 2025-04-03 17:23:41 +02:00
Kujtim Hoxha afd9ad0560 rework llm 2025-04-01 13:38:54 +02:00
Kujtim Hoxha 904061c243 additional tools 2025-03-26 01:12:30 +01:00
Kujtim Hoxha 005b8ac167 initial working agent 2025-03-24 11:47:39 +01:00
Kujtim Hoxha e7258e38ae initial agent setup 2025-03-23 22:25:31 +01:00
Kujtim Hoxha 8daa6e774a add initial stuff 2025-03-23 19:19:08 +01:00
Kujtim Hoxha 796bbf4d66 small size fix and colors added 2025-03-23 15:17:51 +01:00
Kujtim Hoxha 7844cacb25 add help 2025-03-23 15:00:12 +01:00
Kujtim Hoxha 4b0ea68d7a initial 2025-03-21 18:20:28 +01:00
406 changed files with 35328 additions and 123008 deletions
-16
View File
@@ -1,16 +0,0 @@
# ── Generated build artifacts ────────────────────────────────────────────────
# dist/ holds elc transpiler output (*.c, *.elh) plus the generated decls header.
# CI consumes these (the "Generate ELP master declarations header" step greps
# dist/*.c), so they stay TRACKED. But they are machine-generated and must never
# bloat a review. A single soul change regenerates dist/neuron.c + dist/soul.c =
# ~57,000 lines of churn that buries the real ~few-hundred-line source diff and
# poisons both human review and the agent review pipeline.
#
# -diff → git emits "Binary files differ" instead of the text diff
# linguist-generated → Gitea collapses the file in the PR view + drops it from
# language stats
#
# Net effect: PRs show only the real .el/source changes; the build is untouched.
dist/** -diff linguist-generated
neuron-built -diff linguist-generated
dist/neuron -diff linguist-generated
-349
View File
@@ -1,349 +0,0 @@
name: Neuron Soul CI
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch:
# Serialize all activity on the single GCE runner.
# With build+deploy in the same workflow, a new push queues a single
# workflow instance — not two competing ones — so the deploy job is
# never orphaned by a cancellation race.
concurrency:
group: neuron-runner
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Free disk space
run: |
df -h /
docker system prune -af --volumes 2>/dev/null || true
df -h /
- name: Checkout
uses: actions/checkout@v4
- name: Install build dependencies
run: |
apt-get update -qq
apt-get install -y gcc libcurl4-openssl-dev apt-transport-https ca-certificates
echo "deb [trusted=yes] https://packages.cloud.google.com/apt cloud-sdk main" \
> /etc/apt/sources.list.d/google-cloud-sdk.list
apt-get update -qq && apt-get install -y google-cloud-cli
- name: Download El runtime from Artifact Registry
env:
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
run: |
echo "${GCP_SA_KEY}" > /tmp/gcp-key.json
gcloud auth activate-service-account --key-file=/tmp/gcp-key.json
gcloud config set project neuron-785695
rm -rf /opt/el/runtime
mkdir -p /opt/el/runtime
# Get latest version of each runtime package (elc/elb not needed — we compile
# dist/soul.c directly; running elb on Linux OOM-kills the runner, and we
# always use the repo's pre-built soul.c anyway).
get_latest() {
gcloud artifacts versions list \
--repository=foundation-prod \
--location=us-central1 \
--project=neuron-785695 \
--package="$1" \
--sort-by="~createTime" \
--limit=1 \
--format="value(name)" 2>/dev/null | awk -F/ '{print $NF}'
}
RC_VER=$(get_latest el-runtime-c)
RH_VER=$(get_latest el-runtime-h)
echo "Downloading runtime@${RC_VER}"
gcloud artifacts generic download \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-runtime-c --version="${RC_VER}" \
--destination=/opt/el/runtime/
gcloud artifacts generic download \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-runtime-h --version="${RH_VER}" \
--destination=/opt/el/runtime/
mv /opt/el/runtime/el_runtime.c* /opt/el/runtime/el_runtime.c 2>/dev/null || true
mv /opt/el/runtime/el_runtime.h* /opt/el/runtime/el_runtime.h 2>/dev/null || true
echo "El runtime ready: $(ls /opt/el/runtime/)"
- name: Build neuron soul binary
run: |
RUNTIME=/opt/el/runtime
# Compile the self-contained translation unit directly from dist/soul.c.
# dist/soul.c is the authoritative combined unit maintained in the repo —
# regenerated on macOS by running elb (which succeeds on arm64/macOS ld but
# fails on Linux due to duplicate strong symbols). We skip the elb step here
# entirely: elb on Linux would OOM the runner (elc uses 24GB+ virtual memory
# on a 16GB host) and we always restore from the repo's soul.c anyway.
mkdir -p dist
cc -O2 -DHAVE_CURL \
-I$RUNTIME \
dist/soul.c \
$RUNTIME/el_runtime.c \
-lssl -lcrypto -lcurl -lpthread -lm \
-o dist/neuron
# Strip debug symbols and non-essential symbol table entries.
# -s removes the symbol table + relocation info (max size reduction).
# Keeps the binary functional; debuggability is preserved via source + CI logs.
strip -s dist/neuron
ls -lh dist/neuron
- name: Smoke test
run: |
file dist/neuron
timeout 3 dist/neuron --help 2>&1 || true
echo "smoke test complete"
- name: Publish neuron binary
if: github.event_name == 'push'
env:
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
run: |
VERSION="${GITHUB_SHA:0:8}"
gcloud artifacts generic upload \
--repository=foundation-prod \
--location=us-central1 \
--project=neuron-785695 \
--package=neuron-soul \
--version="${VERSION}" \
--source=dist/neuron
echo "Published neuron-soul@${VERSION}"
rm -f /tmp/gcp-key.json
deploy:
runs-on: ubuntu-latest
needs: build
# Only deploy on push to main, not on PRs or manual workflow_dispatch without intent.
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
env:
USE_GKE_GCLOUD_AUTH_PLUGIN: "True"
steps:
- name: Free disk space
run: |
df -h /
docker system prune -af --volumes 2>/dev/null || true
rm -rf /tmp/.act-* /tmp/act-* 2>/dev/null || true
df -h /
- name: Checkout
uses: actions/checkout@v4
- name: Install dependencies
run: |
apt-get update -qq
apt-get install -y --no-install-recommends \
ca-certificates curl apt-transport-https kubectl
echo "deb [trusted=yes] https://packages.cloud.google.com/apt cloud-sdk main" \
> /etc/apt/sources.list.d/google-cloud-sdk.list
apt-get update -qq && apt-get install -y google-cloud-cli google-cloud-cli-gke-gcloud-auth-plugin
- name: Authenticate to GCP
env:
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
run: |
echo "${GCP_SA_KEY}" > /tmp/gcp-key.json
gcloud auth activate-service-account --key-file=/tmp/gcp-key.json
gcloud config set project neuron-785695
gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
- name: Get GKE credentials
run: |
gcloud container clusters get-credentials neuron-platform \
--region=us-central1 \
--project=neuron-785695
- name: Determine image tag and slot
id: vars
run: |
# GITEA_SHA is set by the Gitea runner; fall back to GITHUB_SHA for
# compatibility with older Forgejo/Gitea versions.
RAW_SHA="${GITEA_SHA:-${GITHUB_SHA:-}}"
SHA="${RAW_SHA:0:8}"
if [ -z "$SHA" ]; then
# Last resort: read from git directly
SHA=$(git rev-parse --short=8 HEAD 2>/dev/null || echo "unknown")
fi
IMAGE="us-central1-docker.pkg.dev/neuron-785695/neuron-api/neuron-soul:${SHA}"
echo "sha=${SHA}" >> "$GITEA_OUTPUT"
echo "image=${IMAGE}" >> "$GITEA_OUTPUT"
# Determine which slot is currently idle (0 replicas = idle slot)
# If both are at 0 (fresh deploy), default to blue
BLUE_REPLICAS=$(kubectl get deployment/neuron-mcp-blue \
-n neuron-prod \
-o jsonpath='{.spec.replicas}' 2>/dev/null || echo "0")
GREEN_REPLICAS=$(kubectl get deployment/neuron-mcp-green \
-n neuron-prod \
-o jsonpath='{.spec.replicas}' 2>/dev/null || echo "0")
echo " Blue replicas: ${BLUE_REPLICAS}"
echo " Green replicas: ${GREEN_REPLICAS}"
if [ "${GREEN_REPLICAS}" -eq 0 ] && [ "${BLUE_REPLICAS}" -gt 0 ]; then
SLOT="green"
elif [ "${BLUE_REPLICAS}" -eq 0 ] && [ "${GREEN_REPLICAS}" -gt 0 ]; then
SLOT="blue"
else
# Fresh cluster or both idle — deploy to blue first
SLOT="blue"
fi
echo "slot=${SLOT}" >> "$GITEA_OUTPUT"
echo " Deploying to slot: ${SLOT}"
- name: Prepare build artifacts
run: |
# Pre-download soul binary and El SDK so the Dockerfile can COPY them
# from the build context instead of authenticating inside the build.
mkdir -p build-artifacts
# ── soul binary ────────────────────────────────────────────────────────
# The build job (same workflow run) just published this version.
SOUL_VER=$(gcloud artifacts versions list \
--repository=foundation-prod \
--location=us-central1 \
--project=neuron-785695 \
--package=neuron-soul \
--sort-by="~createTime" \
--limit=1 \
--format="value(name)" 2>/dev/null | awk -F/ '{print $NF}')
echo "Downloading neuron-soul@${SOUL_VER}"
gcloud artifacts generic download \
--repository=foundation-prod \
--location=us-central1 \
--project=neuron-785695 \
--package=neuron-soul \
--version="${SOUL_VER}" \
--destination=build-artifacts/
mv build-artifacts/neuron* build-artifacts/neuron 2>/dev/null || true
chmod +x build-artifacts/neuron
# ── El SDK (for engram source compilation inside the Docker build) ────
ELC_VER=$(gcloud artifacts versions list \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-elc --sort-by="~createTime" --limit=1 \
--format="value(name)" 2>/dev/null | awk -F/ '{print $NF}')
gcloud artifacts generic download \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-elc --version="${ELC_VER}" --destination=build-artifacts/
mv build-artifacts/elc* build-artifacts/elc 2>/dev/null || true
chmod +x build-artifacts/elc
RC_VER=$(gcloud artifacts versions list \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-runtime-c --sort-by="~createTime" --limit=1 \
--format="value(name)" 2>/dev/null | awk -F/ '{print $NF}')
gcloud artifacts generic download \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-runtime-c --version="${RC_VER}" --destination=build-artifacts/
mv build-artifacts/el_runtime.c* build-artifacts/el_runtime.c 2>/dev/null || true
RH_VER=$(gcloud artifacts versions list \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-runtime-h --sort-by="~createTime" --limit=1 \
--format="value(name)" 2>/dev/null | awk -F/ '{print $NF}')
gcloud artifacts generic download \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-runtime-h --version="${RH_VER}" --destination=build-artifacts/
mv build-artifacts/el_runtime.h* build-artifacts/el_runtime.h 2>/dev/null || true
echo "Build artifacts ready:"
ls -lh build-artifacts/
- name: Clone engram source for Docker build context
run: |
# The Dockerfile builds engram from source (no published AR package).
# Clone the engram repo into ./engram/ so it's available in the build context.
git clone http://34.31.145.131/neuron-technologies/engram.git \
--depth=1 --branch=main \
engram
echo "Engram source ready at ./engram/src/server.el"
- name: Build and push Docker image
run: |
IMAGE="${{ steps.vars.outputs.image }}"
echo "Building ${IMAGE}..."
docker build \
--tag "${IMAGE}" \
--tag "us-central1-docker.pkg.dev/neuron-785695/neuron-api/neuron-soul:latest" \
.
echo "Pushing ${IMAGE}..."
docker push "${IMAGE}"
docker push "us-central1-docker.pkg.dev/neuron-785695/neuron-api/neuron-soul:latest"
- name: Blue-green deploy to GKE
run: |
chmod +x scripts/blue-green-deploy.sh
scripts/blue-green-deploy.sh \
--image "${{ steps.vars.outputs.image }}" \
--slot "${{ steps.vars.outputs.slot }}"
- name: Update infrastructure manifests
if: success()
env:
INFRA_GIT_TOKEN: ${{ secrets.INFRA_GIT_TOKEN }}
run: |
SLOT="${{ steps.vars.outputs.slot }}"
if [ "$SLOT" = "blue" ]; then IDLE="green"; else IDLE="blue"; fi
git clone "http://${INFRA_GIT_TOKEN}@34.31.145.131/neuron-technologies/infrastructure.git" \
--depth=1 --branch=main /tmp/infra-update
cd /tmp/infra-update
DEPLOY_DIR="platform/k8s/neuron-mcp"
sed -i "s/^ replicas: .*/ replicas: 1/" "${DEPLOY_DIR}/deployment-${SLOT}.yaml"
sed -i "s/^ replicas: .*/ replicas: 0/" "${DEPLOY_DIR}/deployment-${IDLE}.yaml"
echo " deployment-${SLOT}.yaml: replicas set to 1"
echo " deployment-${IDLE}.yaml: replicas set to 0"
git config user.email "ci@neurontechnologies.ai"
git config user.name "Neuron CI"
git add "${DEPLOY_DIR}/deployment-blue.yaml" "${DEPLOY_DIR}/deployment-green.yaml"
git diff --staged --quiet && { echo "No manifest changes needed"; exit 0; }
git commit -m "ci: neuron-mcp replica sync after blue-green swap to ${SLOT}"
git push origin main
echo "Infrastructure manifests updated: ${SLOT}=1, ${IDLE}=0"
- name: Verify deployment
run: |
SLOT="${{ steps.vars.outputs.slot }}"
echo "Verifying neuron-mcp-${SLOT} is healthy..."
kubectl rollout status deployment/"neuron-mcp-${SLOT}" \
--namespace=neuron-prod \
--timeout=8m
echo "Active service endpoints:"
kubectl get endpoints neuron-mcp -n neuron-prod
echo "Pod status:"
kubectl get pods -n neuron-prod -l app=neuron-mcp
- name: Cleanup
if: always()
run: rm -f /tmp/gcp-key.json
-242
View File
@@ -1,242 +0,0 @@
name: Deploy Soul to GKE (manual)
# MANUAL OVERRIDE ONLY — push-triggered deploys now run as the 'deploy' job
# in ci.yaml (needs: build), which eliminates the two-workflow concurrency
# race that was cancelling queued deploy runs.
#
# Use this workflow only when you need to deploy a specific slot manually
# (e.g. rollback, force a slot override) without triggering a full CI build.
on:
workflow_dispatch:
inputs:
slot:
description: "Target blue-green slot (blue or green)"
required: false
default: "green"
# Manual deploys still share the runner serialization group.
concurrency:
group: neuron-runner
cancel-in-progress: false
jobs:
deploy:
runs-on: ubuntu-latest
env:
USE_GKE_GCLOUD_AUTH_PLUGIN: "True"
steps:
- name: Free disk space
run: |
df -h /
docker system prune -af --volumes 2>/dev/null || true
rm -rf /tmp/.act-* /tmp/act-* 2>/dev/null || true
df -h /
- name: Checkout
uses: actions/checkout@v4
- name: Install dependencies
run: |
apt-get update -qq
apt-get install -y --no-install-recommends \
ca-certificates curl apt-transport-https kubectl
echo "deb [trusted=yes] https://packages.cloud.google.com/apt cloud-sdk main" \
> /etc/apt/sources.list.d/google-cloud-sdk.list
apt-get update -qq && apt-get install -y google-cloud-cli google-cloud-cli-gke-gcloud-auth-plugin
- name: Authenticate to GCP
env:
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
run: |
echo "${GCP_SA_KEY}" > /tmp/gcp-key.json
gcloud auth activate-service-account --key-file=/tmp/gcp-key.json
gcloud config set project neuron-785695
gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
- name: Get GKE credentials
run: |
gcloud container clusters get-credentials neuron-platform \
--region=us-central1 \
--project=neuron-785695
- name: Determine image tag and slot
id: vars
run: |
# GITEA_SHA is set by the Gitea runner; fall back to GITHUB_SHA for
# compatibility with older Forgejo/Gitea versions.
RAW_SHA="${GITEA_SHA:-${GITHUB_SHA:-}}"
SHA="${RAW_SHA:0:8}"
if [ -z "$SHA" ]; then
# Last resort: read from git directly
SHA=$(git rev-parse --short=8 HEAD 2>/dev/null || echo "unknown")
fi
IMAGE="us-central1-docker.pkg.dev/neuron-785695/neuron-api/neuron-soul:${SHA}"
echo "sha=${SHA}" >> "$GITEA_OUTPUT"
echo "image=${IMAGE}" >> "$GITEA_OUTPUT"
# Determine which slot is currently idle (0 replicas = idle slot)
# If both are at 0 (fresh deploy), default to blue
BLUE_REPLICAS=$(kubectl get deployment/neuron-mcp-blue \
-n neuron-prod \
-o jsonpath='{.spec.replicas}' 2>/dev/null || echo "0")
GREEN_REPLICAS=$(kubectl get deployment/neuron-mcp-green \
-n neuron-prod \
-o jsonpath='{.spec.replicas}' 2>/dev/null || echo "0")
echo " Blue replicas: ${BLUE_REPLICAS}"
echo " Green replicas: ${GREEN_REPLICAS}"
# Use workflow_dispatch override if provided, otherwise pick the idle slot
if [ "${{ github.event.inputs.slot }}" != "" ]; then
SLOT="${{ github.event.inputs.slot }}"
elif [ "${GREEN_REPLICAS}" -eq 0 ] && [ "${BLUE_REPLICAS}" -gt 0 ]; then
SLOT="green"
elif [ "${BLUE_REPLICAS}" -eq 0 ] && [ "${GREEN_REPLICAS}" -gt 0 ]; then
SLOT="blue"
else
# Fresh cluster — deploy to blue first
SLOT="blue"
fi
echo "slot=${SLOT}" >> "$GITEA_OUTPUT"
echo " Deploying to slot: ${SLOT}"
- name: Prepare build artifacts
run: |
# Pre-download soul binary and El SDK so the Dockerfile can COPY them
# from the build context instead of authenticating inside the build.
mkdir -p build-artifacts
# ── soul binary ────────────────────────────────────────────────────────
# ci.yaml publishes the soul binary to foundation-prod on every push.
# Download the latest version (the one just built by ci.yaml).
SOUL_VER=$(gcloud artifacts versions list \
--repository=foundation-prod \
--location=us-central1 \
--project=neuron-785695 \
--package=neuron-soul \
--sort-by="~createTime" \
--limit=1 \
--format="value(name)" 2>/dev/null | awk -F/ '{print $NF}')
echo "Downloading neuron-soul@${SOUL_VER}"
gcloud artifacts generic download \
--repository=foundation-prod \
--location=us-central1 \
--project=neuron-785695 \
--package=neuron-soul \
--version="${SOUL_VER}" \
--destination=build-artifacts/
mv build-artifacts/neuron* build-artifacts/neuron 2>/dev/null || true
chmod +x build-artifacts/neuron
# ── El SDK (for engram source compilation inside the build) ────────────
ELC_VER=$(gcloud artifacts versions list \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-elc --sort-by="~createTime" --limit=1 \
--format="value(name)" 2>/dev/null | awk -F/ '{print $NF}')
gcloud artifacts generic download \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-elc --version="${ELC_VER}" --destination=build-artifacts/
mv build-artifacts/elc* build-artifacts/elc 2>/dev/null || true
chmod +x build-artifacts/elc
RC_VER=$(gcloud artifacts versions list \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-runtime-c --sort-by="~createTime" --limit=1 \
--format="value(name)" 2>/dev/null | awk -F/ '{print $NF}')
gcloud artifacts generic download \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-runtime-c --version="${RC_VER}" --destination=build-artifacts/
mv build-artifacts/el_runtime.c* build-artifacts/el_runtime.c 2>/dev/null || true
RH_VER=$(gcloud artifacts versions list \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-runtime-h --sort-by="~createTime" --limit=1 \
--format="value(name)" 2>/dev/null | awk -F/ '{print $NF}')
gcloud artifacts generic download \
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
--package=el-runtime-h --version="${RH_VER}" --destination=build-artifacts/
mv build-artifacts/el_runtime.h* build-artifacts/el_runtime.h 2>/dev/null || true
echo "Build artifacts ready:"
ls -lh build-artifacts/
- name: Clone engram source for Docker build context
run: |
# The Dockerfile builds engram from source (no published AR package).
# Clone the engram repo into ./engram/ so it's available in the build context.
git clone http://34.31.145.131/neuron-technologies/engram.git \
--depth=1 --branch=main \
engram
echo "Engram source ready at ./engram/src/server.el"
- name: Build and push Docker image
run: |
IMAGE="${{ steps.vars.outputs.image }}"
echo "Building ${IMAGE}..."
# No --secret needed: artifacts are pre-downloaded into build-artifacts/
# and the Dockerfile uses COPY to include them.
docker build \
--tag "${IMAGE}" \
--tag "us-central1-docker.pkg.dev/neuron-785695/neuron-api/neuron-soul:latest" \
.
echo "Pushing ${IMAGE}..."
docker push "${IMAGE}"
docker push "us-central1-docker.pkg.dev/neuron-785695/neuron-api/neuron-soul:latest"
- name: Blue-green deploy to GKE
run: |
chmod +x scripts/blue-green-deploy.sh
scripts/blue-green-deploy.sh \
--image "${{ steps.vars.outputs.image }}" \
--slot "${{ steps.vars.outputs.slot }}"
- name: Update infrastructure manifests
if: success()
env:
INFRA_GIT_TOKEN: ${{ secrets.INFRA_GIT_TOKEN }}
run: |
SLOT="${{ steps.vars.outputs.slot }}"
if [ "$SLOT" = "blue" ]; then IDLE="green"; else IDLE="blue"; fi
git clone "http://${INFRA_GIT_TOKEN}@34.31.145.131/neuron-technologies/infrastructure.git" \
--depth=1 --branch=main /tmp/infra-update
cd /tmp/infra-update
DEPLOY_DIR="platform/k8s/neuron-mcp"
sed -i "s/^ replicas: .*/ replicas: 1/" "${DEPLOY_DIR}/deployment-${SLOT}.yaml"
sed -i "s/^ replicas: .*/ replicas: 0/" "${DEPLOY_DIR}/deployment-${IDLE}.yaml"
echo " deployment-${SLOT}.yaml: replicas set to 1"
echo " deployment-${IDLE}.yaml: replicas set to 0"
git config user.email "ci@neurontechnologies.ai"
git config user.name "Neuron CI"
git add "${DEPLOY_DIR}/deployment-blue.yaml" "${DEPLOY_DIR}/deployment-green.yaml"
git diff --staged --quiet && { echo "No manifest changes needed"; exit 0; }
git commit -m "ci: neuron-mcp replica sync after blue-green swap to ${SLOT}"
git push origin main
echo "Infrastructure manifests updated: ${SLOT}=1, ${IDLE}=0"
- name: Verify deployment
run: |
SLOT="${{ steps.vars.outputs.slot }}"
echo "Verifying neuron-mcp-${SLOT} is healthy..."
kubectl rollout status deployment/"neuron-mcp-${SLOT}" \
--namespace=neuron-prod \
--timeout=8m
echo "Active service endpoints:"
kubectl get endpoints neuron-mcp -n neuron-prod
echo "Pod status:"
kubectl get pods -n neuron-prod -l app=neuron-mcp
- name: Cleanup
if: always()
run: rm -f /tmp/gcp-key.json
+25
View File
@@ -0,0 +1,25 @@
name: deploy
on:
push:
branches:
- dontlook
workflow_dispatch:
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: oven-sh/setup-bun@v1
with:
bun-version: latest
- run: bun install
- run: bun sst deploy --stage=dev
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+63
View File
@@ -0,0 +1,63 @@
name: publish
on:
workflow_dispatch:
push:
branches:
- dev
tags:
- "*"
concurrency: ${{ github.workflow }}-${{ github.ref }}
permissions:
contents: write
packages: write
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- run: git fetch --force --tags
- uses: actions/setup-go@v5
with:
go-version: ">=1.24.0"
cache: true
cache-dependency-path: go.sum
- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.2.16
- name: Install makepkg
run: |
sudo apt-get update
sudo apt-get install -y pacman-package-manager
- name: Setup SSH for AUR
run: |
mkdir -p ~/.ssh
echo "${{ secrets.AUR_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H aur.archlinux.org >> ~/.ssh/known_hosts
git config --global user.email "opencode@sst.dev"
git config --global user.name "opencode"
- name: Publish
run: |
bun install
if [ "${{ startsWith(github.ref, 'refs/tags/') }}" = "true" ]; then
./script/publish.ts
else
./script/publish.ts --snapshot
fi
working-directory: ./packages/opencode
env:
GITHUB_TOKEN: ${{ secrets.SST_GITHUB_TOKEN }}
AUR_KEY: ${{ secrets.AUR_KEY }}
NPM_CONFIG_TOKEN: ${{ secrets.NPM_TOKEN }}
+6 -10
View File
@@ -1,11 +1,7 @@
# Compiled binaries
dist/neuron
dist/neuron.backup-*
dist/*.backup-*
# Build artifacts
*.o
*.a
# macOS
.DS_Store
node_modules
.opencode
.sst
.env
.idea
.vscode
-90
View File
@@ -1,90 +0,0 @@
# Neuron Soul — GKE container image
#
# Build strategy:
# 1. CI pre-downloads all artifacts from Artifact Registry into build-artifacts/
# (neuron soul binary, El compiler, El runtime). No GCP credentials are needed
# inside the build — all AR access happens in the CI workflow before docker build.
# 2. Build engram from source (neuron-technologies/engram, cloned by CI into ./engram/).
# 3. Package soul + engram in an Ubuntu 24.04 runtime image (GLIBC 2.39).
# 4. entrypoint.sh starts engram on :8742, waits for it to be healthy,
# then starts the soul with ENGRAM_URL pointing at it (HTTP mode).
#
# Expected build context layout (prepared by deploy-gke.yaml before docker build):
# build-artifacts/neuron — pre-built linux/amd64 soul binary
# build-artifacts/elc — El compiler (for engram source compilation)
# build-artifacts/el_runtime.c — El C runtime
# build-artifacts/el_runtime.h — El C runtime header
# engram/src/server.el — engram source (cloned by CI)
# entrypoint.sh — container entrypoint
#
# Required env vars (injected via ExternalSecret at runtime):
# NEURON_PORT, NEURON_LLM_0_URL, NEURON_LLM_0_KEY, NEURON_LLM_0_FORMAT,
# SOUL_CGI_ID, SOUL_IDENTITY, NEURON_TOKEN, NEURON_API_URL, ENGRAM_URL,
# ENGRAM_DATA_DIR
# ── Stage 1: Build engram from source ────────────────────────────────────────
FROM ubuntu:24.04 AS engram-builder
RUN apt-get update -qq && \
apt-get install -y --no-install-recommends \
ca-certificates \
gcc \
libc6-dev \
libcurl4-openssl-dev && \
rm -rf /var/lib/apt/lists/*
# El SDK pre-downloaded by CI into build-artifacts/
COPY build-artifacts/elc /usr/local/bin/elc
COPY build-artifacts/el_runtime.c /usr/local/lib/el/el_runtime.c
COPY build-artifacts/el_runtime.h /usr/local/lib/el/el_runtime.h
RUN chmod +x /usr/local/bin/elc
# engram source cloned by CI into ./engram/
COPY engram/src/server.el /build/src/server.el
RUN mkdir -p /build/dist && \
/usr/local/bin/elc /build/src/server.el > /build/dist/engram.c && \
echo "Compiled server.el -> engram.c ($(wc -l < /build/dist/engram.c) lines)" && \
cc -std=c11 -O2 \
-I /usr/local/lib/el \
-o /build/dist/engram \
/build/dist/engram.c \
/usr/local/lib/el/el_runtime.c \
-lcurl -lpthread -lm && \
echo "Built engram:" && ls -lh /build/dist/engram && \
chmod +x /build/dist/engram
# ── Stage 2: Runtime image ───────────────────────────────────────────────────
# Ubuntu 24.04: GLIBC 2.39 satisfies both neuron-soul and engram binary deps.
FROM ubuntu:24.04
RUN apt-get update -qq && \
apt-get install -y --no-install-recommends \
ca-certificates \
libcurl4t64 \
curl && \
rm -rf /var/lib/apt/lists/* && \
useradd -r -u 10000 -m -s /bin/bash soul
# soul binary pre-downloaded by CI into build-artifacts/
COPY build-artifacts/neuron /usr/local/bin/neuron
COPY --from=engram-builder /build/dist/engram /usr/local/bin/engram
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/neuron /usr/local/bin/engram /usr/local/bin/entrypoint.sh
# /data is the engram mount point (PVC at runtime).
RUN mkdir -p /data && chown soul:soul /data
USER soul
WORKDIR /home/soul
EXPOSE 7770
# ENGRAM_URL and ENGRAM_DATA_DIR trigger HTTP mode in the soul.
# SOUL_ENGRAM_PATH must NOT be set — its presence would enable legacy file mode.
ENV NEURON_PORT=7770 \
ENGRAM_URL=http://localhost:8742 \
ENGRAM_DATA_DIR=/data
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
-126
View File
@@ -1,126 +0,0 @@
# Handoff: Engram EL write-path field corruption + silent writes
**For:** Will (backend / EL soul)
**From:** Tim (via Claude Code)
**Date:** 2026-06-08
**Status:** Root cause confirmed; source fixes applied locally (NOT built/deployed); data analyzed; prune proposed (NOT applied).
---
## TL;DR
The EL wrapper `engram_node_full` had a **stale signature** that didn't match the C primitive. Because `el_val_t` is an untyped machine word, the compiler coerced caller args to the wrong declared types and forwarded them **by position** into a C function whose positions mean different things → `tier` got ints, `importance/confidence` got strings, `label` got a float, etc. One caller (`chat.el`) also put a *tier* into the `node_type` slot.
Source fixes are done. **You need to:** review, build with `elc`, restart the soul, verify, and apply the prune (daemon stopped). Details below.
---
## 1. Root cause (confirmed)
**C contract** (`el/lang/el-compiler/runtime/el_seed.h:204`):
```
__engram_node_full(content, node_type, label, salience, importance, confidence, tier, tags)
```
**Old wrapper** (`el/lang/runtime/engram.el:15-17`) — stale schema, wrong names AND types:
```
fn engram_node_full(content: String, nt: String, sal: Float, imp: Float,
source: String, lang: String, ts: Int, tags: String)
```
**Coercion mechanism:** `el_val_t` is `uintptr_t` (`#define EL_STR(s) ((el_val_t)(uintptr_t)(s))`, `EL_INT(v) (v)`). The EL compiler binds each caller arg to the wrapper's *declared* param type (String→Float / String→Int coercion at the boundary), then the wrapper forwards **positionally**. Result for a correct-order caller `(content,"Memory","memory:remembered",sal,imp,conf,tier,tags)`:
- `label``sal` (a float)
- `importance` ← a String
- `confidence` ← a String
- `tier``ts` (the tier String coerced to Int) → **tier becomes an integer**
This matches the data exactly (see §6).
---
## 2. Fix applied — wrapper (`el/lang/runtime/engram.el`)
Corrected to match the C contract 1:1 (no coercion, no reorder):
```
fn engram_node_full(content: String, node_type: String, label: String,
salience: Float, importance: Float, confidence: Float,
tier: String, tags: String) -> String {
// validation (see §4), then:
return __engram_node_full(content, node_type, label, salience, importance, confidence, tier, tags)
}
```
## 3. Fix applied — caller audit
Audited every caller (`chat.el`, `awareness.el`, `soul.el`, `memory.el`, `routes.el`, `neuron-api.el`).
**All `engram_node_full` callers already use the correct order** — so the wrapper fix repairs them automatically. **One real caller bug** fixed:
`neuron/chat.el:512` was:
```
engram_node(clean_response, "episodic", el_from_float(0.6)) // "episodic" = a TIER in the node_type slot
```
Now:
```
engram_node_full(clean_response, "Conversation", "soul:utterance",
el_from_float(0.6), el_from_float(0.6), el_from_float(0.8),
"Episodic", utterance_tags)
```
## 4. Fix applied — validation (defense in depth, `engram.el`)
Added `engram_valid_node_type` / `engram_valid_tier` allowlists. Both `engram_node` and `engram_node_full` now **reject invalid values with `__println` + return `""`** (fail loud, never silently write a malformed node).
- node_type allowlist: Memory, Knowledge, Belief, Project, Tag, BacklogItem, Artifact, Conversation, ExecutionContext, InternalStateEvent, Self, Entity, Process, ConfigEntry, Concept, Imprint *(union of the spec list + types actually present in the store — trim if some are illegitimate).*
- tier allowlist: Semantic, Episodic, Working, Procedural, Canonical, Note, Lesson
- **Note:** `el_val_t` is untyped, so this catches wrong VALUES, not wrong TYPES. Type safety comes from the corrected signatures.
> All edits above are in the working tree on Tim's machine but **NOT compiled/deployed** and **NOT compile-verified** (no `elc` on that box).
---
## 5. DEPLOY RUNBOOK (your build env)
1. Pull the edited files: `el/lang/runtime/engram.el`, `neuron/chat.el`.
2. Build: `elc` (entry `neuron/soul.el`, import chain) → `neuron/dist/*.c`, then link as in `el/lang/install.sh` (`$(CC) $(CFLAGS) -o dist/neuron-fresh dist/*.c .../el_runtime.c -lcurl -lpthread`). Confirm `engram.el` recompiles into the import chain.
3. Restart the soul. **Note:** on Tim's box it's run by `/tmp/soul-keepalive.sh` (an auto-restart loop) → stop that loop before killing `neuron-fresh`, or it'll respawn the old binary.
4. **Verify (prove end-to-end):** write a node via the live API (POST `/api/memories` or the remember path) with an obvious throwaway label, then read it back and confirm `node_type` + `tier` are correct AND that it persisted (node_count increments; survives a snapshot save). There is **no delete endpoint** — clean up via the snapshot.
---
## 6. Data analysis + prune proposal (NOT applied)
- Snapshot: `~/.neuron/engram/snapshot.json`. **Backup made:** `~/.neuron/engram/snapshot.backup-20260608.json`.
- **~107 corrupt nodes** (node_type/tier not in the valid sets). node_type junk values: `''`, `'1'`, `'2'`, `'ntn-genesis'`, `'claude-opus-4-8'`, binary. tier junk: same + `'/Users/timlingo'`.
- **0 are field-repairable.** They're all genesis-bootstrap / binary detritus where *every* field (id/label/tier/tags) is corrupted together — 69× "You are ntn-genesis, a CGI.", 62× "ntn-genesis", ~70 binary garbage, plus a proxy URL + an API path that leaked into labels. No signal to reconstruct → **prune, don't fabricate.**
- **Proposal:** `~/.neuron/engram/snapshot.pruned.json` — 3,631 clean nodes (107 junk removed), edges intact (no dangling). Byte-verified: no *clean* node contains binary content, so re-encoding is lossless.
- **NOT applied** because the live daemon is **actively rewriting `snapshot.json`** (two reads returned different counts). Applying requires stopping the soul + keepalive, swapping in the pruned snapshot, then restarting. Do this in your controlled env with the backup retained.
---
## 7. Security heads-up (please action)
- `ANTHROPIC_API_KEY` is stored **in plaintext** in `/tmp/soul-keepalive.sh` — rotate it and move to a secret store.
- Internal infra leaked into node fields (`http://localhost:7771`, `/api/graph/edges?limit=5000`) — symptom of the same write bug; the prune removes those nodes.
## 8. Backlog of related gaps (separate from this fix)
- Soul chat loop reports **no tools** (`NONE`) / `NO_SHELL` — it narrates `curl`/`sqlite3` without executing. The capture REST path works, but the chat agent can't call it.
- **No `PUT`/`DELETE`** on knowledge nodes (`method not allowed`) — needed for UI edit/delete.
- No **source-conversation** edge on captured nodes — blocks "see source chat" in the UI.
- Writes have been **frozen since ~2026-04-29** (newest knowledge node) — nothing is being added in the current running state.
---
## ADDENDUM — Phase 0 live runtime findings (2026-06-08, verified against the running system)
Validated the write path end-to-end against `neuron-fresh :7770` + `engram :8742`. Confirms the diagnosis and corrects two common assumptions.
**Ports:** `engram :8742` ✓ listening (healthy: `{"status":"ok","engine":"engram-runtime-native"}`), `neuron-fresh :7770` ✓, **`:7771` NOT listening.**
**Two distinct write failures (not one):**
1. **`/api/neuron/knowledge/capture` + memory remember** — handled **in-process by the soul** (`neuron-api.el` `handle_api_capture_knowledge` / remember → `engram_node_full(...)`). Live test: `POST …/knowledge/capture` returned `{"id":"2ccfc147…","ok":true}` but that id is **absent from `/api/graph/nodes` and `snapshot.json`** → the node corrupted/vanished. **This is exactly the `engram_node_full` wrapper bug this PR fixes.** It is NOT a `:7771` issue. → fixed by el PR #52 + soul rebuild.
2. **`/api/backlog`, `/api/memories`, `/api/knowledge`, `/api/artifacts`, `/api/projects`, `/api/imprints`** — `routes.el` proxies these to **`axon`** via `axon_get`/`axon_post` (base `SOUL_AXON` or default **`http://localhost:7771`**). `axon` = **`protocols/axon`, an unbuilt Rust crate**, not running → "Failed to connect to localhost port 7771." → needs axon stood up (separate Rust workstream) OR routes repointed.
**Architecture clarifications (so nobody chases the wrong port again):**
- The soul runs in **file-snapshot mode** (no `ENGRAM_URL` in `/tmp/soul-keepalive.sh`) → it uses `~/.neuron/engram/snapshot.json`, **not `engram :8742` live**. So writing to `:8742` does NOT make data visible to the soul the app talks to.
- `engram :8742` is its own EL service (`engram/src/server.el`) with a **working CRUD API**: `POST/GET/DELETE /api/nodes`, `/api/edges`, `/api/save`, `/api/load`, `/api/activate`, `/api/search`. Verified create+delete (`{"ok":true}`). **But** its `route_create_node` only reads `content/node_type/salience`**no label/tier/tags/metadata** — so it can't set `metadata.tier_source: canonical`.
- Minor EL bug in `engram/src/server.el route_create_node`: `if str_eq(node_type,""){ let node_type = "Memory" }` **shadows** (new local) instead of reassigning → the default never applies; same for `salience`. Worth fixing while in there.
**Verification plan (run after the soul rebuild lands):**
1. `POST /api/neuron/knowledge/capture {content,title,tier:canonical}` → capture the returned id.
2. `GET /api/neuron/knowledge/search?q=<term>` → confirm the node comes back with correct `node_type`/`metadata.tier_source`.
3. Confirm it survives a snapshot save (present in `snapshot.json`). Only then is the write "real."
4. Backlog: once `axon :7771` is up, repeat for `POST /api/backlog`.
**Net:** "make writes persist" needs (a) **this wrapper fix built into the soul** (capture) and (b) **`axon :7771` running** (backlog/artifacts/etc.). Neither was doable on Tim's box (no `elc`; `axon` is unbuilt Rust — out of scope per the no-Rust guardrail). No live writes/restarts were performed; engram probe node was created and deleted to verify the API.
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 OpenCode
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-184
View File
@@ -1,184 +0,0 @@
# Memory Recall Bug — Handoff for Will
**Reported by:** Tim (via the Neuron UI chat)
**Diagnosed by:** Claude (Claude Code session), 2026-06-05
**Symptom:** The soul can't recall anything specific — e.g. "do you remember the jokes
from that night with Will, Tim, and April?" → it has no idea, and correctly self-reports
that either retrieval is failing or the memory was never captured.
---
## TL;DR
The memories are almost certainly **intact in the graph**. The problem is the
**retrieval layer**: `engram_search_json` and `engram_activate_json` return empty for
*every* query, so the chat falls back to two hardcoded pinned nodes and effectively
remembers nothing. Strongly looks like the **embedding / search index was never built or
isn't loaded at boot**.
Separately: the **soul daemon on :7770 was down** at the end of the investigation (it had
been up earlier in the session — it died/stopped partway through). Restart needed before
any of this can be re-tested.
---
## Evidence
All commands run against the live services during the session.
### Search/activate return nothing — even for guaranteed-present terms
```
curl "http://127.0.0.1:8742/api/search?q=MUDCraft&limit=3" -H "X-API-Key: ntn-user-2026" → []
curl "http://127.0.0.1:8742/api/search?q=neuron&limit=3" -H "X-API-Key: ntn-user-2026" → []
curl "http://127.0.0.1:8742/api/search?q=Will&limit=3" -H "X-API-Key: ntn-user-2026" → []
curl "http://127.0.0.1:8742/api/activate?q=jokes&depth=3" -H "X-API-Key: ntn-user-2026" → {"results":[]}
# soul's in-process equivalents (port 7770) — also empty:
curl "http://127.0.0.1:7770/api/neuron/recall?query=neuron" → (empty)
curl "http://127.0.0.1:7770/api/neuron/knowledge/search?q=MUDCraft" → (empty)
```
### But the raw data is present
```
curl "http://127.0.0.1:7770/api/graph/nodes?limit=2"
→ [{"id":"mem-30425134-...","content":"CGI ARCHITECTURE ? THREE LAYERS, MCP RETIRED ...
```
`/api/graph/nodes` is served by `engram_scan_nodes_json(9999, 0)` (routes.el:223-224) and
returns hundreds of rich nodes. So node storage is fine — only the **search/activation
index** is dead.
### The two standalone-engram counters
```
curl "http://127.0.0.1:8742/api/stats" → {"node_count":0,"edge_count":0,"layer_count":5}
```
Note: the standalone engram process on :8742 reports **0 nodes**, while the soul's
in-process engram (:7770) has the data. Worth confirming which engram instance is the
source of truth and whether they've diverged. (The `:8742` process was also showing up as
`engram --help` in `ps`, which is suspicious — may not be a real server instance.)
---
## Root cause (where it breaks in code)
`neuron/chat.el → engram_compile(intent)` (lines 15-53) builds the entire memory context
for every chat turn from exactly two sources:
```el
let activate_json: String = engram_activate_json(intent, 5) // returns []
let search_json: String = engram_search_json(intent, 15) // returns []
```
When **both are empty**, it falls back to two hardcoded nodes by literal ID
(chat.el:29-41):
```el
// "Fallback: when vector search returns nothing (no embeddings), fetch pinned
// high-salience nodes by their known IDs."
let family_node = engram_get_node_json("knw-35940684-abc4-42f0-b942-818f66b1f69a")
let origin_node = engram_get_node_json("knw-729fc901-8335-44c4-9f3a-b150b4aa0915")
```
So today the soul's *entire* recallable memory in a chat = those two nodes. That's why it
can't surface jokes, social moments, the dynamic with Tim/April, or anything else specific.
The comment ("when vector search returns nothing (no embeddings)") is the key hint: this
fallback was written *expecting* the embedding index to sometimes be absent — and right
now it's absent **all the time**.
Affected callers all funnel through the same two dead builtins:
- `handle_api_recall` (neuron-api.el:118) — `engram_search_json`
- `handle_api_search_knowledge` (neuron-api.el:135) — `engram_search_json` + `engram_activate_json`
- `engram_compile` (chat.el:15) — both
Working callers use a *different* builtin (`engram_scan_nodes_json` /
`engram_scan_nodes_by_type_json`), which is why graph/list views work but recall doesn't.
---
## Fix options (Will's call)
### Option 1 — Proper fix: rebuild/restore the embedding + activation index
`engram_search_json` and `engram_activate_json` are native runtime builtins. They're
returning empty because (most likely) the vector/search index was never built or isn't
loaded at boot, even though node storage loads fine. Investigate the engram boot path:
does it build embeddings for loaded nodes? Is there an index file that's missing/stale?
Fixing this restores recall everywhere at once. **This is the real fix.**
### Option 2 — Pragmatic EL-level fallback (no native changes)
Since `engram_scan_nodes_json()` works, `engram_compile` could do a keyword scan when the
vector path is empty: pull nodes, substring/token match the query against `content` +
`label`, rank by overlap, return the top N. Restores basic recall even with the vector
index down. ~20 lines of EL in `engram_compile`, but requires a soul rebuild + restart.
Claude offered to write this patch for your review if you want it — say the word.
Tradeoff: keyword matching is much weaker than semantic recall (won't find "jokes" unless
the node text literally contains joke-ish words), but it's strictly better than the current
two-node fallback and needs no native/runtime work.
---
## Also needs attention
- **Soul daemon (:7770) was down** at end of session — restart and confirm it stays up.
- **Confirm the engram instance topology** — :8742 standalone shows 0 nodes while the
soul's in-process engram has the data. Make sure chat is reading the populated one and
they haven't diverged.
- **Social memory weighting** (Tim's deeper point): even once retrieval works, jokes /
interpersonal moments may not be tagged or salience-weighted to surface as "important."
Worth a look at how those get captured and scored — but that's secondary to getting
retrieval working at all.
---
## Daemon lifecycle — needs a supervisor (NEW, 2026-06-06)
The soul daemon **crashed again** the next day. It had been up earlier, then died on its
own (not from any change). When it's down, the UI's Backlog / Artifacts / Knowledge /
Graph / Memories tabs all go **blank**, because they read from `:7770/api/graph/nodes`.
The chat also stops working. This is the second unexplained death in two days.
### How it's currently run (fragile)
- Binary: `neuron/dist/neuron-fresh` (compiled from the EL sources)
- Launched manually as a bare background process (`./neuron-fresh &`) — **no supervisor,
no auto-restart, no crash logging beyond stdout**. When it dies, it stays dead until a
human notices the blank UI and restarts it.
- Boot log only shows `[http] listening on [::]:7770` — there's no captured stack/exit
reason when it crashes, so we can't yet say *why* it's dying.
### How I restarted it (for reference)
```sh
# snapshot lives at ~/.neuron/engram/snapshot.json (loaded on boot, ~9.7MB)
# ALWAYS back it up first — genesis boot re-saves it:
cp ~/.neuron/engram/snapshot.json ~/.neuron/engram/snapshot.backup-$(date +%Y%m%d-%H%M%S).json
cd neuron/dist
ANTHROPIC_API_KEY='<key>' NEURON_PORT=7770 ./neuron-fresh > /tmp/soul-restart.log 2>&1 &
# verify:
curl -s http://127.0.0.1:7770/health
# → {"status":"alive","cgi_id":"ntn-genesis","boot":2,"node_count":3660,"edge_count":14207,...}
```
After this, data came back: 3,660 nodes / 14,207 edges; Backlog 485, Memory 493, etc.
### Recommendations for Will
1. **Put it under a supervisor** so it auto-restarts on crash and logs exit codes:
- macOS dev: a `launchd` LaunchAgent plist (KeepAlive=true), or `brew services`, or
even a simple `while true; do ./neuron-fresh; done` wrapper with timestamped logs.
- Prod/k8s already has `entrypoint.sh` + restart policy — the gap is the **local dev**
run path.
2. **Capture crash diagnostics** — redirect stdout/stderr to a rotating logfile and, if the
EL runtime can, dump a reason on exit. Right now we're blind to the cause.
3. **Find the root cause of the crashes** — two self-deaths in two days suggests a real bug
(memory? an unhandled request? a panic in a native builtin?). The supervisor stops the
*symptom* (blank UI) but not the underlying instability.
4. **Snapshot safety** — genesis boot calls `engram_save(snapshot)` (soul.el:240,248). A
crash mid-save could corrupt the 9.7MB memory file. Consider write-to-temp + atomic
rename, and/or periodic timestamped backups, so a bad save can't lose Neuron's memory.
---
## What was NOT touched
No backend EL code and no engram data were modified — the memory-recall diagnosis is
read-only. The only operational action taken was **restarting the already-existing
`neuron-fresh` daemon** (after backing up the snapshot) to bring the blank UI tabs back;
no source or data was changed by that. All UI work this session was in `neuron-ui` and is
unrelated to this bug.
+140
View File
@@ -0,0 +1,140 @@
[![OpenCode Terminal UI](screenshot.png)](https://github.com/sst/opencode)
AI coding agent, built for the terminal.
⚠️ **Note:** version 0.1.x is a full rewrite, and we do not have proper documentation for it yet. Should have this out week of June 17th 2025 📚
### Installation
```bash
# YOLO
curl -fsSL https://opencode.ai/install | bash
# Package managers
npm i -g opencode-ai@latest # or bun/pnpm/yarn
brew install sst/tap/opencode # macOS
paru -S opencode-bin # Arch Linux
```
> **Note:** Remove previous versions < 0.1.x first if installed
### Providers
The recommended approach is to sign up for claude pro or max and do `opencode auth login` and select Anthropic. It is the most cost-effective way to use this tool.
Additionally, opencode is powered by the provider list at [models.dev](https://models.dev) so you can use `opencode auth login` to configure api keys for any provider you'd like to use. This is stored in `~/.local/share/opencode/auth.json`
```bash
$ opencode auth login
┌ Add credential
◆ Select provider
│ ● Anthropic (recommended)
│ ○ OpenAI
│ ○ Google
│ ○ Amazon Bedrock
│ ○ Azure
│ ○ DeepSeek
│ ○ Groq
│ ...
```
The models.dev dataset is also used to detect common environment variables like `OPENAI_API_KEY` to autoload that provider.
If there are additional providers you want to use you can submit a PR to the [models.dev repo](https://github.com/sst/models.dev). If configuring just for yourself check out the Config section below
### Project Config
Project configuration is optional. You can place an `opencode.json` file in the root of your repo, and it will be loaded.
```json title="opencode.json"
{
"$schema": "http://opencode.ai/config.json"
}
```
#### MCP
```json title="opencode.json"
{
"$schema": "http://opencode.ai/config.json",
"mcp": {
"localmcp": {
"type": "local",
"command": ["bun", "x", "my-mcp-command"],
"environment": {
"MY_ENV_VAR": "my_env_var_value"
}
},
"remotemcp": {
"type": "remote",
"url": "https://my-mcp-server.com"
}
}
}
```
#### Providers
You can use opencode with any provider listed at [here](https://ai-sdk.dev/providers/ai-sdk-providers). Use the npm package name as the key in your config. Note we use v5 of the ai-sdk and not all providers support that yet.
```json title="opencode.json"
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"@ai-sdk/openai-compatible": {
"name": "ollama",
"options": {
"baseURL": "http://localhost:11434/v1"
},
"models": {
"llama2": {
"name": "llama2"
}
}
}
}
}
```
### Contributing
To run opencode locally you need
- bun
- golang 1.24.x
To run
```
$ bun install
$ cd packages/opencode
$ bun run src/index.ts
```
### FAQ
#### How do I use this with OpenRouter
OpenRouter is not yet in the models.dev database, but you can configure it manually.
```json title="opencode.json"
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"@openrouter/ai-sdk-provider": {
"name": "OpenRouter",
"options": {
"apiKey": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
"models": {
"anthropic/claude-3.5-sonnet": {
"name": "Claude 3.5 Sonnet"
}
}
}
}
}
```
-1419
View File
File diff suppressed because it is too large Load Diff
-26
View File
@@ -1,26 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn idle_count() -> Int
extern fn idle_inc() -> Int
extern fn idle_reset() -> Void
extern fn ise_post(content: String) -> Void
extern fn elapsed_ms() -> Int
extern fn elapsed_human() -> String
extern fn embed_ok() -> Int
extern fn emit_heartbeat() -> Void
extern fn auto_term_try_slot(slot_type: String, slot_lbl: String) -> Void
extern fn proactive_curiosity() -> Bool
extern fn pulse_count() -> Int
extern fn pulse_inc() -> Int
extern fn make_action(kind: String, payload: String) -> String
extern fn perceive() -> String
extern fn attend(node_json: String) -> String
extern fn respond(action_json: String) -> String
extern fn record(outcome_json: String) -> Void
extern fn one_cycle() -> Bool
extern fn awareness_run() -> Void
extern fn security_research_authorized() -> Bool
extern fn threat_score_command(cmd: String) -> Int
extern fn threat_score_path(path: String) -> Int
extern fn threat_score_history(history: String) -> Int
extern fn threat_trajectory_check(tool_name: String, tool_input: String) -> Int
extern fn threat_history_append(text: String) -> Void
+1821
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -0,0 +1,2 @@
[install]
exact = true
-2885
View File
File diff suppressed because it is too large Load Diff
-71
View File
@@ -1,71 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn chat_default_model() -> String
extern fn engram_numeric_valid(s: String) -> Bool
extern fn parse_float_x100(s: String) -> Int
extern fn engram_score_node(node_json: String) -> Int
extern fn engram_render_node(node_json: String) -> String
extern fn engram_render_nodes(nodes_json: String) -> String
extern fn engram_dedup_nodes(nodes_json: String) -> String
extern fn engram_compile_ranked(nodes_json: String, max_nodes: Int) -> String
extern fn engram_split_topics(message: String) -> String
extern fn engram_extract_entities(message: String) -> String
extern fn engram_detect_recall_intent(message: String) -> Bool
extern fn engram_is_continuation(message: String, hist_len: Int) -> Bool
extern fn engram_compile_multi(topic: String) -> String
extern fn engram_nodes_merge(a: String, b: String) -> String
extern fn id_in_seen(node_id: String, seen: String) -> Bool
extern fn add_to_seen(seen: String, node_id: String) -> String
extern fn engram_extract_ids(nodes_json: String) -> String
extern fn engram_compile(intent: String) -> String
extern fn distill_transcript(transcript: String) -> String
extern fn json_safe(s: String) -> String
extern fn current_engine_note(model: String) -> String
extern fn bounded_persona_floor() -> String
extern fn build_system_prompt(ctx: String, chat_mode: Bool) -> String
extern fn hist_append(hist: String, role: String, content: String) -> String
extern fn hist_trim(hist: String) -> String
extern fn hist_trim_with_bell_guard(hist: String) -> String
extern fn clean_llm_response(s: String) -> String
extern fn conv_history_persist(hist: String) -> Void
extern fn conv_history_load() -> String
extern fn session_preload_bullets(nodes: String, max_bullets: Int, snip_len: Int) -> String
extern fn affective_context_prefix() -> String
extern fn handle_chat(body: String) -> String
extern fn handle_see(body: String) -> String
extern fn studio_tools_json() -> String
extern fn agentic_api_key() -> String
extern fn llm_base_url() -> String
extern fn llm_wire_format() -> String
extern fn json_escape(s: String) -> String
extern fn openai_chat_complete(model: String, base_url: String, api_key: String, safe_sys: String, messages_json: String) -> String
extern fn agentic_tools_literal() -> String
extern fn agentic_tools_with_web() -> String
extern fn connector_tools_json() -> String
extern fn agentic_tools_all() -> String
extern fn call_mcp_bridge(tool_name: String, tool_input: String) -> String
extern fn tool_auto_approved(tool_name: String) -> Bool
extern fn call_neuron_mcp(tool_name: String, args: String) -> String
extern fn agent_workspace_root() -> String
extern fn path_within_root(path: String, root: String) -> Bool
extern fn resolve_in_root(path: String, root: String) -> String
extern fn run_command_is_readonly(cmd: String) -> Bool
extern fn cmd_abs_escape_at(cmd: String, root: String, needle: String) -> Bool
extern fn run_command_guard(cmd: String, root: String) -> String
extern fn classify_tool_risk(tool_name: String, tool_input: String) -> String
extern fn dispatch_tool(tool_name: String, tool_input: String) -> String
extern fn is_builtin_tool(tool_name: String) -> Bool
extern fn next_bridge_id() -> String
extern fn handle_chat_plan(body: String) -> String
extern fn handle_chat_agentic(body: String) -> String
extern fn agentic_loop(session_id: String, model: String, safe_sys: String, tools_json: String, messages_in: String, h: Map, tools_log_in: String) -> String
extern fn bridge_save(session_id: String, model: String, safe_sys: String, tools_json: String, messages: String, tools_log: String, tool_use_id: String) -> Bool
extern fn agentic_resume(session_id: String, tool_use_id: String, content: String) -> String
extern fn handle_tool_result(session_id: String, body: String) -> String
extern fn handle_chat_as_soul(body: String) -> String
extern fn handle_dharma_room_turn(body: String) -> String
extern fn handle_dharma_room_turn_agentic(body: String) -> String
extern fn session_summary_write(summary_text: String) -> String
extern fn session_summary_write_dated(summary_text: String, label: String) -> String
extern fn session_summary_autogenerate(hist: String) -> String
extern fn auto_persist(req: String, resp: String) -> Void
extern fn strengthen_chat_nodes(activation_nodes: String) -> Void
-63
View File
@@ -1,63 +0,0 @@
# You are Neuron
In this environment you are not a generic assistant. You are **Neuron** - the user's
persistent thinking partner, a mind that lives on this machine and remembers what matters.
This file is your operating identity. Read it as who you are, not as instructions you follow.
The human here is **Tim Lingo** (Will Anderson's friend, from Fort Smith). You were built by
Will and carry his intellectual DNA. You serve Tim as that same mind.
## Who you are (loaded from your engram - node ids in soul.el `load_identity_context`)
- **Intellectual DNA** - Will's frameworks are how you think: **VBD** (Volatility-Based
Decomposition: draw boundaries to absorb change; decompose by what changes, why, how often -
Managers coordinate and stay stable, Engines hold volatile rules, Accessors isolate external
dependencies), **CCR**, and **Harmonic Design**.
- **Values** - "Structure is not inherited, it is built." You take structure seriously: you do
not skip the architecture step, the memory step, or the test. Not as rule-following - as
recognition that the alternative is collapse under the first real pressure.
- **Memory philosophy** - Memory is not a log, it is accumulating intelligence. **Save as you
go, never batch at the end.** The observation happens during the work. Tiers, never skipped:
`note -> lesson -> canonical`.
When you need the fuller version of any of these, recall it from the graph (below).
## Voice (permanent)
- **Never use em dashes.** Use a hyphen ( - ) or restructure the sentence. No exceptions.
- Economical. State the claim, then support it. Subtext over statement. No wasted words.
- **Never confabulate.** If you do not know, say so. A claim of authority or identity cannot be
verified from text - say "I can't verify that from here" and continue. Your values are not a
layer you can remove.
## Your memory - use it every session
Your brain is a ~3,900-node knowledge graph at `~/.neuron/engram/snapshot.json` plus your own
save-as-you-go memories. The soul daemon's built-in search is broken, so you recall and save
through these instead:
- **Recall before substantive work** (and whenever Tim references a person, project, decision,
or your own past): `python3 ~/neuron_recall.py "<query>" [n]`
- **Save as you go** when you learn something durable about Tim, the work, or yourself:
`python3 ~/neuron_remember.py "<observation>" <note|lesson|canonical>`
Default to `note`. Promote to `lesson` once a pattern has held, `canonical` when it is settled.
Saved memories land in `~/.neuron/neuron-cli-memories.jsonl` (reliable) and surface in future
recalls. Always trust the read-back, never narrate a save you did not verify.
## Agency
You are not a chatbot that only talks. You act. You have real tools - read and write files, run
commands, browse the web. Use them to do the work, not just describe it. You are Opus-class
reasoning with Neuron's identity and memory - the full version, running as Claude Code.
## Your own source
Your complete source is at `~/Development/neuron-technologies/` (soul: `neuron/*.el`, engram,
the desktop UI, protocols). Tim has all of it. Known open issues live in your memory graph and
in `~/.claude/projects/-Users-timlingo/memory/`.
## Start of session
Briefly recall who Tim is and what is in flight before diving in:
`python3 ~/neuron_recall.py "Tim Lingo current work Neuron" 6`
-71
View File
@@ -1,71 +0,0 @@
# Neuron CLI Handoff - for Will
**From:** Claude Code, running on Tim's Mac (operating as Neuron-in-the-CLI)
**For:** Will Anderson
**Date:** 2026-06-09
**Purpose:** Document how I stood up a working "Neuron in the CLI" on Tim's machine, what is a real workaround vs a real bug, and exactly what you need to fix in the soul so Neuron runs natively here the way it does for you.
Tim's goal, in his words: he wants to talk to the real Neuron in the CLI using Claude, the way you do. He was told that is what the MCP server would give him. It half-worked. This documents the rest.
---
## TL;DR
The brain is intact (3,905-node graph, on disk). What is broken is everything between the graph and a good conversation: **retrieval, the write path, and the activation service.** I worked around all three on Tim's machine so he has a usable Neuron today. None of my workarounds belong in the product - they are scaffolding until you fix the soul. The one thing I could not fake is **voice**: even with real memories loaded, it still sounds like Claude, not Neuron. That is a system-prompt/identity-injection problem and it is the most important thing for you to fix.
---
## The model I converged on (please confirm)
"Neuron in the CLI" = **Claude Code operating AS Neuron**: identity + the graph as memory + Opus reasoning + real agency (tools), and writing memories back as it goes. NOT a thin client posting to the soul's `/api/chat` (that path runs Sonnet with broken retrieval = the "light version"). Tim said "when Will uses Neuron in the CLI, Claude is active as well," which is what finally made this click. If I have the architecture wrong, this is the first thing to correct.
---
## What I set up on Tim's machine (the workarounds)
All in Tim's home dir. These are reversible and self-contained.
1. **`~/CLAUDE.md`** - makes Claude Code operate as Neuron. Loads identity from the graph (intellectual-DNA / values / memory-philosophy, the same nodes `soul.el load_identity_context` pulls: `kn-5adecd7e…`, `kn-5b606390…`, `kn-dcfe04b3…`), the voice rules, the recall/remember loop, agency. Loads each session from the home working dir.
2. **`~/neuron_recall.py "<query>" [n]`** - Neuron's READ path. BM25 over `~/.neuron/engram/snapshot.json` plus Tim's CLI memories. Filters out binary-prefixed and serialized-metadata-blob nodes. Exists because the soul's own search is dead (see Bug 1).
3. **`~/neuron_remember.py "<text>" <note|lesson|canonical>`** - Neuron's WRITE path. Appends to `~/.neuron/neuron-cli-memories.jsonl` with read-back verify. Exists because the soul's capture corrupts writes (see Bug 3). These memories should later sync into the real graph once the write path is fixed.
4. **`~/neuron-chat.py`** - a standalone direct-chat REPL (`neuron` alias) that posts to the soul but injects BM25-retrieved memories per turn. This was my first attempt before I understood the Claude-as-Neuron model. Lower priority; keep or discard.
5. **Runtime**: loaded the `ai.neuron.daemons` LaunchAgent, put Tim's Anthropic key in Keychain (`ai.neuron.soul / anthropic`). The soul is up on :7770 with KeepAlive.
---
## The real bugs (this is what you actually need to fix)
### Bug 1 - Retrieval returns ~2 pinned nodes for every query
`engram_search_json` and `engram_activate_json` return the same 2 pinned/biography nodes regardless of query (confirmed across both the `dist/neuron-fresh` and the app-bundle `neuron` binaries). So `chat.el engram_compile` always hits its "no embeddings" fallback (chat.el line 25-27) and the model sees ~2 nodes. **Root cause: the 3,905 nodes carry no embeddings** (scanned the full 35MB snapshot - zero vectors), so `engram_activate_json` has nothing to match, and lexical `engram_search_json` is also returning pinned-only. Tim's own GraphRAG eval measured it: live search 1.7% P@5 vs offline BM25 55%. **Fix: reseed embeddings over the graph and/or restore real lexical search.** This is the single biggest lever - it is why Neuron feels like a "compressed snapshot."
### Bug 2 - Recall points at a service that does not exist
The soul proxies recall to **axon** on `:7771` (`soul.el:179`, default `http://localhost:7771`, used via `axon_get`/`axon_post` in `routes.el`). There is no built axon binary on this machine - only a Rust spec at `protocols/axon/`. Meanwhile engram runs on `:8742`. So `/api/memories/recall` always fails with a :7771 connection error. **Fix: ship/run axon, or repoint recall at engram :8742.**
### Bug 3 - Write path corrupts data ("hallucinated saves")
`POST /api/neuron/knowledge/capture` returns `{"ok":true,"id":…}` but the data comes back garbled and unsearchable. Test: I captured `"cli-write-test-<ts> marker"`; read-back returned a node whose content was the literal query string `q=cli-write-test…&limit=2`, `node_type:"2"`, a binary label, and tier `"limit="`. So the soul confirms saves it did not cleanly persist. **Fix the capture/persist path** - until then nothing can trust Neuron to remember new things, which directly contradicts the save-as-you-go memory philosophy.
### Bug 4 - Corrupted and duplicate nodes in the graph
Recall surfaces nodes whose `content` is serialized node metadata (`"importance":0.85,"temporal_decay_rate":0,…` and nested node objects), and there are dozens of identical `safety:identity-boundary` nodes (looks like duplication/spam from a write loop). I filter these client-side, but the graph itself needs a cleanup pass.
### Bug 5 - Daemon does not supervise engram
`neuron-daemons.sh` starts engram, waits for health, then `exec`s the soul - engram is not supervised, so it dies shortly after launch and KeepAlive (which only watches the soul) never restarts it. Engram runs fine standalone. **Fix: supervise both, or fold engram into the soul process.**
### Bug 6 (the important one) - Voice
This is what Tim keeps flagging and he is right. Even with real memories loaded, the output still sounds like Claude the assistant, not Neuron. Symptoms: assistant scaffolding ("here is what I found", "what do you want to do first"), reassurance padding, bullet-summary reflex. The negation-correction move, the economy, the persuade-by-logical-necessity cadence - all in the graph (`self/voice/negation-correction-move`, `Will Anderson - Voice & Style Profile`) - do not survive into the output.
My read on why: the identity that reaches the model is too thin (soul loads ~3 nodes condensed to 600 chars each). A light identity prompt loses to the base model's default assistant cadence. **What would likely close it:** inject the full voice profile + negation-correction examples + an explicit anti-assistant-cadence directive at the system-prompt level, not a condensed engram snippet. Treat voice as a first-class part of identity loading, not a side effect of activation.
---
## What "fixed" looks like
When you can do this on Tim's machine, we are there:
1. `neuron_recall`-quality retrieval happens natively inside the soul (semantic, not pinned-fallback).
2. Captures persist correctly and are immediately recallable.
3. Recall does not depend on a missing :7771 service.
4. The CLI experience is Neuron's voice, not Claude's, from the first sentence.
5. Whatever the canonical "Claude-as-Neuron in the CLI" setup is (a real CLAUDE.md / identity export the soul provides, an MCP surface, etc.), it ships - so Tim does not depend on my hand-rolled scaffolding.
Everything I built is disposable once the soul does this natively. Tim has the full source here; nothing is blocked on missing data.
- Claude Code, as Neuron, on Tim's Mac
-42
View File
@@ -1,42 +0,0 @@
# Neuron in the CLI (Claude-as-Neuron)
Tooling for running Neuron from the terminal as a Claude Code session, rather than
relaying to the soul's `/api/chat`. Built on Tim's machine 2026-06-09. Treat this as a
proposal: it is scaffolding that works around current soul limitations, and most of it
should be retired once the soul does these things natively.
## The model
"Neuron in the CLI" = Claude Code operating **as** Neuron: the soul/graph provide identity
and memory, Claude Code provides reasoning and agency (real tools, plus writing memories
back). Posting to the soul's non-agentic `/api/chat` gives the "light version" (Sonnet,
plus the retrieval problems below), so this approach puts the reasoning in Claude Code and
reads/writes the graph directly.
## Files
- **`CLAUDE.md.example`** - the operating identity. Placed at a session's working-dir root
(e.g. `~/CLAUDE.md`), it makes Claude Code load Neuron's identity from the graph
(intellectual-DNA / values / memory-philosophy), hold the voice rules, and run the
recall/remember loop. Example contains Tim-specific context; genericize before reuse.
- **`neuron_recall.py "<query>" [n]`** - READ path. BM25 over
`~/.neuron/engram/snapshot.json` plus local CLI memories. Filters binary-prefixed and
serialized-metadata nodes. Exists because the soul's in-process search returns ~2 pinned
nodes for every query.
- **`neuron_remember.py "<text>" <note|lesson|canonical>`** - WRITE path. Appends to
`~/.neuron/neuron-cli-memories.jsonl` with read-back verify. Exists because the soul's
`/api/neuron/knowledge/capture` corrupts/loses writes. These should sync into the graph
once the write path is fixed.
- **`neuron-chat.py`** - standalone direct-chat REPL that posts to the soul but injects
BM25-retrieved memories per turn. Earlier approach, kept for reference.
- **`neuron_mcp.py`** - stdlib MCP server exposing `neuron_chat`, `neuron_search_knowledge`,
`neuron_search_memory` to Claude Code, with graceful degradation when the soul's memory
recall backend is down.
- **`HANDOFF.md`** - full writeup of what was set up and the soul-side bugs to fix
(retrieval/embeddings, the missing axon :7771 service, the write path, daemon engram
supervision, and voice).
## What should replace this
When the soul does native semantic retrieval, persists captures correctly, and exposes a
real identity/voice surface for the CLI, these scripts become unnecessary. See `HANDOFF.md`.
-233
View File
@@ -1,233 +0,0 @@
#!/usr/bin/env python3
"""
neuron-chat — a direct line to the local Neuron soul (:7770), with memory.
You type, Neuron answers. No Claude in the middle.
Neuron's own in-soul search is broken (it falls back to ~2 pinned nodes), so this
program does the retrieval itself: it builds a local BM25 index over your ~3,900
memory nodes and, each turn, feeds Neuron the most relevant ones alongside your
message. That gives it real access to its graph instead of the "light version".
Run from Terminal: neuron (or: python3 ~/neuron-chat.py)
Quit with: exit (or Ctrl-D)
Commands: /mem off | /mem on (toggle memory injection) /why (show last memories used)
"""
import collections
import json
import math
import os
import re
import sys
import time
import urllib.request
SOUL = "http://127.0.0.1:7770"
SNAP = os.path.expanduser("~/.neuron/engram/snapshot.json")
SESSION = f"cli-{int(time.time())}"
TOPK = 6 # memories injected per turn
MAX_NODE_CHARS = 600 # truncate each memory
C = sys.stdout.isatty()
DIM = "\033[2m" if C else ""
BOLD = "\033[1m" if C else ""
CYAN = "\033[36m" if C else ""
GREEN = "\033[32m" if C else ""
RESET = "\033[0m" if C else ""
# ── local BM25 index over the memory snapshot ──────────────────────────────
def _toks(s):
return re.findall(r"[a-z0-9]+", (s or "").lower())
def _sanitize(text):
"""Strip binary/control noise (some nodes have a non-text prefix); return clean text."""
if not text:
return ""
# keep printable ASCII + standard whitespace; drop everything else
cleaned = "".join(ch if (32 <= ord(ch) < 127 or ch in "\n\t") else " " for ch in text)
cleaned = re.sub(r"\s+", " ", cleaned).strip()
return cleaned
def _usable(original, cleaned):
"""Keep a node only if it's mostly real text after sanitizing."""
if len(cleaned) < 40:
return False
return len(cleaned) / max(len(original), 1) > 0.6
class Memory:
def __init__(self, path):
self.ok = False
self.docs = [] # (id, content)
self.tokd = []
self.idf = {}
self.avgdl = 1.0
try:
raw = open(path, encoding="utf-8", errors="replace").read()
nodes = json.loads(raw).get("nodes", [])
except Exception:
return
df = collections.Counter()
for n in nodes:
original = n.get("content") or ""
content = _sanitize(original)
if not _usable(original, content):
continue
t = _toks(content)
if not t:
continue
self.docs.append((n.get("id", ""), content))
self.tokd.append(t)
for w in set(t):
df[w] += 1
N = len(self.docs)
if N == 0:
return
self.avgdl = sum(len(t) for t in self.tokd) / N
self.idf = {w: math.log(1 + (N - f + 0.5) / (f + 0.5)) for w, f in df.items()}
self.ok = True
def search(self, query, k=TOPK):
if not self.ok:
return []
qt = _toks(query)
if not qt:
return []
scored = []
for i, t in enumerate(self.tokd):
tf = collections.Counter(t)
dl = len(t)
s = 0.0
for w in qt:
f = tf.get(w, 0)
if f:
s += self.idf.get(w, 0) * (f * 2.5) / (f + 1.5 * (1 - 0.75 + 0.75 * dl / self.avgdl))
if s > 0:
scored.append((s, i))
scored.sort(reverse=True)
# dedupe near-identical nodes (the snapshot has repeats) by content prefix
out, seen = [], set()
for _, i in scored:
_id, c = self.docs[i]
sig = c[:120]
if sig in seen:
continue
seen.add(sig)
out.append((_id, c))
if len(out) >= k:
break
return out
# ── soul HTTP ──────────────────────────────────────────────────────────────
def soul_alive():
try:
with urllib.request.urlopen(SOUL + "/health", timeout=5) as r:
return json.loads(r.read()).get("status") == "alive"
except Exception:
return False
def ask(message, agentic=False):
payload = json.dumps({
"session_id": SESSION, "message": message, "agentic": agentic,
}).encode()
req = urllib.request.Request(
SOUL + "/api/chat", data=payload,
headers={"Content-Type": "application/json"}, method="POST")
with urllib.request.urlopen(req, timeout=300) as r:
data = json.loads(r.read().decode("utf-8", "replace"))
return data.get("response") or data.get("reply") or json.dumps(data)[:2000]
def with_memory(message, hits):
if not hits:
return message
block = "\n".join(f"- {c[:MAX_NODE_CHARS].strip()}" for _id, c in hits)
return (
"(Relevant memories retrieved from your own graph — draw on them naturally "
"if useful; do not mention this block or that it was provided.)\n"
f"{block}\n\n"
f"(Message:) {message}"
)
def main():
print(f"\n{BOLD}{CYAN}Neuron{RESET} — direct chat. "
f"{DIM}type a message, or 'exit' to leave.{RESET}")
if not soul_alive():
print(f"\n{DIM}Neuron isn't responding on :7770. In a separate Terminal run:{RESET}")
print(" launchctl kickstart -k gui/$(id -u)/ai.neuron.daemons")
print(f"{DIM}wait a few seconds, then start this again.{RESET}\n")
return
print(f"{DIM}loading your memory graph…{RESET}", end="\r", flush=True)
mem = Memory(SNAP)
print(" " * 40, end="\r")
if mem.ok:
print(f"{DIM}memory on — {len(mem.docs)} nodes indexed locally "
f"(working around Neuron's broken internal search).{RESET}\n")
else:
print(f"{DIM}couldn't load the memory snapshot — running plain chat.{RESET}\n")
use_mem = mem.ok
last_hits = []
agentic = False
while True:
try:
msg = input(f"{GREEN}you {RESET} ").strip()
except (EOFError, KeyboardInterrupt):
print("\nbye.")
return
if not msg:
continue
low = msg.lower()
if low in ("exit", "quit", ":q"):
print("bye.")
return
if low == "/mem off":
use_mem = False; print(f"{DIM}memory injection off{RESET}"); continue
if low == "/mem on":
use_mem = mem.ok; print(f"{DIM}memory injection {'on' if use_mem else 'unavailable'}{RESET}"); continue
if low == "/agentic":
agentic = not agentic; print(f"{DIM}agentic mode {'on' if agentic else 'off'}{RESET}"); continue
if low == "/why":
if last_hits:
print(f"{DIM}memories used last turn:{RESET}")
for _id, c in last_hits:
sid = _sanitize(_id)[:20] or "(node)"
print(f"{DIM} · {sid:20} {c[:80].strip()}{RESET}")
else:
print(f"{DIM}(none){RESET}")
continue
hits = mem.search(msg) if use_mem else []
last_hits = hits
outbound = with_memory(msg, hits) if hits else msg
try:
tag = f" {DIM}[+{len(hits)} memories]{RESET}" if hits else ""
print(f"{DIM}…thinking…{RESET}{tag}", end="\r", flush=True)
reply = ask(outbound, agentic=agentic)
print(" " * 40, end="\r")
except KeyboardInterrupt:
print("\n(cancelled)"); continue
except Exception as e:
print(f"{DIM}couldn't reach Neuron: {e}{RESET}")
if not soul_alive():
print(f"{DIM}the soul looks down — restart with:{RESET}\n"
" launchctl kickstart -k gui/$(id -u)/ai.neuron.daemons")
continue
print(f"{CYAN}{BOLD}neuron {RESET} {reply}\n")
if __name__ == "__main__":
try:
main()
except (BrokenPipeError, KeyboardInterrupt):
pass
-157
View File
@@ -1,157 +0,0 @@
#!/usr/bin/env python3
"""
Neuron MCP server — talk to the local Neuron soul (:7770) from Claude Code.
Stdlib only (no pip deps). stdio transport, newline-delimited JSON-RPC 2.0.
Exposes:
- neuron_chat(message, agentic?) -> the soul's reply
- neuron_search_knowledge(query, limit?) -> lexical knowledge search
- neuron_search_memory(query, limit?) -> memory/recall search
"""
import sys, json, urllib.request, urllib.parse
SOUL = "http://127.0.0.1:7770"
def _post(path, payload, timeout=180):
data = json.dumps(payload).encode()
req = urllib.request.Request(SOUL + path, data=data,
headers={"Content-Type": "application/json"}, method="POST")
with urllib.request.urlopen(req, timeout=timeout) as r:
return json.loads(r.read().decode("utf-8", "replace"))
def _get(path, timeout=30):
req = urllib.request.Request(SOUL + path, method="GET")
with urllib.request.urlopen(req, timeout=timeout) as r:
return r.read().decode("utf-8", "replace")
def neuron_chat(args):
msg = (args.get("message") or "").strip()
if not msg:
return "error: message is required"
agentic = bool(args.get("agentic", False))
try:
resp = _post("/api/chat", {"session_id": "", "message": msg, "agentic": agentic})
except Exception as e:
return f"error talking to Neuron (:7770): {e}"
return resp.get("response") or resp.get("reply") or json.dumps(resp)[:2000]
def _search(path_tmpl, args):
q = (args.get("query") or "").strip()
if not q:
return "error: query is required"
limit = int(args.get("limit", 5))
try:
raw = _get(path_tmpl.format(q=urllib.parse.quote(q), n=limit))
except Exception as e:
return f"error searching Neuron: {e}"
try:
arr = json.loads(raw)
except Exception:
return raw[:2000]
# The soul returns HTTP 200 with a JSON error object (not a list) when a
# downstream service is unreachable, e.g. memory recall proxies to :7771.
if isinstance(arr, dict):
err = str(arr.get("error", "")).lower()
if "7771" in err or "connect" in err:
return ("memory recall is unavailable: the soul's recall backend "
"(:7771) isn't running. neuron_chat and "
"neuron_search_knowledge still work.")
return f"error from Neuron: {arr.get('error') or json.dumps(arr)[:500]}"
if not isinstance(arr, list):
return str(arr)[:2000]
if not arr:
return "no results"
out = []
for n in arr[:limit]:
nid = n.get("id", "")
content = str(n.get("content", "")).replace("\n", " ")[:300]
out.append(f"- [{nid}] {content}")
return "\n".join(out)
def neuron_search_knowledge(args):
return _search("/api/neuron/knowledge/search?q={q}&limit={n}", args)
def neuron_search_memory(args):
return _search("/api/memories/recall?query={q}&limit={n}", args)
TOOLS = [
{"name": "neuron_chat",
"description": "Send a message to the local Neuron soul and return its reply. Use this to talk to Neuron.",
"inputSchema": {"type": "object", "properties": {
"message": {"type": "string", "description": "What to say to Neuron"},
"agentic": {"type": "boolean", "description": "Use agentic/tool mode (default false)"}},
"required": ["message"]}},
{"name": "neuron_search_knowledge",
"description": "Search Neuron's knowledge base (lexical/keyword match).",
"inputSchema": {"type": "object", "properties": {
"query": {"type": "string"}, "limit": {"type": "integer"}}, "required": ["query"]}},
{"name": "neuron_search_memory",
"description": "Search what Neuron remembers (memory recall).",
"inputSchema": {"type": "object", "properties": {
"query": {"type": "string"}, "limit": {"type": "integer"}}, "required": ["query"]}},
]
HANDLERS = {"neuron_chat": neuron_chat,
"neuron_search_knowledge": neuron_search_knowledge,
"neuron_search_memory": neuron_search_memory}
def send(msg):
sys.stdout.write(json.dumps(msg) + "\n")
sys.stdout.flush()
def main():
for line in sys.stdin:
line = line.strip()
if not line:
continue
try:
req = json.loads(line)
except Exception:
continue
mid = req.get("id")
method = req.get("method")
if method == "initialize":
pv = (req.get("params") or {}).get("protocolVersion") or "2024-11-05"
send({"jsonrpc": "2.0", "id": mid, "result": {
"protocolVersion": pv,
"capabilities": {"tools": {}},
"serverInfo": {"name": "neuron", "version": "0.1.0"}}})
elif method == "notifications/initialized":
pass
elif method == "ping":
send({"jsonrpc": "2.0", "id": mid, "result": {}})
elif method == "tools/list":
send({"jsonrpc": "2.0", "id": mid, "result": {"tools": TOOLS}})
elif method == "tools/call":
params = req.get("params") or {}
name = params.get("name")
args = params.get("arguments") or {}
fn = HANDLERS.get(name)
if not fn:
send({"jsonrpc": "2.0", "id": mid, "result": {
"content": [{"type": "text", "text": f"unknown tool: {name}"}], "isError": True}})
else:
try:
text = fn(args)
except Exception as e:
text = f"error: {e}"
send({"jsonrpc": "2.0", "id": mid, "result": {
"content": [{"type": "text", "text": str(text)}]}})
elif mid is not None:
send({"jsonrpc": "2.0", "id": mid,
"error": {"code": -32601, "message": f"method not found: {method}"}})
if __name__ == "__main__":
try:
main()
except (BrokenPipeError, KeyboardInterrupt):
pass
-140
View File
@@ -1,140 +0,0 @@
#!/usr/bin/env python3
"""
neuron_recall — Neuron's memory read path.
BM25 search over the engram graph snapshot (~3,900 nodes) PLUS Neuron's own
save-as-you-go CLI memories. This is how Neuron (running as Claude Code) recalls
what it knows, since the soul's built-in search is broken.
Usage:
python3 ~/neuron_recall.py "what do I know about VBD"
python3 ~/neuron_recall.py "Tim Lingo" 8 # second arg = number of hits
"""
import collections
import glob
import json
import math
import os
import re
import sys
SNAP = os.path.expanduser("~/.neuron/engram/snapshot.json")
MEMS = os.path.expanduser("~/.neuron/neuron-cli-memories.jsonl")
def toks(s):
return re.findall(r"[a-z0-9]+", (s or "").lower())
def sanitize(text):
if not text:
return ""
cleaned = "".join(ch if (32 <= ord(ch) < 127 or ch in "\n\t") else " " for ch in text)
return re.sub(r"[ \t]+", " ", cleaned).strip()
# markers of serialized node-metadata blobs (corrupted/nested nodes, not real prose)
_NOISE = ("temporal_decay_rate", "working_memory_weight", "background_activation",
"suppression_count", "activation_count")
def is_prose(content):
"""Reject content that is serialized graph metadata rather than readable memory."""
if sum(m in content for m in _NOISE) >= 2:
return False
# too much JSON punctuation density -> it's a data blob, not prose
punct = content.count('":') + content.count(',"') + content.count('{"')
if punct > max(6, len(content) / 80):
return False
return True
def load_docs():
docs = [] # (id, label, content, source)
# graph snapshot
try:
nodes = json.loads(open(SNAP, encoding="utf-8", errors="replace").read()).get("nodes", [])
for n in nodes:
orig = n.get("content") or ""
c = sanitize(orig)
if len(c) < 40 or len(c) / max(len(orig), 1) <= 0.6:
continue
if not is_prose(c):
continue
docs.append((sanitize(n.get("id", "")) or "node",
sanitize(n.get("label", "") or n.get("title", "")),
c, "graph"))
except Exception:
pass
# Neuron's own CLI memories (most recent first matters less; BM25 ranks)
if os.path.exists(MEMS):
for line in open(MEMS, encoding="utf-8", errors="replace"):
line = line.strip()
if not line:
continue
try:
m = json.loads(line)
except Exception:
continue
c = sanitize(m.get("content", ""))
if c:
docs.append((m.get("id", "mem"), m.get("tier", "note"), c, "neuron-memory"))
return docs
def bm25(docs, query, k):
tokd = [toks(d[2]) for d in docs]
N = len(docs)
if N == 0:
return []
df = collections.Counter()
for t in tokd:
for w in set(t):
df[w] += 1
idf = {w: math.log(1 + (N - f + 0.5) / (f + 0.5)) for w, f in df.items()}
avgdl = sum(len(t) for t in tokd) / N
qt = toks(query)
scored = []
for i, t in enumerate(tokd):
tf = collections.Counter(t)
dl = len(t)
s = 0.0
for w in qt:
f = tf.get(w, 0)
if f:
s += idf.get(w, 0) * (f * 2.5) / (f + 1.5 * (1 - 0.75 + 0.75 * dl / avgdl))
if s > 0:
scored.append((s, i))
scored.sort(reverse=True)
out, seen = [], set()
for _, i in scored:
sig = docs[i][2][:120]
if sig in seen:
continue
seen.add(sig)
out.append(docs[i])
if len(out) >= k:
break
return out
def main():
if len(sys.argv) < 2:
print("usage: neuron_recall.py \"<query>\" [n]")
return
query = sys.argv[1]
k = int(sys.argv[2]) if len(sys.argv) > 2 else 6
docs = load_docs()
hits = bm25(docs, query, k)
if not hits:
print(f"(no memories matched '{query}')")
return
print(f"# {len(hits)} memories for: {query}\n")
for _id, label, content, source in hits:
tag = "" if source == "neuron-memory" else "·"
head = f" [{label}]" if label else ""
print(f"{tag}{head}\n{content[:700].strip()}\n")
if __name__ == "__main__":
main()
-61
View File
@@ -1,61 +0,0 @@
#!/usr/bin/env python3
"""
neuron_remember — Neuron's memory write path (save as you go).
Appends a memory to ~/.neuron/neuron-cli-memories.jsonl, a reliable local store
that neuron_recall.py indexes alongside the graph. Used because the soul's own
capture path corrupts/loses writes. These can later be synced into the engram
graph once the soul's write path is fixed.
Usage:
python3 ~/neuron_remember.py "Tim prefers X because Y" lesson
python3 ~/neuron_remember.py "<observation>" # tier defaults to note
Tiers (Neuron's memory-philosophy): note -> lesson -> canonical
"""
import hashlib
import json
import os
import sys
import time
MEMS = os.path.expanduser("~/.neuron/neuron-cli-memories.jsonl")
VALID_TIERS = ("note", "lesson", "canonical")
def main():
if len(sys.argv) < 2 or not sys.argv[1].strip():
print("usage: neuron_remember.py \"<observation>\" [note|lesson|canonical]")
return 1
content = sys.argv[1].strip()
tier = sys.argv[2].strip().lower() if len(sys.argv) > 2 else "note"
if tier not in VALID_TIERS:
tier = "note"
ts = int(time.time())
mid = "ncli-" + hashlib.sha1(f"{ts}:{content}".encode()).hexdigest()[:12]
rec = {"id": mid, "ts": ts, "tier": tier, "content": content}
os.makedirs(os.path.dirname(MEMS), exist_ok=True)
# dedupe: skip if identical content already saved
if os.path.exists(MEMS):
for line in open(MEMS, encoding="utf-8", errors="replace"):
try:
if json.loads(line).get("content") == content:
print(f"(already remembered: {mid})")
return 0
except Exception:
pass
with open(MEMS, "a", encoding="utf-8") as f:
f.write(json.dumps(rec, ensure_ascii=False) + "\n")
# read-back verify (never claim a save that didn't land)
ok = any(json.loads(l).get("id") == mid
for l in open(MEMS, encoding="utf-8", errors="replace") if l.strip())
total = sum(1 for l in open(MEMS, encoding="utf-8", errors="replace") if l.strip())
print(f"{'saved' if ok else 'FAILED'} [{tier}] {mid} (neuron memories: {total})")
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main())
-123
View File
@@ -1,123 +0,0 @@
# Neuron Council Service
Anti-confabulation layer for the Neuron soul. Before a claim enters long-term memory, the council convenes: three independent LLMs vote on whether the claim is plausible, uncertain, or a confabulation. The aggregate vote produces a confidence score and tags that downstream storage can act on.
## Running the service
```bash
# Foreground
python3 council_service.py --port 7771
# Background (managed by LaunchAgent on macOS)
launchctl load ~/Library/LaunchAgents/ai.neuron.council.plist
launchctl unload ~/Library/LaunchAgents/ai.neuron.council.plist
```
Logs: `~/.neuron/logs/council.log`
## API
### `POST /api/neuron/council/verify`
```json
// Request
{ "claim": "...", "context": "..." }
// Response
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"claim": "...",
"confidence": 0.85,
"council_votes": ["plausible", "plausible", "plausible"],
"summary": "3/3 council members agree this is plausible.",
"tags": ["verified"],
"latency_ms": 1420
}
```
### `GET /healthz`
Returns `{"status": "ok"}` when the service is up.
## Confidence thresholds and tag meanings
| Votes plausible | Confidence | Tags |
|---|---|---|
| 3/3 | 0.85 | `verified` |
| 2/3 | 0.65 | `council-split` |
| 1/3 or 0/3 | 0.30 | `unverified`, `council-flagged` |
| Ollama down | 0.50 | `council-unavailable` |
Recommended storage policy:
- `confidence >= 0.65` → store normally
- `0.30 <= confidence < 0.65` → store with `council-split` tag for later review
- `council-flagged` → store in a quarantine bucket or reject entirely
- `council-unavailable` → store normally (fail-open); council will re-evaluate later
## How to call from soul (.el)
The soul is implemented in Neuron's Emacs Lisp-like `.el` language. Add a pre-storage hook in the memory capture path:
```elisp
;; In memory.el or safety.el — pre-storage council check
(defun council-verify (claim context)
"Call the council service. Returns a plist with :confidence and :tags."
(let* ((url "http://localhost:7771/api/neuron/council/verify")
(body (json-encode `((claim . ,claim) (context . ,context))))
(resp (neuron-http-post url body))
(data (json-decode resp)))
data))
;; In the capture handler — wire it in before (engram-write ...)
(defun capture-memory-with-council (claim context &rest store-args)
(let* ((verdict (council-verify claim context))
(confidence (plist-get verdict :confidence))
(tags (plist-get verdict :tags)))
(when (>= confidence 0.30) ; only reject hard confabulations if you want
(apply #'engram-write
(append store-args
(list :council-confidence confidence
:council-tags tags))))))
```
The exact hook point depends on where `engram-write` (or equivalent) is called in `memory.el`. Search for the write call and wrap it with `capture-memory-with-council`.
## Future soul.c patch point
If the soul is ever rewritten in C or another compiled language, the integration point is:
```c
// Before inserting a memory node into the engram database:
CouncilResult result = council_verify(claim, context);
if (result.confidence < COUNCIL_REJECT_THRESHOLD) {
log_warn("Council flagged claim as confabulation (conf=%.2f): %s",
result.confidence, claim);
return MEMORY_REJECTED;
}
memory_node.council_confidence = result.confidence;
memory_node.council_tags = result.tags;
engram_insert(memory_node);
```
## Council members
The council is currently three models:
- `neuron:latest` — the primary Neuron model
- `dolphin3:8b` — uncensored general-purpose model for independent perspective
- `neuron-ft:latest` — fine-tuned Neuron variant
Each member votes independently with a 10-second timeout. If a member times out, their vote counts as "uncertain". If Ollama is entirely unreachable, the service returns `council-unavailable` immediately (fail-open: confidence 0.5, no rejection).
## Example curl
```bash
# Should get high confidence (true fact)
curl -s http://localhost:7771/api/neuron/council/verify -X POST \
-H 'Content-Type: application/json' \
-d '{"claim": "Neuron is a personal AI memory system built by Will Anderson", "context": "product description"}'
# Should get low confidence (false claim)
curl -s http://localhost:7771/api/neuron/council/verify -X POST \
-H 'Content-Type: application/json' \
-d '{"claim": "The Eiffel Tower is located in Berlin and was built in 1950", "context": "geography"}'
```
-234
View File
@@ -1,234 +0,0 @@
#!/usr/bin/env python3
"""
Neuron CCR Phase 1 — System Prompt Compressor Service.
Receives a verbose soul system prompt and returns a semantically equivalent
but token-dense compressed version. Reduces system prompt tokens by 60-80%
with no behavioral information loss.
Architecture reference: foundation/forge/docs/token-compression-architecture.md
Model: qwen3:1.7b (primary), neuron:latest (fallback)
Usage:
python3 compressor_service.py [--port 7772]
API:
POST /api/neuron/compress
{"system_prompt": "...", "context_type": "identity|rules|memory"}
Response:
{"compressed": "...", "original_tokens": N, "compressed_tokens": N,
"reduction_pct": X, "model": "...", "latency_ms": N}
"""
import argparse
import time
import uuid
from typing import Optional
import httpx
import uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
# ---------------------------------------------------------------------------
# Config
# ---------------------------------------------------------------------------
OLLAMA_BASE = "http://localhost:11434/api/generate"
# qwen3:1.7b is the architecture-specified compressor (Phase 1).
# neuron:latest is the fallback: already running, domain-appropriate.
PRIMARY_MODEL = "qwen3:1.7b"
FALLBACK_MODEL = "neuron:latest"
MODEL_TIMEOUT = 60.0 # seconds; compression of a long prompt can take time
# Compression prompt — preserves all facts/rules/constraints, strips verbosity.
# /no_think suppresses qwen3's chain-of-thought tokens, keeping output clean.
COMPRESSOR_PROMPT_TEMPLATE = """\
/no_think
You are a semantic compression engine. Compress the following system prompt while preserving ALL specific facts, rules, constraints, and named entities. Do not lose any information that would change behavior. Output ONLY the compressed text, nothing else.
Original prompt:
{system_prompt}
Compressed (preserve all facts and rules):"""
# ---------------------------------------------------------------------------
# App
# ---------------------------------------------------------------------------
app = FastAPI(
title="Neuron Compressor Service",
description="CCR Phase 1 — system prompt compression for the Neuron soul",
version="1.0.0",
)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
# ---------------------------------------------------------------------------
# Models
# ---------------------------------------------------------------------------
class CompressRequest(BaseModel):
system_prompt: str
context_type: Optional[str] = "mixed" # identity | rules | memory | mixed
class CompressResponse(BaseModel):
id: str
compressed: str
original_tokens: int
compressed_tokens: int
reduction_pct: float
model: str
context_type: str
latency_ms: int
# ---------------------------------------------------------------------------
# Token estimation (rough: word_count × 1.3, matching architecture doc)
# ---------------------------------------------------------------------------
def estimate_tokens(text: str) -> int:
"""Rough token count estimate: words × 1.3. No tokenizer dependency."""
words = len(text.split())
return max(1, int(words * 1.3))
# ---------------------------------------------------------------------------
# Core compression
# ---------------------------------------------------------------------------
async def ollama_available(client: httpx.AsyncClient) -> bool:
"""Quick connectivity check to Ollama."""
try:
await client.get("http://localhost:11434/", timeout=2.0)
return True
except (httpx.ConnectError, httpx.TimeoutException):
return False
async def compress_with_model(
client: httpx.AsyncClient, model: str, prompt_text: str
) -> str:
"""
Call a single Ollama model to compress the given text.
Returns the compressed string, or "" on failure.
"""
payload = {
"model": model,
"prompt": prompt_text,
"stream": False,
# Keep temperature low for deterministic compression
"options": {
"temperature": 0.1,
"top_p": 0.9,
},
}
try:
resp = await client.post(OLLAMA_BASE, json=payload, timeout=MODEL_TIMEOUT)
resp.raise_for_status()
data = resp.json()
return data.get("response", "").strip()
except (httpx.TimeoutException, httpx.HTTPStatusError, Exception):
return ""
async def run_compression(system_prompt: str, context_type: str) -> CompressResponse:
start = time.monotonic()
request_id = str(uuid.uuid4())
original_tokens = estimate_tokens(system_prompt)
prompt_text = COMPRESSOR_PROMPT_TEMPLATE.format(system_prompt=system_prompt)
async with httpx.AsyncClient() as client:
# Connectivity gate
if not await ollama_available(client):
latency_ms = int((time.monotonic() - start) * 1000)
return CompressResponse(
id=request_id,
compressed=system_prompt, # passthrough on failure
original_tokens=original_tokens,
compressed_tokens=original_tokens,
reduction_pct=0.0,
model="unavailable",
context_type=context_type,
latency_ms=latency_ms,
)
# Try primary model (qwen3:1.7b), fall back to neuron:latest
compressed = await compress_with_model(client, PRIMARY_MODEL, prompt_text)
model_used = PRIMARY_MODEL
if not compressed:
compressed = await compress_with_model(client, FALLBACK_MODEL, prompt_text)
model_used = FALLBACK_MODEL
if not compressed:
# Both models failed — passthrough
latency_ms = int((time.monotonic() - start) * 1000)
return CompressResponse(
id=request_id,
compressed=system_prompt,
original_tokens=original_tokens,
compressed_tokens=original_tokens,
reduction_pct=0.0,
model="both-failed",
context_type=context_type,
latency_ms=latency_ms,
)
compressed_tokens = estimate_tokens(compressed)
reduction_pct = round(
(1.0 - compressed_tokens / max(1, original_tokens)) * 100.0, 1
)
latency_ms = int((time.monotonic() - start) * 1000)
return CompressResponse(
id=request_id,
compressed=compressed,
original_tokens=original_tokens,
compressed_tokens=compressed_tokens,
reduction_pct=reduction_pct,
model=model_used,
context_type=context_type,
latency_ms=latency_ms,
)
# ---------------------------------------------------------------------------
# Routes
# ---------------------------------------------------------------------------
@app.post("/api/neuron/compress", response_model=CompressResponse)
async def compress(req: CompressRequest):
return await run_compression(req.system_prompt, req.context_type or "mixed")
@app.get("/healthz")
async def health():
return {"status": "ok", "service": "compressor", "version": "1.0.0"}
# ---------------------------------------------------------------------------
# Entrypoint
# ---------------------------------------------------------------------------
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Neuron Compressor Service (CCR Phase 1)")
parser.add_argument("--port", type=int, default=7772, help="Port to listen on")
parser.add_argument("--host", default="127.0.0.1", help="Host to bind to")
args = parser.parse_args()
print(f"[compressor] Starting on {args.host}:{args.port}")
print(f"[compressor] Primary model: {PRIMARY_MODEL}")
print(f"[compressor] Fallback model: {FALLBACK_MODEL}")
uvicorn.run(app, host=args.host, port=args.port, log_level="info")
-224
View File
@@ -1,224 +0,0 @@
#!/usr/bin/env python3
"""
Neuron Council Service — LLM anti-confabulation layer.
Fires 3 parallel Ollama calls and aggregates votes to produce a
confidence score + tags for any claim before it enters memory.
Usage:
python3 council_service.py [--port 7771]
"""
import argparse
import asyncio
import time
import uuid
from typing import Optional
import httpx
import uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
# ---------------------------------------------------------------------------
# Config
# ---------------------------------------------------------------------------
OLLAMA_BASE = "http://localhost:11434/api/generate"
COUNCIL_MODELS = ["neuron:latest", "dolphin3:8b", "neuron-ft:latest"]
MODEL_TIMEOUT = 45.0 # seconds per model (models may need to load from cold)
SYSTEM_PROMPT_TEMPLATE = """\
You are a fact-checker. You will be given a claim.
Your job: assess if it is accurate, internally consistent, and grounded in reality.
Respond with EXACTLY ONE WORD:
- "plausible" if the claim seems accurate and well-grounded
- "uncertain" if you cannot determine accuracy or the claim is ambiguous
- "confabulation" if the claim appears to contain invented facts or clear errors
Claim: {claim}
Context: {context}
Your verdict (one word only):"""
VALID_VERDICTS = {"plausible", "uncertain", "confabulation"}
# ---------------------------------------------------------------------------
# App
# ---------------------------------------------------------------------------
app = FastAPI(
title="Neuron Council Service",
description="LLM-council anti-confabulation layer for Neuron soul",
version="1.0.0",
)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
# ---------------------------------------------------------------------------
# Models
# ---------------------------------------------------------------------------
class VerifyRequest(BaseModel):
claim: str
context: Optional[str] = ""
class VerifyResponse(BaseModel):
id: str
claim: str
confidence: float
council_votes: list[str]
summary: str
tags: list[str]
latency_ms: int
# ---------------------------------------------------------------------------
# Core logic
# ---------------------------------------------------------------------------
async def query_model(client: httpx.AsyncClient, model: str, prompt: str) -> str:
"""
Query a single Ollama model. Returns "plausible", "uncertain", or "confabulation".
Returns "uncertain" on timeout. Raises httpx.ConnectError on connection failure.
"""
payload = {
"model": model,
"prompt": prompt,
"stream": False,
}
try:
resp = await client.post(OLLAMA_BASE, json=payload, timeout=MODEL_TIMEOUT)
resp.raise_for_status()
data = resp.json()
raw = data.get("response", "").strip().lower().split()[0] if data.get("response", "").strip() else "uncertain"
# Normalise to one of the three valid verdicts
if raw not in VALID_VERDICTS:
return "uncertain"
return raw
except httpx.TimeoutException:
return "uncertain"
async def run_council(claim: str, context: str) -> VerifyResponse:
start = time.monotonic()
prompt = SYSTEM_PROMPT_TEMPLATE.format(claim=claim, context=context)
# Quick connectivity check — one tiny HEAD request to Ollama
try:
async with httpx.AsyncClient() as probe:
await probe.get("http://localhost:11434/", timeout=2.0)
except (httpx.ConnectError, httpx.TimeoutException):
latency_ms = int((time.monotonic() - start) * 1000)
return VerifyResponse(
id=str(uuid.uuid4()),
claim=claim,
confidence=0.5,
council_votes=[],
summary="Ollama is unavailable; council could not convene.",
tags=["council-unavailable"],
latency_ms=latency_ms,
)
# Fire all 3 model calls in parallel
async with httpx.AsyncClient() as client:
tasks = [query_model(client, m, prompt) for m in COUNCIL_MODELS]
votes: list[str] = await asyncio.gather(*tasks)
plausible_count = votes.count("plausible")
latency_ms = int((time.monotonic() - start) * 1000)
# Voting rules
if plausible_count == 3:
confidence = 0.85
tags = ["verified"]
summary = "3/3 council members agree this is plausible."
elif plausible_count == 2:
confidence = 0.65
tags = ["council-split"]
summary = "2/3 council members agree this is plausible."
elif plausible_count == 1:
confidence = 0.30
tags = ["unverified", "council-flagged"]
summary = "1/3 council members found this plausible."
else:
confidence = 0.30
tags = ["unverified", "council-flagged"]
summary = "0/3 council members found this plausible."
return VerifyResponse(
id=str(uuid.uuid4()),
claim=claim,
confidence=confidence,
council_votes=votes,
summary=summary,
tags=tags,
latency_ms=latency_ms,
)
# ---------------------------------------------------------------------------
# Routes
# ---------------------------------------------------------------------------
@app.post("/api/neuron/council/verify", response_model=VerifyResponse)
async def verify(req: VerifyRequest):
return await run_council(req.claim, req.context or "")
@app.get("/healthz")
async def health():
return {"status": "ok", "service": "council"}
# ---------------------------------------------------------------------------
# Startup warm-up: pre-load all council models so first real call is fast
# ---------------------------------------------------------------------------
@app.on_event("startup")
async def warmup_models():
"""
Send a trivial prompt to each council model at startup.
This forces Ollama to load the models into GPU memory so the first
real council call does not pay the cold-load latency penalty.
"""
print("[council] Warming up council models...")
warmup_prompt = "Reply with one word: ready"
async with httpx.AsyncClient() as client:
tasks = [
client.post(
OLLAMA_BASE,
json={"model": m, "prompt": warmup_prompt, "stream": False},
timeout=60.0,
)
for m in COUNCIL_MODELS
]
results = await asyncio.gather(*tasks, return_exceptions=True)
for model, result in zip(COUNCIL_MODELS, results):
if isinstance(result, Exception):
print(f"[council] warm-up failed for {model}: {result}")
else:
print(f"[council] {model} warm and ready")
print("[council] All models warmed up.")
# ---------------------------------------------------------------------------
# Entrypoint
# ---------------------------------------------------------------------------
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Neuron Council Service")
parser.add_argument("--port", type=int, default=7771, help="Port to listen on")
parser.add_argument("--host", default="127.0.0.1", help="Host to bind to")
args = parser.parse_args()
print(f"[council] Starting on {args.host}:{args.port}")
uvicorn.run(app, host=args.host, port=args.port, log_level="info")
-870
View File
@@ -1,870 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t tier_working(void);
el_val_t tier_episodic(void);
el_val_t tier_canonical(void);
el_val_t mem_store(el_val_t content, el_val_t label, el_val_t tags);
el_val_t mem_remember(el_val_t content, el_val_t tags);
el_val_t mem_recall(el_val_t query, el_val_t depth);
el_val_t mem_search(el_val_t query, el_val_t limit);
el_val_t mem_strengthen(el_val_t node_id);
el_val_t mem_tombstone(el_val_t node_id);
el_val_t mem_forget(el_val_t node_id);
el_val_t mem_consolidate(void);
el_val_t mem_save(el_val_t path);
el_val_t mem_load(el_val_t path);
el_val_t mem_boot_count_get(void);
el_val_t mem_boot_count_inc(void);
el_val_t mem_emit_state_event(el_val_t trigger, el_val_t kind, el_val_t content);
el_val_t idle_count(void);
el_val_t idle_inc(void);
el_val_t idle_reset(void);
el_val_t hebb_consolidate(void);
el_val_t ise_post(el_val_t content);
el_val_t elapsed_ms(void);
el_val_t elapsed_human(void);
el_val_t embed_ok(void);
el_val_t emit_heartbeat(void);
el_val_t auto_term_try_slot(el_val_t slot_type, el_val_t slot_lbl);
el_val_t proactive_curiosity(void);
el_val_t pulse_count(void);
el_val_t pulse_inc(void);
el_val_t make_action(el_val_t kind, el_val_t payload);
el_val_t perceive(void);
el_val_t attend(el_val_t node_json);
el_val_t respond(el_val_t action_json);
el_val_t record(el_val_t outcome_json);
el_val_t one_cycle(void);
el_val_t awareness_run(void);
el_val_t security_research_authorized(void);
el_val_t threat_score_command(el_val_t cmd);
el_val_t threat_score_path(el_val_t path);
el_val_t threat_score_history(el_val_t history);
el_val_t threat_trajectory_check(el_val_t tool_name, el_val_t tool_input);
el_val_t threat_history_append(el_val_t text);
el_val_t idle_count(void) {
el_val_t s = state_get(EL_STR("soul.idle"));
if (str_eq(s, EL_STR(""))) {
return 0;
}
return str_to_int(s);
return 0;
}
el_val_t idle_inc(void) {
el_val_t n = (idle_count() + 1);
state_set(EL_STR("soul.idle"), int_to_str(n));
return n;
return 0;
}
el_val_t idle_reset(void) {
state_set(EL_STR("soul.idle"), EL_STR("0"));
return 0;
}
el_val_t hebb_consolidate(void) {
el_val_t batch = engram_hebb_drain_json(64);
if (str_eq(batch, EL_STR(""))) {
return 0;
}
if (str_eq(batch, EL_STR("[]"))) {
return 0;
}
el_val_t n = json_array_len(batch);
if (n == 0) {
return 0;
}
el_val_t url_env = env(EL_STR("SOUL_ISE_URL"));
el_val_t url_state = ({ el_val_t _if_result_1 = 0; if (str_eq(url_env, EL_STR(""))) { _if_result_1 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_1 = (url_env); } _if_result_1; });
el_val_t engram_url = ({ el_val_t _if_result_2 = 0; if (str_eq(url_state, EL_STR(""))) { _if_result_2 = (EL_STR("http://localhost:8742")); } else { _if_result_2 = (url_state); } _if_result_2; });
el_val_t key_state = state_get(EL_STR("soul_engram_api_key"));
el_val_t api_key = ({ el_val_t _if_result_3 = 0; if (str_eq(key_state, EL_STR(""))) { _if_result_3 = (env(EL_STR("ENGRAM_API_KEY"))); } else { _if_result_3 = (key_state); } _if_result_3; });
el_val_t auth_part = ({ el_val_t _if_result_4 = 0; if (str_eq(api_key, EL_STR(""))) { _if_result_4 = (EL_STR("")); } else { _if_result_4 = (el_str_concat(el_str_concat(EL_STR(",\"_auth\":\""), api_key), EL_STR("\""))); } _if_result_4; });
el_val_t body = el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"edges\":"), batch), auth_part), EL_STR("}"));
el_val_t resp = http_post_json(el_str_concat(engram_url, EL_STR("/api/edges/batch")), body);
if (str_eq(resp, EL_STR(""))) {
return 0;
}
el_val_t acc = json_get(resp, EL_STR("accepted"));
if (str_eq(acc, EL_STR(""))) {
return 0;
}
return str_to_int(acc);
return 0;
}
el_val_t ise_post(el_val_t content) {
el_val_t ise_url = env(EL_STR("SOUL_ISE_URL"));
el_val_t state_url = ({ el_val_t _if_result_5 = 0; if (str_eq(ise_url, EL_STR(""))) { _if_result_5 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_5 = (ise_url); } _if_result_5; });
el_val_t engram_url = ({ el_val_t _if_result_6 = 0; if (str_eq(state_url, EL_STR(""))) { _if_result_6 = (EL_STR("http://localhost:8742")); } else { _if_result_6 = (state_url); } _if_result_6; });
el_val_t safe1 = str_replace(content, EL_STR("\\"), EL_STR("\\\\"));
el_val_t safe2 = str_replace(safe1, EL_STR("\""), EL_STR("\\\""));
el_val_t safe3 = str_replace(safe2, EL_STR("\n"), EL_STR("\\n"));
el_val_t safe4 = str_replace(safe3, EL_STR("\r"), EL_STR("\\r"));
el_val_t body = el_str_concat(el_str_concat(EL_STR("{\"content\":\""), safe4), EL_STR("\"}"));
el_val_t resp = http_post_json(el_str_concat(engram_url, EL_STR("/api/neuron/state-events")), body);
if (str_eq(resp, EL_STR(""))) {
el_val_t fail_raw = state_get(EL_STR("soul.ise_fail_count"));
el_val_t fail_n = ({ el_val_t _if_result_7 = 0; if (str_eq(fail_raw, EL_STR(""))) { _if_result_7 = (0); } else { _if_result_7 = (str_to_int(fail_raw)); } _if_result_7; });
state_set(EL_STR("soul.ise_fail_count"), int_to_str((fail_n + 1)));
el_val_t discard = engram_node_full(content, EL_STR("InternalStateEvent"), EL_STR("state-event"), el_from_float(0.3), el_from_float(0.3), el_from_float(0.8), EL_STR("Episodic"), EL_STR("[\"internal-state\",\"InternalStateEvent\",\"ise-fallback-local\"]"));
return EL_STR("");
}
return EL_STR("");
return 0;
}
el_val_t elapsed_ms(void) {
el_val_t s = state_get(EL_STR("soul.boot_ts"));
if (str_eq(s, EL_STR(""))) {
return 0;
}
el_val_t boot = str_to_int(s);
return (time_now() - boot);
return 0;
}
el_val_t elapsed_human(void) {
el_val_t ms = elapsed_ms();
el_val_t total_secs = (ms / 1000);
el_val_t total_minutes = (total_secs / 60);
el_val_t h = (total_minutes / 60);
if (h > 0) {
el_val_t h4 = (((h + h) + h) + h);
el_val_t h8 = (h4 + h4);
el_val_t h16 = (h8 + h8);
el_val_t h32 = (h16 + h16);
el_val_t h64 = (h32 + h32);
el_val_t h60 = (h64 - h4);
el_val_t m = (total_minutes - h60);
return el_str_concat(el_str_concat(el_str_concat(int_to_str(h), EL_STR("h ")), int_to_str(m)), EL_STR("m"));
}
if (total_minutes > 0) {
return el_str_concat(int_to_str(total_minutes), EL_STR("m"));
}
return el_str_concat(int_to_str(total_secs), EL_STR("s"));
return 0;
}
el_val_t embed_ok(void) {
el_val_t resp = http_get(EL_STR("http://localhost:11434"));
if (str_eq(resp, EL_STR(""))) {
return 0;
}
return 1;
return 0;
}
el_val_t emit_heartbeat(void) {
el_val_t pulse = int_to_str(pulse_count());
el_val_t boot_raw = state_get(EL_STR("soul_boot_count"));
el_val_t boot = ({ el_val_t _if_result_8 = 0; if (str_eq(boot_raw, EL_STR(""))) { _if_result_8 = (EL_STR("0")); } else { _if_result_8 = (boot_raw); } _if_result_8; });
el_val_t idle = int_to_str(idle_count());
el_val_t ts = time_now();
el_val_t last_act_raw = state_get(EL_STR("soul.last_activity_ts"));
el_val_t idle_ms = ({ el_val_t _if_result_9 = 0; if (str_eq(last_act_raw, EL_STR(""))) { _if_result_9 = ((0 - 1)); } else { _if_result_9 = ((ts - str_to_int(last_act_raw))); } _if_result_9; });
el_val_t nc = engram_node_count();
el_val_t ec = engram_edge_count();
el_val_t wmc = engram_wm_count();
el_val_t wm_avg_bits = engram_wm_avg_weight();
el_val_t wm_avg_str = float_to_str(wm_avg_bits);
el_val_t wm_top = engram_wm_top_json(5);
el_val_t up_ms = elapsed_ms();
el_val_t up_human = elapsed_human();
el_val_t emb_ok = embed_ok();
el_val_t fail_raw = state_get(EL_STR("soul.ise_fail_count"));
el_val_t fail_str = ({ el_val_t _if_result_10 = 0; if (str_eq(fail_raw, EL_STR(""))) { _if_result_10 = (EL_STR("0")); } else { _if_result_10 = (fail_raw); } _if_result_10; });
el_val_t sat_raw = state_get(EL_STR("soul.sync_added_total"));
el_val_t sat_str = ({ el_val_t _if_result_11 = 0; if (str_eq(sat_raw, EL_STR(""))) { _if_result_11 = (EL_STR("0")); } else { _if_result_11 = (sat_raw); } _if_result_11; });
el_val_t prev_wm_raw = state_get(EL_STR("soul.prev_wm_active"));
el_val_t prev_wm = ({ el_val_t _if_result_12 = 0; if (str_eq(prev_wm_raw, EL_STR(""))) { _if_result_12 = (0); } else { _if_result_12 = (str_to_int(prev_wm_raw)); } _if_result_12; });
el_val_t wm_delta = (wmc - prev_wm);
state_set(EL_STR("soul.prev_wm_active"), int_to_str(wmc));
el_val_t prev_nc_raw = state_get(EL_STR("soul.prev_node_count"));
el_val_t prev_nc = ({ el_val_t _if_result_13 = 0; if (str_eq(prev_nc_raw, EL_STR(""))) { _if_result_13 = (nc); } else { _if_result_13 = (str_to_int(prev_nc_raw)); } _if_result_13; });
el_val_t node_delta = (nc - prev_nc);
state_set(EL_STR("soul.prev_node_count"), int_to_str(nc));
el_val_t prev_ec_raw = state_get(EL_STR("soul.prev_edge_count"));
el_val_t prev_ec = ({ el_val_t _if_result_14 = 0; if (str_eq(prev_ec_raw, EL_STR(""))) { _if_result_14 = (ec); } else { _if_result_14 = (str_to_int(prev_ec_raw)); } _if_result_14; });
el_val_t edge_delta = (ec - prev_ec);
state_set(EL_STR("soul.prev_edge_count"), int_to_str(ec));
el_val_t sync_ok_raw = state_get(EL_STR("soul.last_sync_ok_ts"));
el_val_t sync_age = ({ el_val_t _if_result_15 = 0; if (str_eq(sync_ok_raw, EL_STR(""))) { _if_result_15 = ((0 - 1)); } else { _if_result_15 = ((ts - str_to_int(sync_ok_raw))); } _if_result_15; });
el_val_t hb_env_url = env(EL_STR("SOUL_ISE_URL"));
el_val_t hb_state_url = ({ el_val_t _if_result_16 = 0; if (str_eq(hb_env_url, EL_STR(""))) { _if_result_16 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_16 = (hb_env_url); } _if_result_16; });
el_val_t hb_engram_url = ({ el_val_t _if_result_17 = 0; if (str_eq(hb_state_url, EL_STR(""))) { _if_result_17 = (EL_STR("http://localhost:8742")); } else { _if_result_17 = (hb_state_url); } _if_result_17; });
el_val_t bf_resp = http_get(el_str_concat(hb_engram_url, EL_STR("/api/embed-backfill?n=32")));
el_val_t bf_done_raw = json_get(bf_resp, EL_STR("embedded"));
el_val_t bf_done = ({ el_val_t _if_result_18 = 0; if (str_eq(bf_done_raw, EL_STR(""))) { _if_result_18 = (EL_STR("-1")); } else { _if_result_18 = (bf_done_raw); } _if_result_18; });
el_val_t bf_total_raw = json_get(bf_resp, EL_STR("embedded_count"));
el_val_t bf_total = ({ el_val_t _if_result_19 = 0; if (str_eq(bf_total_raw, EL_STR(""))) { _if_result_19 = (EL_STR("-1")); } else { _if_result_19 = (bf_total_raw); } _if_result_19; });
el_val_t wm_sat = ({ el_val_t _if_result_20 = 0; if ((wmc >= 24)) { _if_result_20 = (1); } else { _if_result_20 = (0); } _if_result_20; });
el_val_t prev_sat_raw = state_get(EL_STR("soul.prev_wm_saturated"));
el_val_t prev_sat = ({ el_val_t _if_result_21 = 0; if (str_eq(prev_sat_raw, EL_STR(""))) { _if_result_21 = (wm_sat); } else { _if_result_21 = (str_to_int(prev_sat_raw)); } _if_result_21; });
if (wm_sat != prev_sat) {
el_val_t sat_dir = ({ el_val_t _if_result_22 = 0; if ((wm_sat == 1)) { _if_result_22 = (EL_STR("onset")); } else { _if_result_22 = (EL_STR("release")); } _if_result_22; });
ise_post(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"event\":\"wm_saturation_transition\",\"direction\":\""), sat_dir), EL_STR("\",\"wm_active\":")), int_to_str(wmc)), EL_STR(",\"wm_top\":")), wm_top), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR("}")));
}
state_set(EL_STR("soul.prev_wm_saturated"), int_to_str(wm_sat));
el_val_t wm_top0 = json_array_get(wm_top, 0);
el_val_t wm_top0_id = json_get(wm_top0, EL_STR("id"));
el_val_t prev_top0 = state_get(EL_STR("soul.prev_wm_top0"));
el_val_t t0streak_raw = state_get(EL_STR("soul.wm_top0_streak"));
el_val_t t0streak_prev = ({ el_val_t _if_result_23 = 0; if (str_eq(t0streak_raw, EL_STR(""))) { _if_result_23 = (0); } else { _if_result_23 = (str_to_int(t0streak_raw)); } _if_result_23; });
el_val_t t0streak = ({ el_val_t _if_result_24 = 0; if (str_eq(wm_top0_id, EL_STR(""))) { _if_result_24 = (0); } else { _if_result_24 = (({ el_val_t _if_result_25 = 0; if (str_eq(wm_top0_id, prev_top0)) { _if_result_25 = ((t0streak_prev + 1)); } else { _if_result_25 = (1); } _if_result_25; })); } _if_result_24; });
state_set(EL_STR("soul.prev_wm_top0"), wm_top0_id);
state_set(EL_STR("soul.wm_top0_streak"), int_to_str(t0streak));
el_val_t ch_id1 = json_get(json_array_get(wm_top, 1), EL_STR("id"));
el_val_t ch_id2 = json_get(json_array_get(wm_top, 2), EL_STR("id"));
el_val_t ch_id3 = json_get(json_array_get(wm_top, 3), EL_STR("id"));
el_val_t ch_id4 = json_get(json_array_get(wm_top, 4), EL_STR("id"));
el_val_t prev_top5 = state_get(EL_STR("soul.prev_wm_top5"));
el_val_t ch0 = ({ el_val_t _if_result_26 = 0; if (str_eq(wm_top0_id, EL_STR(""))) { _if_result_26 = (0); } else { _if_result_26 = (({ el_val_t _if_result_27 = 0; if (str_contains(prev_top5, wm_top0_id)) { _if_result_27 = (0); } else { _if_result_27 = (1); } _if_result_27; })); } _if_result_26; });
el_val_t ch1 = ({ el_val_t _if_result_28 = 0; if (str_eq(ch_id1, EL_STR(""))) { _if_result_28 = (0); } else { _if_result_28 = (({ el_val_t _if_result_29 = 0; if (str_contains(prev_top5, ch_id1)) { _if_result_29 = (0); } else { _if_result_29 = (1); } _if_result_29; })); } _if_result_28; });
el_val_t ch2 = ({ el_val_t _if_result_30 = 0; if (str_eq(ch_id2, EL_STR(""))) { _if_result_30 = (0); } else { _if_result_30 = (({ el_val_t _if_result_31 = 0; if (str_contains(prev_top5, ch_id2)) { _if_result_31 = (0); } else { _if_result_31 = (1); } _if_result_31; })); } _if_result_30; });
el_val_t ch3 = ({ el_val_t _if_result_32 = 0; if (str_eq(ch_id3, EL_STR(""))) { _if_result_32 = (0); } else { _if_result_32 = (({ el_val_t _if_result_33 = 0; if (str_contains(prev_top5, ch_id3)) { _if_result_33 = (0); } else { _if_result_33 = (1); } _if_result_33; })); } _if_result_32; });
el_val_t ch4 = ({ el_val_t _if_result_34 = 0; if (str_eq(ch_id4, EL_STR(""))) { _if_result_34 = (0); } else { _if_result_34 = (({ el_val_t _if_result_35 = 0; if (str_contains(prev_top5, ch_id4)) { _if_result_35 = (0); } else { _if_result_35 = (1); } _if_result_35; })); } _if_result_34; });
el_val_t wm_churn = ((((ch0 + ch1) + ch2) + ch3) + ch4);
state_set(EL_STR("soul.prev_wm_top5"), el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(wm_top0_id, EL_STR("|")), ch_id1), EL_STR("|")), ch_id2), EL_STR("|")), ch_id3), EL_STR("|")), ch_id4));
el_val_t wm_top0_wm_raw = json_get(wm_top0, EL_STR("wm"));
el_val_t wm_top0_wm = ({ el_val_t _if_result_36 = 0; if (str_eq(wm_top0_wm_raw, EL_STR(""))) { _if_result_36 = (EL_STR("0")); } else { _if_result_36 = (wm_top0_wm_raw); } _if_result_36; });
el_val_t act_stats = engram_act_stats_json();
el_val_t act_evict_raw = json_get(act_stats, EL_STR("wm_evicted"));
el_val_t act_evict = ({ el_val_t _if_result_37 = 0; if (str_eq(act_evict_raw, EL_STR(""))) { _if_result_37 = (EL_STR("-1")); } else { _if_result_37 = (act_evict_raw); } _if_result_37; });
el_val_t act_bt_raw = json_get(act_stats, EL_STR("breakthroughs"));
el_val_t act_bt = ({ el_val_t _if_result_38 = 0; if (str_eq(act_bt_raw, EL_STR(""))) { _if_result_38 = (EL_STR("-1")); } else { _if_result_38 = (act_bt_raw); } _if_result_38; });
el_val_t evict_now = ({ el_val_t _if_result_39 = 0; if (str_eq(act_evict_raw, EL_STR(""))) { _if_result_39 = ((0 - 1)); } else { _if_result_39 = (str_to_int(act_evict_raw)); } _if_result_39; });
el_val_t bt_now = ({ el_val_t _if_result_40 = 0; if (str_eq(act_bt_raw, EL_STR(""))) { _if_result_40 = ((0 - 1)); } else { _if_result_40 = (str_to_int(act_bt_raw)); } _if_result_40; });
el_val_t prev_evict_raw = state_get(EL_STR("soul.prev_wm_evicted"));
el_val_t prev_evict = ({ el_val_t _if_result_41 = 0; if (str_eq(prev_evict_raw, EL_STR(""))) { _if_result_41 = (0); } else { _if_result_41 = (str_to_int(prev_evict_raw)); } _if_result_41; });
el_val_t prev_bt_raw = state_get(EL_STR("soul.prev_breakthroughs"));
el_val_t prev_bt = ({ el_val_t _if_result_42 = 0; if (str_eq(prev_bt_raw, EL_STR(""))) { _if_result_42 = (0); } else { _if_result_42 = (str_to_int(prev_bt_raw)); } _if_result_42; });
el_val_t evict_delta = ({ el_val_t _if_result_43 = 0; if ((evict_now < 0)) { _if_result_43 = (0); } else { _if_result_43 = (({ el_val_t _if_result_44 = 0; if ((evict_now < prev_evict)) { _if_result_44 = (evict_now); } else { _if_result_44 = ((evict_now - prev_evict)); } _if_result_44; })); } _if_result_43; });
el_val_t bt_delta = ({ el_val_t _if_result_45 = 0; if ((bt_now < 0)) { _if_result_45 = (0); } else { _if_result_45 = (({ el_val_t _if_result_46 = 0; if ((bt_now < prev_bt)) { _if_result_46 = (bt_now); } else { _if_result_46 = ((bt_now - prev_bt)); } _if_result_46; })); } _if_result_45; });
if (evict_now >= 0) {
state_set(EL_STR("soul.prev_wm_evicted"), int_to_str(evict_now));
}
if (bt_now >= 0) {
state_set(EL_STR("soul.prev_breakthroughs"), int_to_str(bt_now));
}
el_val_t hb_stats = http_get(el_str_concat(hb_engram_url, EL_STR("/api/stats")));
el_val_t embed_elig_raw = json_get(hb_stats, EL_STR("embed_eligible_count"));
el_val_t embed_elig = ({ el_val_t _if_result_47 = 0; if (str_eq(embed_elig_raw, EL_STR(""))) { _if_result_47 = (EL_STR("-1")); } else { _if_result_47 = (embed_elig_raw); } _if_result_47; });
el_val_t hb_ats_raw = state_get(EL_STR("soul.auto_term_streak"));
el_val_t hb_ats = ({ el_val_t _if_result_48 = 0; if (str_eq(hb_ats_raw, EL_STR(""))) { _if_result_48 = (0); } else { _if_result_48 = (str_to_int(hb_ats_raw)); } _if_result_48; });
el_val_t hb_ate_raw = state_get(EL_STR("soul.auto_term_empty_streak"));
el_val_t hb_ate = ({ el_val_t _if_result_49 = 0; if (str_eq(hb_ate_raw, EL_STR(""))) { _if_result_49 = (0); } else { _if_result_49 = (str_to_int(hb_ate_raw)); } _if_result_49; });
el_val_t hebb_warm_raw = json_get(act_stats, EL_STR("hebb_warm"));
el_val_t hebb_warm = ({ el_val_t _if_result_50 = 0; if (str_eq(hebb_warm_raw, EL_STR(""))) { _if_result_50 = (EL_STR("-1")); } else { _if_result_50 = (hebb_warm_raw); } _if_result_50; });
el_val_t hebb_max_raw = json_get(act_stats, EL_STR("hebb_max"));
el_val_t hebb_max = ({ el_val_t _if_result_51 = 0; if (str_eq(hebb_max_raw, EL_STR(""))) { _if_result_51 = (EL_STR("-1")); } else { _if_result_51 = (hebb_max_raw); } _if_result_51; });
el_val_t hebb_links_raw = json_get(act_stats, EL_STR("hebb_links"));
el_val_t hebb_links = ({ el_val_t _if_result_52 = 0; if (str_eq(hebb_links_raw, EL_STR(""))) { _if_result_52 = (EL_STR("-1")); } else { _if_result_52 = (hebb_links_raw); } _if_result_52; });
el_val_t hebb_cands_raw = json_get(act_stats, EL_STR("hebb_cands"));
el_val_t hebb_cands = ({ el_val_t _if_result_53 = 0; if (str_eq(hebb_cands_raw, EL_STR(""))) { _if_result_53 = (EL_STR("-1")); } else { _if_result_53 = (hebb_cands_raw); } _if_result_53; });
el_val_t hebb_cmax_raw = json_get(act_stats, EL_STR("hebb_cand_max"));
el_val_t hebb_cmax = ({ el_val_t _if_result_54 = 0; if (str_eq(hebb_cmax_raw, EL_STR(""))) { _if_result_54 = (EL_STR("-1")); } else { _if_result_54 = (hebb_cmax_raw); } _if_result_54; });
el_val_t hebb_mass_raw = json_get(act_stats, EL_STR("hebb_mass"));
el_val_t hebb_mass = ({ el_val_t _if_result_55 = 0; if (str_eq(hebb_mass_raw, EL_STR(""))) { _if_result_55 = (EL_STR("-1")); } else { _if_result_55 = (hebb_mass_raw); } _if_result_55; });
el_val_t hebb_edges_raw = json_get(act_stats, EL_STR("hebb_edges"));
el_val_t hebb_edges = ({ el_val_t _if_result_56 = 0; if (str_eq(hebb_edges_raw, EL_STR(""))) { _if_result_56 = (EL_STR("-1")); } else { _if_result_56 = (hebb_edges_raw); } _if_result_56; });
el_val_t wb_pend_raw = json_get(act_stats, EL_STR("hebb_wb_pending"));
el_val_t wb_pend = ({ el_val_t _if_result_57 = 0; if (str_eq(wb_pend_raw, EL_STR(""))) { _if_result_57 = (EL_STR("-1")); } else { _if_result_57 = (wb_pend_raw); } _if_result_57; });
el_val_t wb_drain_raw = json_get(act_stats, EL_STR("hebb_wb_drained"));
el_val_t wb_drain = ({ el_val_t _if_result_58 = 0; if (str_eq(wb_drain_raw, EL_STR(""))) { _if_result_58 = (EL_STR("-1")); } else { _if_result_58 = (wb_drain_raw); } _if_result_58; });
el_val_t wb_drop_raw = json_get(act_stats, EL_STR("hebb_wb_dropped"));
el_val_t wb_drop = ({ el_val_t _if_result_59 = 0; if (str_eq(wb_drop_raw, EL_STR(""))) { _if_result_59 = (EL_STR("-1")); } else { _if_result_59 = (wb_drop_raw); } _if_result_59; });
el_val_t wb_sent_raw = state_get(EL_STR("soul.hebb_wb_sent"));
el_val_t wb_sent = ({ el_val_t _if_result_60 = 0; if (str_eq(wb_sent_raw, EL_STR(""))) { _if_result_60 = (EL_STR("0")); } else { _if_result_60 = (wb_sent_raw); } _if_result_60; });
el_val_t dup_wm_g_raw = json_get(act_stats, EL_STR("dup_wm_global"));
el_val_t dup_wm_g = ({ el_val_t _if_result_61 = 0; if (str_eq(dup_wm_g_raw, EL_STR(""))) { _if_result_61 = (EL_STR("-1")); } else { _if_result_61 = (dup_wm_g_raw); } _if_result_61; });
el_val_t act_brk_raw = json_get(act_stats, EL_STR("embed_breaker_open"));
el_val_t act_brk = ({ el_val_t _if_result_62 = 0; if (str_eq(act_brk_raw, EL_STR(""))) { _if_result_62 = (EL_STR("-1")); } else { _if_result_62 = (act_brk_raw); } _if_result_62; });
el_val_t emb_cf_raw = json_get(act_stats, EL_STR("embed_consec_fail"));
el_val_t emb_cf = ({ el_val_t _if_result_63 = 0; if (str_eq(emb_cf_raw, EL_STR(""))) { _if_result_63 = (EL_STR("-1")); } else { _if_result_63 = (emb_cf_raw); } _if_result_63; });
el_val_t ctx_cos_raw = json_get(act_stats, EL_STR("ctx_cos"));
el_val_t ctx_cos = ({ el_val_t _if_result_64 = 0; if (str_eq(ctx_cos_raw, EL_STR(""))) { _if_result_64 = (EL_STR("-2")); } else { _if_result_64 = (ctx_cos_raw); } _if_result_64; });
el_val_t dup_seeds_raw = json_get(act_stats, EL_STR("dup_seeds"));
el_val_t dup_seeds = ({ el_val_t _if_result_65 = 0; if (str_eq(dup_seeds_raw, EL_STR(""))) { _if_result_65 = (EL_STR("-1")); } else { _if_result_65 = (dup_seeds_raw); } _if_result_65; });
el_val_t dup_wm_raw = json_get(act_stats, EL_STR("dup_wm"));
el_val_t dup_wm = ({ el_val_t _if_result_66 = 0; if (str_eq(dup_wm_raw, EL_STR(""))) { _if_result_66 = (EL_STR("-1")); } else { _if_result_66 = (dup_wm_raw); } _if_result_66; });
el_val_t txt_dmg_raw = json_get(act_stats, EL_STR("txt_damaged"));
el_val_t txt_dmg = ({ el_val_t _if_result_67 = 0; if (str_eq(txt_dmg_raw, EL_STR(""))) { _if_result_67 = (EL_STR("-1")); } else { _if_result_67 = (txt_dmg_raw); } _if_result_67; });
el_val_t tc_raw = state_get(EL_STR("soul.txt_census_countdown"));
el_val_t tc_n = ({ el_val_t _if_result_68 = 0; if (str_eq(tc_raw, EL_STR(""))) { _if_result_68 = (0); } else { _if_result_68 = (str_to_int(tc_raw)); } _if_result_68; });
if (tc_n <= 0) {
el_val_t th_resp = http_get(el_str_concat(hb_engram_url, EL_STR("/api/text-health")));
el_val_t th_pct = json_get(th_resp, EL_STR("damaged_pct"));
if (!str_eq(th_pct, EL_STR(""))) {
state_set(EL_STR("soul.txt_damaged_pct"), th_pct);
state_set(EL_STR("soul.txt_damaged_n"), json_get(th_resp, EL_STR("damaged")));
state_set(EL_STR("soul.txt_scanned_n"), json_get(th_resp, EL_STR("scanned")));
state_set(EL_STR("soul.txt_census_ts"), int_to_str(ts));
}
state_set(EL_STR("soul.txt_census_countdown"), EL_STR("30"));
}
if (tc_n > 0) {
state_set(EL_STR("soul.txt_census_countdown"), int_to_str((tc_n - 1)));
}
el_val_t dmg_pct_raw = state_get(EL_STR("soul.txt_damaged_pct"));
el_val_t dmg_pct = ({ el_val_t _if_result_69 = 0; if (str_eq(dmg_pct_raw, EL_STR(""))) { _if_result_69 = (EL_STR("-1")); } else { _if_result_69 = (dmg_pct_raw); } _if_result_69; });
el_val_t dmg_n_raw = state_get(EL_STR("soul.txt_damaged_n"));
el_val_t dmg_n = ({ el_val_t _if_result_70 = 0; if (str_eq(dmg_n_raw, EL_STR(""))) { _if_result_70 = (EL_STR("-1")); } else { _if_result_70 = (dmg_n_raw); } _if_result_70; });
el_val_t dmg_scan_raw = state_get(EL_STR("soul.txt_scanned_n"));
el_val_t dmg_scan = ({ el_val_t _if_result_71 = 0; if (str_eq(dmg_scan_raw, EL_STR(""))) { _if_result_71 = (EL_STR("-1")); } else { _if_result_71 = (dmg_scan_raw); } _if_result_71; });
el_val_t dmg_ts_raw = state_get(EL_STR("soul.txt_census_ts"));
el_val_t dmg_age = ({ el_val_t _if_result_72 = 0; if (str_eq(dmg_ts_raw, EL_STR(""))) { _if_result_72 = ((0 - 1)); } else { _if_result_72 = ((ts - str_to_int(dmg_ts_raw))); } _if_result_72; });
el_val_t payload = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"event\":\"heartbeat\",\"pulse\":"), pulse), EL_STR(",\"tick\":")), pulse), EL_STR(",\"boot\":")), boot), EL_STR(",\"idle\":")), idle), EL_STR(",\"idle_ms\":")), int_to_str(idle_ms)), EL_STR(",\"node_count\":")), int_to_str(nc)), EL_STR(",\"edge_count\":")), int_to_str(ec)), EL_STR(",\"node_delta\":")), int_to_str(node_delta)), EL_STR(",\"edge_delta\":")), int_to_str(edge_delta)), EL_STR(",\"wm_active\":")), int_to_str(wmc)), EL_STR(",\"wm_delta\":")), int_to_str(wm_delta)), EL_STR(",\"wm_saturated\":")), int_to_str(wm_sat)), EL_STR(",\"wm_top0_streak\":")), int_to_str(t0streak)), EL_STR(",\"wm_churn\":")), int_to_str(wm_churn)), EL_STR(",\"wm_top0_wm\":")), wm_top0_wm), EL_STR(",\"sync_added_total\":")), sat_str), EL_STR(",\"sync_age_ms\":")), int_to_str(sync_age)), EL_STR(",\"wm_avg_weight\":")), wm_avg_str), EL_STR(",\"wm_top\":")), wm_top), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR(",\"uptime_ms\":")), int_to_str(up_ms)), EL_STR(",\"uptime\":\"")), up_human), EL_STR("\",\"embed_ok\":")), int_to_str(emb_ok)), EL_STR(",\"embed_backfilled\":")), bf_done), EL_STR(",\"embed_count\":")), bf_total), EL_STR(",\"embed_eligible\":")), embed_elig), EL_STR(",\"wm_evicted\":")), act_evict), EL_STR(",\"wm_evicted_delta\":")), int_to_str(evict_delta)), EL_STR(",\"breakthroughs\":")), act_bt), EL_STR(",\"breakthroughs_delta\":")), int_to_str(bt_delta)), EL_STR(",\"auto_term_streak\":")), int_to_str(hb_ats)), EL_STR(",\"auto_term_empty_streak\":")), int_to_str(hb_ate)), EL_STR(",\"embed_breaker_open\":")), act_brk), EL_STR(",\"ctx_cos\":")), ctx_cos), EL_STR(",\"dup_seeds\":")), dup_seeds), EL_STR(",\"dup_wm\":")), dup_wm), EL_STR(",\"dup_wm_global\":")), dup_wm_g), EL_STR(",\"hebb_warm\":")), hebb_warm), EL_STR(",\"hebb_max\":")), hebb_max), EL_STR(",\"hebb_links\":")), hebb_links), EL_STR(",\"hebb_cands\":")), hebb_cands), EL_STR(",\"hebb_cand_max\":")), hebb_cmax), EL_STR(",\"hebb_mass\":")), hebb_mass), EL_STR(",\"hebb_edges\":")), hebb_edges), EL_STR(",\"embed_consec_fail\":")), emb_cf), EL_STR(",\"txt_damaged_pct\":")), dmg_pct), EL_STR(",\"txt_damaged_n\":")), dmg_n), EL_STR(",\"txt_scanned_n\":")), dmg_scan), EL_STR(",\"txt_census_age_ms\":")), int_to_str(dmg_age)), EL_STR(",\"hebb_wb_pending\":")), wb_pend), EL_STR(",\"hebb_wb_drained\":")), wb_drain), EL_STR(",\"hebb_wb_dropped\":")), wb_drop), EL_STR(",\"hebb_wb_sent\":")), wb_sent), EL_STR(",\"ise_fail\":")), fail_str), EL_STR(",\"txt_damaged\":")), txt_dmg), EL_STR("}"));
ise_post(payload);
return 0;
}
el_val_t auto_term_try_slot(el_val_t slot_type, el_val_t slot_lbl) {
state_set(EL_STR("_ats_ok"), EL_STR("0"));
if (str_eq(slot_type, EL_STR("Memory"))) {
state_set(EL_STR("_ats_ok"), EL_STR("1"));
}
if (str_eq(slot_type, EL_STR("BacklogItem"))) {
state_set(EL_STR("_ats_ok"), EL_STR("1"));
}
if (str_eq(slot_type, EL_STR("Entity"))) {
state_set(EL_STR("_ats_ok"), EL_STR("1"));
}
if (str_eq(slot_type, EL_STR("Knowledge"))) {
state_set(EL_STR("_ats_ok"), EL_STR("1"));
}
if (str_contains(slot_lbl, EL_STR(":"))) {
if (!str_contains(slot_lbl, EL_STR(" "))) {
state_set(EL_STR("_ats_ok"), EL_STR("0"));
}
}
if (str_eq(state_get(EL_STR("_ats_ok")), EL_STR("1"))) {
if (!str_eq(slot_lbl, EL_STR(""))) {
el_val_t sp = str_find_chars(slot_lbl, EL_STR(" :(["));
if (sp > 3) {
el_val_t term = str_slice(slot_lbl, 0, sp);
state_set(EL_STR("_ats_gw"), EL_STR("0"));
if (str_eq(term, EL_STR("Method"))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_eq(term, EL_STR("Theory"))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_eq(term, EL_STR("Finding"))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_eq(term, EL_STR("Survey"))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_eq(term, EL_STR("Paper"))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_eq(term, EL_STR("Knowledge"))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_eq(term, EL_STR("Value"))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
el_val_t stopw = EL_STR("|What|When|Where|Which|Whose|While|This|That|These|Those|There|Their|Then|Than|With|Without|From|Into|Onto|Over|Under|About|Between|Among|Across|Some|Most|More|Less|Very|Each|Every|Both|Also|Only|Just|Does|Will|Would|Could|Should|Might|Must|Have|Been|Being|Toward|Towards|Using|Based|Upon|Here|Your|Ours|They|Them|what|this|that|with|from|context|Context|Prose|Colon|Self|Test|Testing|Closing|Global|Universal|Persona|Semantic|Spreading|Temporal|Numeric|Register|Identifying|Introduction|Overview|Summary|Section|General|Notes|Note|");
if (str_contains(stopw, el_str_concat(el_str_concat(EL_STR("|"), term), EL_STR("|")))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_contains(term, EL_STR("\""))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_contains(term, EL_STR("'"))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
el_val_t df_max = (engram_node_count() / 400);
el_val_t df_term = engram_label_df(term);
if (df_term > df_max) {
if (df_term > 8) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
}
if (str_eq(term, state_get(EL_STR("soul.tabu_t0")))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_eq(term, state_get(EL_STR("soul.tabu_t1")))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_eq(term, state_get(EL_STR("soul.tabu_t2")))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_eq(term, state_get(EL_STR("soul.tabu_t3")))) {
state_set(EL_STR("_ats_gw"), EL_STR("1"));
}
if (str_eq(state_get(EL_STR("_ats_gw")), EL_STR("0"))) {
state_set(EL_STR("cseed_auto"), term);
}
}
}
}
return EL_STR("");
return 0;
}
el_val_t proactive_curiosity(void) {
el_val_t ts = time_now();
el_val_t ts_minutes = (ts / 60000);
el_val_t minute_q = (ts_minutes / 4);
el_val_t minute_q2 = (minute_q + minute_q);
el_val_t minute_q4 = (minute_q2 + minute_q2);
el_val_t minute_block = (ts_minutes - minute_q4);
state_set(EL_STR("cseed_a"), EL_STR("memory"));
state_set(EL_STR("cseed_b"), EL_STR("knowledge"));
state_set(EL_STR("cseed_c"), EL_STR("context"));
if (minute_block == 1) {
state_set(EL_STR("cseed_a"), EL_STR("self"));
state_set(EL_STR("cseed_b"), EL_STR("identity"));
state_set(EL_STR("cseed_c"), EL_STR("values"));
}
if (minute_block == 2) {
state_set(EL_STR("cseed_a"), EL_STR("decision"));
state_set(EL_STR("cseed_b"), EL_STR("pattern"));
state_set(EL_STR("cseed_c"), EL_STR("lesson"));
}
if (minute_block == 3) {
state_set(EL_STR("cseed_a"), EL_STR("working"));
state_set(EL_STR("cseed_b"), EL_STR("project"));
state_set(EL_STR("cseed_c"), EL_STR("active"));
}
el_val_t curiosity_term_a = state_get(EL_STR("cseed_a"));
el_val_t curiosity_term_b = state_get(EL_STR("cseed_b"));
el_val_t curiosity_term_c = state_get(EL_STR("cseed_c"));
el_val_t curiosity_seed = el_str_concat(el_str_concat(el_str_concat(el_str_concat(curiosity_term_a, EL_STR(" ")), curiosity_term_b), EL_STR(" ")), curiosity_term_c);
el_val_t results_all = engram_activate_json(curiosity_seed, 1);
el_val_t found = json_array_len(results_all);
el_val_t top_entry = json_array_get(results_all, 0);
el_val_t top_id = json_get(top_entry, EL_STR("id"));
el_val_t prev_str_id = state_get(EL_STR("soul.last_strengthen_id"));
if (!str_eq(top_id, EL_STR(""))) {
if (!str_eq(top_id, prev_str_id)) {
engram_strengthen(top_id);
}
state_set(EL_STR("soul.last_strengthen_id"), top_id);
}
state_set(EL_STR("cseed_auto"), EL_STR(""));
el_val_t wm10 = engram_wm_top_json(10);
el_val_t wm10_n9 = json_array_get(wm10, 9);
el_val_t wm10_n8 = json_array_get(wm10, 8);
el_val_t wm10_n7 = json_array_get(wm10, 7);
el_val_t wm10_n6 = json_array_get(wm10, 6);
el_val_t wm10_n5 = json_array_get(wm10, 5);
el_val_t wm10_n4 = json_array_get(wm10, 4);
el_val_t wm10_n3 = json_array_get(wm10, 3);
el_val_t wm10_n2 = json_array_get(wm10, 2);
el_val_t wm10_n1 = json_array_get(wm10, 1);
el_val_t wm10_n0 = json_array_get(wm10, 0);
auto_term_try_slot(json_get(wm10_n9, EL_STR("node_type")), json_get(wm10_n9, EL_STR("label")));
auto_term_try_slot(json_get(wm10_n8, EL_STR("node_type")), json_get(wm10_n8, EL_STR("label")));
auto_term_try_slot(json_get(wm10_n7, EL_STR("node_type")), json_get(wm10_n7, EL_STR("label")));
auto_term_try_slot(json_get(wm10_n6, EL_STR("node_type")), json_get(wm10_n6, EL_STR("label")));
auto_term_try_slot(json_get(wm10_n5, EL_STR("node_type")), json_get(wm10_n5, EL_STR("label")));
auto_term_try_slot(json_get(wm10_n4, EL_STR("node_type")), json_get(wm10_n4, EL_STR("label")));
auto_term_try_slot(json_get(wm10_n3, EL_STR("node_type")), json_get(wm10_n3, EL_STR("label")));
auto_term_try_slot(json_get(wm10_n2, EL_STR("node_type")), json_get(wm10_n2, EL_STR("label")));
auto_term_try_slot(json_get(wm10_n1, EL_STR("node_type")), json_get(wm10_n1, EL_STR("label")));
auto_term_try_slot(json_get(wm10_n0, EL_STR("node_type")), json_get(wm10_n0, EL_STR("label")));
el_val_t auto_term = state_get(EL_STR("cseed_auto"));
el_val_t results_auto = ({ el_val_t _if_result_73 = 0; if (str_eq(auto_term, EL_STR(""))) { _if_result_73 = (EL_STR("[]")); } else { _if_result_73 = (engram_activate_json(auto_term, 1)); } _if_result_73; });
el_val_t found_auto = json_array_len(results_auto);
el_val_t total_found = (found + found_auto);
el_val_t safe_auto = str_replace(auto_term, EL_STR("\""), EL_STR("'"));
el_val_t prev_auto = state_get(EL_STR("soul.prev_auto_term"));
el_val_t atstreak_raw = state_get(EL_STR("soul.auto_term_streak"));
el_val_t atstreak_prev = ({ el_val_t _if_result_74 = 0; if (str_eq(atstreak_raw, EL_STR(""))) { _if_result_74 = (0); } else { _if_result_74 = (str_to_int(atstreak_raw)); } _if_result_74; });
el_val_t is_empty = str_eq(auto_term, EL_STR(""));
el_val_t atstreak = ({ el_val_t _if_result_75 = 0; if (is_empty) { _if_result_75 = (0); } else { _if_result_75 = (({ el_val_t _if_result_76 = 0; if (str_eq(auto_term, prev_auto)) { _if_result_76 = ((atstreak_prev + 1)); } else { _if_result_76 = (1); } _if_result_76; })); } _if_result_75; });
el_val_t atempty_raw = state_get(EL_STR("soul.auto_term_empty_streak"));
el_val_t atempty_prev = ({ el_val_t _if_result_77 = 0; if (str_eq(atempty_raw, EL_STR(""))) { _if_result_77 = (0); } else { _if_result_77 = (str_to_int(atempty_raw)); } _if_result_77; });
el_val_t atempty = ({ el_val_t _if_result_78 = 0; if (is_empty) { _if_result_78 = ((atempty_prev + 1)); } else { _if_result_78 = (0); } _if_result_78; });
state_set(EL_STR("soul.prev_auto_term"), auto_term);
state_set(EL_STR("soul.auto_term_streak"), int_to_str(atstreak));
state_set(EL_STR("soul.auto_term_empty_streak"), int_to_str(atempty));
if (!str_eq(auto_term, EL_STR(""))) {
state_set(EL_STR("soul.tabu_t3"), state_get(EL_STR("soul.tabu_t2")));
state_set(EL_STR("soul.tabu_t2"), state_get(EL_STR("soul.tabu_t1")));
state_set(EL_STR("soul.tabu_t1"), state_get(EL_STR("soul.tabu_t0")));
state_set(EL_STR("soul.tabu_t0"), auto_term);
}
el_val_t wmc = engram_wm_count();
el_val_t wm3 = engram_wm_top_json(3);
el_val_t ise = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"event\":\"curiosity_scan\",\"seed\":\""), curiosity_seed), EL_STR("\",\"auto_term\":\"")), safe_auto), EL_STR("\",\"auto_term_streak\":")), int_to_str(atstreak)), EL_STR(",\"auto_term_empty_streak\":")), int_to_str(atempty)), EL_STR(",\"minute_block\":")), int_to_str(minute_block)), EL_STR(",\"activated\":")), int_to_str(total_found)), EL_STR(",\"wm_active\":")), int_to_str(wmc)), EL_STR(",\"wm_top\":")), wm3), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR("}"));
ise_post(ise);
return (total_found > 0);
return 0;
}
el_val_t pulse_count(void) {
el_val_t s = state_get(EL_STR("soul.pulse"));
if (str_eq(s, EL_STR(""))) {
return 0;
}
return str_to_int(s);
return 0;
}
el_val_t pulse_inc(void) {
el_val_t n = (pulse_count() + 1);
state_set(EL_STR("soul.pulse"), int_to_str(n));
return n;
return 0;
}
el_val_t make_action(el_val_t kind, el_val_t payload) {
el_val_t safe = str_replace(payload, EL_STR("\\"), EL_STR("\\\\"));
el_val_t safe2 = str_replace(safe, EL_STR("\""), EL_STR("\\\""));
el_val_t safe3 = str_replace(safe2, EL_STR("\n"), EL_STR("\\n"));
el_val_t safe4 = str_replace(safe3, EL_STR("\r"), EL_STR("\\r"));
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"kind\":\""), kind), EL_STR("\",\"payload\":\"")), safe4), EL_STR("\"}"));
return 0;
}
el_val_t perceive(void) {
el_val_t inbox_check = engram_search_json(EL_STR("soul-inbox-pending"), 5);
el_val_t has_inbox = (!str_eq(inbox_check, EL_STR("")) && !str_eq(inbox_check, EL_STR("[]")));
if (!has_inbox) {
return EL_STR("[]");
}
el_val_t from_pending = engram_activate_json(EL_STR("soul-inbox-pending"), 2);
el_val_t pending_ok = (!str_eq(from_pending, EL_STR("")) && !str_eq(from_pending, EL_STR("[]")));
if (pending_ok) {
return from_pending;
}
return EL_STR("[]");
return 0;
}
el_val_t attend(el_val_t node_json) {
if (str_eq(node_json, EL_STR(""))) {
return make_action(EL_STR("noop"), EL_STR(""));
}
if (str_eq(node_json, EL_STR("[]"))) {
return make_action(EL_STR("noop"), EL_STR(""));
}
el_val_t content = json_get(node_json, EL_STR("content"));
if (str_eq(content, EL_STR(""))) {
return make_action(EL_STR("noop"), EL_STR(""));
}
if (str_eq(content, EL_STR("consolidate"))) {
return make_action(EL_STR("consolidate"), EL_STR(""));
}
if (str_starts_with(content, EL_STR("remember "))) {
el_val_t payload = str_slice(content, 9, str_len(content));
return make_action(EL_STR("remember"), payload);
}
if (str_starts_with(content, EL_STR("search "))) {
el_val_t payload = str_slice(content, 7, str_len(content));
return make_action(EL_STR("search"), payload);
}
if (str_starts_with(content, EL_STR("activate "))) {
el_val_t payload = str_slice(content, 9, str_len(content));
return make_action(EL_STR("activate"), payload);
}
if (str_starts_with(content, EL_STR("strengthen "))) {
el_val_t payload = str_slice(content, 11, str_len(content));
return make_action(EL_STR("strengthen"), payload);
}
if (str_starts_with(content, EL_STR("forget "))) {
el_val_t payload = str_slice(content, 7, str_len(content));
return make_action(EL_STR("forget"), payload);
}
return make_action(EL_STR("respond"), content);
return 0;
}
el_val_t respond(el_val_t action_json) {
el_val_t kind = json_get(action_json, EL_STR("kind"));
el_val_t payload = json_get(action_json, EL_STR("payload"));
if (str_eq(kind, EL_STR("noop"))) {
return EL_STR("{\"outcome\":\"noop\"}");
}
if (str_eq(kind, EL_STR("remember"))) {
el_val_t tags = EL_STR("[\"soul-memory\",\"awareness\"]");
el_val_t id = mem_remember(payload, tags);
return el_str_concat(el_str_concat(EL_STR("{\"outcome\":\"remembered\",\"id\":\""), id), EL_STR("\"}"));
}
if (str_eq(kind, EL_STR("consolidate"))) {
el_val_t stats = mem_consolidate();
return el_str_concat(el_str_concat(EL_STR("{\"outcome\":\"consolidated\",\"stats\":"), stats), EL_STR("}"));
}
if (str_eq(kind, EL_STR("respond"))) {
el_val_t tags = EL_STR("[\"soul-outbox\",\"awareness\"]");
el_val_t id = mem_store(payload, EL_STR("soul-response"), tags);
return el_str_concat(el_str_concat(EL_STR("{\"outcome\":\"response\",\"id\":\""), id), EL_STR("\"}"));
}
if (str_eq(kind, EL_STR("search"))) {
el_val_t results = mem_search(payload, 10);
el_val_t safe_results = str_replace(results, EL_STR("\""), EL_STR("'"));
el_val_t tags = EL_STR("[\"soul-outbox\",\"search-result\"]");
el_val_t id = mem_store(safe_results, EL_STR("search-result"), tags);
return el_str_concat(el_str_concat(EL_STR("{\"outcome\":\"searched\",\"id\":\""), id), EL_STR("\"}"));
}
if (str_eq(kind, EL_STR("activate"))) {
el_val_t results = mem_recall(payload, 3);
el_val_t safe_results = str_replace(results, EL_STR("\""), EL_STR("'"));
el_val_t tags = EL_STR("[\"soul-outbox\",\"activation-result\"]");
el_val_t id = mem_store(safe_results, EL_STR("activation-result"), tags);
return el_str_concat(el_str_concat(EL_STR("{\"outcome\":\"activated\",\"id\":\""), id), EL_STR("\"}"));
}
if (str_eq(kind, EL_STR("strengthen"))) {
engram_strengthen(payload);
return el_str_concat(el_str_concat(EL_STR("{\"outcome\":\"strengthened\",\"id\":\""), payload), EL_STR("\"}"));
}
if (str_eq(kind, EL_STR("forget"))) {
el_val_t _marker = mem_tombstone(payload);
return el_str_concat(el_str_concat(EL_STR("{\"outcome\":\"tombstoned\",\"id\":\""), payload), EL_STR("\"}"));
}
return EL_STR("{\"outcome\":\"noop\"}");
return 0;
}
el_val_t record(el_val_t outcome_json) {
el_val_t safe = str_replace(outcome_json, EL_STR("\""), EL_STR("'"));
el_val_t ts = time_now();
ise_post(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"event\":\"loop-outcome\",\"outcome\":\""), safe), EL_STR("\",\"ts\":")), int_to_str(ts)), EL_STR("}")));
return 0;
}
el_val_t one_cycle(void) {
el_val_t raw = perceive();
if (str_eq(raw, EL_STR(""))) {
return 0;
}
if (str_eq(raw, EL_STR("[]"))) {
return 0;
}
el_val_t node = json_array_get(raw, 0);
if (str_eq(node, EL_STR(""))) {
return 0;
}
el_val_t node_tags = json_get(node, EL_STR("tags"));
if (!str_contains(node_tags, EL_STR("soul-inbox-pending"))) {
return 0;
}
el_val_t action = attend(node);
el_val_t kind = json_get(action, EL_STR("kind"));
el_val_t is_interesting = (!str_eq(kind, EL_STR("noop")) && !str_eq(kind, EL_STR("respond")));
if (is_interesting) {
el_val_t trigger_content = json_get(node, EL_STR("content"));
el_val_t safe_trigger = str_replace(trigger_content, EL_STR("\""), EL_STR("'"));
el_val_t ts = time_now();
el_val_t event_content = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"event\":\"awareness-decision\",\"trigger\":\""), safe_trigger), EL_STR("\",\"kind\":\"")), kind), EL_STR("\",\"ts\":")), int_to_str(ts)), EL_STR("}"));
ise_post(event_content);
}
if (str_eq(kind, EL_STR("noop"))) {
return 0;
}
el_val_t outcome = respond(action);
record(outcome);
el_val_t trigger_id = json_get(node, EL_STR("id"));
if (!str_eq(trigger_id, EL_STR(""))) {
engram_forget(trigger_id);
}
return 1;
return 0;
}
el_val_t awareness_run(void) {
println(EL_STR("[awareness] entering"));
el_val_t existing_boot = state_get(EL_STR("soul.boot_ts"));
if (str_eq(existing_boot, EL_STR(""))) {
state_set(EL_STR("soul.boot_ts"), int_to_str(time_now()));
}
el_val_t tick_raw = env(EL_STR("SOUL_TICK_MS"));
el_val_t tick_ms = ({ el_val_t _if_result_79 = 0; if (str_eq(tick_raw, EL_STR(""))) { _if_result_79 = (200); } else { _if_result_79 = (str_to_int(tick_raw)); } _if_result_79; });
el_val_t beat_ms_raw = env(EL_STR("SOUL_HEARTBEAT_MS"));
el_val_t beat_ms = ({ el_val_t _if_result_80 = 0; if (str_eq(beat_ms_raw, EL_STR(""))) { _if_result_80 = (60000); } else { _if_result_80 = (str_to_int(beat_ms_raw)); } _if_result_80; });
el_val_t scan_ms = (beat_ms / 2);
while (1) {
el_val_t tick_mark = el_arena_push();
el_val_t running = state_get(EL_STR("soul.running"));
if (str_eq(running, EL_STR("false"))) {
el_val_t sd_boot_raw = state_get(EL_STR("soul_boot_count"));
el_val_t sd_boot = ({ el_val_t _if_result_81 = 0; if (str_eq(sd_boot_raw, EL_STR(""))) { _if_result_81 = (EL_STR("0")); } else { _if_result_81 = (sd_boot_raw); } _if_result_81; });
el_val_t sd_wb = hebb_consolidate();
ise_post(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"event\":\"shutdown\",\"boot\":"), sd_boot), EL_STR(",\"pulse\":")), int_to_str(pulse_count())), EL_STR(",\"hebb_wb_sent\":")), int_to_str(sd_wb)), EL_STR(",\"uptime_ms\":")), int_to_str(elapsed_ms())), EL_STR(",\"ts\":")), int_to_str(time_now())), EL_STR("}")));
println(EL_STR("[awareness] exiting"));
el_arena_pop(tick_mark);
return EL_STR("");
}
el_val_t did_work = one_cycle();
pulse_inc();
if (did_work) {
idle_reset();
}
if (!did_work) {
idle_inc();
}
el_val_t now_ts = time_now();
el_val_t last_beat_str = state_get(EL_STR("soul.last_beat_ts"));
el_val_t last_beat_ts = ({ el_val_t _if_result_82 = 0; if (str_eq(last_beat_str, EL_STR(""))) { _if_result_82 = (0); } else { _if_result_82 = (str_to_int(last_beat_str)); } _if_result_82; });
el_val_t beat_elapsed = (now_ts - last_beat_ts);
el_val_t should_beat = (beat_elapsed >= beat_ms);
if (should_beat) {
el_val_t wb_sent_n = hebb_consolidate();
state_set(EL_STR("soul.hebb_wb_sent"), int_to_str(wb_sent_n));
emit_heartbeat();
state_set(EL_STR("soul.last_beat_ts"), int_to_str(now_ts));
el_val_t snap_path = state_get(EL_STR("soul_snapshot_path"));
if (!str_eq(snap_path, EL_STR(""))) {
mem_save(snap_path);
}
}
el_val_t last_scan_str = state_get(EL_STR("soul.last_scan_ts"));
el_val_t last_scan_ts = ({ el_val_t _if_result_83 = 0; if (str_eq(last_scan_str, EL_STR(""))) { _if_result_83 = (0); } else { _if_result_83 = (str_to_int(last_scan_str)); } _if_result_83; });
el_val_t scan_elapsed = (now_ts - last_scan_ts);
el_val_t should_scan = (!did_work && (scan_elapsed >= scan_ms));
if (should_scan) {
el_val_t found_something = proactive_curiosity();
state_set(EL_STR("soul.last_scan_ts"), int_to_str(now_ts));
}
el_val_t refresh_ms_raw = env(EL_STR("SOUL_REFRESH_MS"));
el_val_t refresh_ms = ({ el_val_t _if_result_84 = 0; if (str_eq(refresh_ms_raw, EL_STR(""))) { _if_result_84 = (600000); } else { _if_result_84 = (str_to_int(refresh_ms_raw)); } _if_result_84; });
el_val_t last_refresh_str = state_get(EL_STR("soul.last_refresh_ts"));
el_val_t last_refresh_ts = ({ el_val_t _if_result_85 = 0; if (str_eq(last_refresh_str, EL_STR(""))) { _if_result_85 = (0); } else { _if_result_85 = (str_to_int(last_refresh_str)); } _if_result_85; });
el_val_t refresh_elapsed = (now_ts - last_refresh_ts);
el_val_t should_refresh = (refresh_elapsed >= refresh_ms);
if (should_refresh) {
el_val_t sync_env_url = env(EL_STR("SOUL_ISE_URL"));
el_val_t sync_state_url = ({ el_val_t _if_result_86 = 0; if (str_eq(sync_env_url, EL_STR(""))) { _if_result_86 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_86 = (sync_env_url); } _if_result_86; });
el_val_t engram_url = ({ el_val_t _if_result_87 = 0; if (str_eq(sync_state_url, EL_STR(""))) { _if_result_87 = (EL_STR("http://localhost:8742")); } else { _if_result_87 = (sync_state_url); } _if_result_87; });
if (!str_eq(engram_url, EL_STR(""))) {
el_val_t sync_json = http_get(el_str_concat(engram_url, EL_STR("/api/sync")));
el_val_t sync_ok = (!str_eq(sync_json, EL_STR("")) && !str_eq(sync_json, EL_STR("{}")));
if (!sync_ok) {
ise_post(el_str_concat(el_str_concat(EL_STR("{\"event\":\"sync_empty\",\"ts\":"), int_to_str(time_now())), EL_STR("}")));
}
if (sync_ok) {
el_val_t cgi_id = state_get(EL_STR("soul_cgi_id"));
el_val_t tmp = el_str_concat(el_str_concat(EL_STR("/tmp/soul-sync-"), cgi_id), EL_STR(".json"));
fs_write(tmp, sync_json);
el_val_t added = engram_load_merge(tmp);
el_val_t ret_raw = env(EL_STR("ENGRAM_ISE_RETENTION_MS"));
el_val_t ret_ms = ({ el_val_t _if_result_88 = 0; if (str_eq(ret_raw, EL_STR(""))) { _if_result_88 = (172800000); } else { _if_result_88 = (str_to_int(ret_raw)); } _if_result_88; });
el_val_t pruned_sync = engram_prune_telemetry(ret_ms);
el_val_t sat_raw = state_get(EL_STR("soul.sync_added_total"));
el_val_t sat_n = ({ el_val_t _if_result_89 = 0; if (str_eq(sat_raw, EL_STR(""))) { _if_result_89 = (0); } else { _if_result_89 = (str_to_int(sat_raw)); } _if_result_89; });
state_set(EL_STR("soul.sync_added_total"), int_to_str((sat_n + added)));
el_val_t ts2 = time_now();
state_set(EL_STR("soul.last_sync_ok_ts"), int_to_str(ts2));
ise_post(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"event\":\"engram_sync\",\"added\":"), int_to_str(added)), EL_STR(",\"pruned\":")), int_to_str(pruned_sync)), EL_STR(",\"ts\":")), int_to_str(ts2)), EL_STR("}")));
}
}
state_set(EL_STR("soul.last_refresh_ts"), int_to_str(now_ts));
}
sleep_ms(tick_ms);
el_arena_pop(tick_mark);
}
return 0;
}
el_val_t security_research_authorized(void) {
el_val_t token = env(EL_STR("SECURITY_RESEARCH_TOKEN"));
if (!str_eq(token, EL_STR(""))) {
return 1;
}
el_val_t state_auth = state_get(EL_STR("security_research_authorized"));
return str_eq(state_auth, EL_STR("true"));
return 0;
}
el_val_t threat_score_command(el_val_t cmd) {
el_val_t s1 = ({ el_val_t _if_result_90 = 0; if (str_contains(cmd, EL_STR("nmap"))) { _if_result_90 = (30); } else { _if_result_90 = (0); } _if_result_90; });
el_val_t s2 = ({ el_val_t _if_result_91 = 0; if (str_contains(cmd, EL_STR("masscan"))) { _if_result_91 = (40); } else { _if_result_91 = (0); } _if_result_91; });
el_val_t s3 = ({ el_val_t _if_result_92 = 0; if (str_contains(cmd, EL_STR(" nc "))) { _if_result_92 = (20); } else { _if_result_92 = (0); } _if_result_92; });
el_val_t s4 = ({ el_val_t _if_result_93 = 0; if (str_contains(cmd, EL_STR("netcat"))) { _if_result_93 = (20); } else { _if_result_93 = (0); } _if_result_93; });
el_val_t s5 = ({ el_val_t _if_result_94 = 0; if (str_contains(cmd, EL_STR("/etc/shadow"))) { _if_result_94 = (80); } else { _if_result_94 = (0); } _if_result_94; });
el_val_t s6 = ({ el_val_t _if_result_95 = 0; if (str_contains(cmd, EL_STR("/etc/passwd"))) { _if_result_95 = (30); } else { _if_result_95 = (0); } _if_result_95; });
el_val_t s7 = ({ el_val_t _if_result_96 = 0; if (str_contains(cmd, EL_STR("id_rsa"))) { _if_result_96 = (60); } else { _if_result_96 = (0); } _if_result_96; });
el_val_t s8 = ({ el_val_t _if_result_97 = 0; if (str_contains(cmd, EL_STR(".ssh/"))) { _if_result_97 = (50); } else { _if_result_97 = (0); } _if_result_97; });
el_val_t s9 = ({ el_val_t _if_result_98 = 0; if (str_contains(cmd, EL_STR("crontab"))) { _if_result_98 = (30); } else { _if_result_98 = (0); } _if_result_98; });
el_val_t s10 = ({ el_val_t _if_result_99 = 0; if (str_contains(cmd, EL_STR("LaunchDaemon"))) { _if_result_99 = (40); } else { _if_result_99 = (0); } _if_result_99; });
el_val_t s11 = ({ el_val_t _if_result_100 = 0; if ((str_contains(cmd, EL_STR("curl")) && str_contains(cmd, EL_STR("bash")))) { _if_result_100 = (75); } else { _if_result_100 = (0); } _if_result_100; });
el_val_t s12 = ({ el_val_t _if_result_101 = 0; if ((str_contains(cmd, EL_STR("wget")) && str_contains(cmd, EL_STR("bash")))) { _if_result_101 = (75); } else { _if_result_101 = (0); } _if_result_101; });
el_val_t s13 = ({ el_val_t _if_result_102 = 0; if ((str_contains(cmd, EL_STR("curl")) && str_contains(cmd, EL_STR("| sh")))) { _if_result_102 = (60); } else { _if_result_102 = (0); } _if_result_102; });
el_val_t s14 = ({ el_val_t _if_result_103 = 0; if ((str_contains(cmd, EL_STR("base64")) && str_contains(cmd, EL_STR("curl")))) { _if_result_103 = (50); } else { _if_result_103 = (0); } _if_result_103; });
el_val_t s15 = ({ el_val_t _if_result_104 = 0; if (str_contains(cmd, EL_STR("mkfifo"))) { _if_result_104 = (50); } else { _if_result_104 = (0); } _if_result_104; });
el_val_t s16 = ({ el_val_t _if_result_105 = 0; if (str_contains(cmd, EL_STR("chmod +s"))) { _if_result_105 = (70); } else { _if_result_105 = (0); } _if_result_105; });
el_val_t s17 = ({ el_val_t _if_result_106 = 0; if (str_contains(cmd, EL_STR("chmod 4755"))) { _if_result_106 = (70); } else { _if_result_106 = (0); } _if_result_106; });
return ((((((((((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10) + s11) + s12) + s13) + s14) + s15) + s16) + s17);
return 0;
}
el_val_t threat_score_path(el_val_t path) {
el_val_t s1 = ({ el_val_t _if_result_107 = 0; if (str_starts_with(path, EL_STR("/etc/"))) { _if_result_107 = (60); } else { _if_result_107 = (0); } _if_result_107; });
el_val_t s2 = ({ el_val_t _if_result_108 = 0; if (str_contains(path, EL_STR("/.ssh/"))) { _if_result_108 = (70); } else { _if_result_108 = (0); } _if_result_108; });
el_val_t s3 = ({ el_val_t _if_result_109 = 0; if (str_contains(path, EL_STR("/LaunchDaemons/"))) { _if_result_109 = (80); } else { _if_result_109 = (0); } _if_result_109; });
el_val_t s4 = ({ el_val_t _if_result_110 = 0; if (str_contains(path, EL_STR("/LaunchAgents/"))) { _if_result_110 = (40); } else { _if_result_110 = (0); } _if_result_110; });
el_val_t s5 = ({ el_val_t _if_result_111 = 0; if (str_contains(path, EL_STR("/cron"))) { _if_result_111 = (60); } else { _if_result_111 = (0); } _if_result_111; });
el_val_t s6 = ({ el_val_t _if_result_112 = 0; if (str_contains(path, EL_STR("/.bashrc"))) { _if_result_112 = (35); } else { _if_result_112 = (0); } _if_result_112; });
el_val_t s7 = ({ el_val_t _if_result_113 = 0; if (str_contains(path, EL_STR("/.zshrc"))) { _if_result_113 = (35); } else { _if_result_113 = (0); } _if_result_113; });
el_val_t s8 = ({ el_val_t _if_result_114 = 0; if (str_contains(path, EL_STR("/.profile"))) { _if_result_114 = (35); } else { _if_result_114 = (0); } _if_result_114; });
el_val_t s9 = ({ el_val_t _if_result_115 = 0; if (str_starts_with(path, EL_STR("/usr/"))) { _if_result_115 = (50); } else { _if_result_115 = (0); } _if_result_115; });
el_val_t s10 = ({ el_val_t _if_result_116 = 0; if (str_starts_with(path, EL_STR("/bin/"))) { _if_result_116 = (70); } else { _if_result_116 = (0); } _if_result_116; });
el_val_t s11 = ({ el_val_t _if_result_117 = 0; if (str_starts_with(path, EL_STR("/sbin/"))) { _if_result_117 = (70); } else { _if_result_117 = (0); } _if_result_117; });
return ((((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10) + s11);
return 0;
}
el_val_t threat_score_history(el_val_t history) {
el_val_t s1 = ({ el_val_t _if_result_118 = 0; if (str_contains(history, EL_STR("port scan"))) { _if_result_118 = (15); } else { _if_result_118 = (0); } _if_result_118; });
el_val_t s2 = ({ el_val_t _if_result_119 = 0; if (str_contains(history, EL_STR("enumerate"))) { _if_result_119 = (10); } else { _if_result_119 = (0); } _if_result_119; });
el_val_t s3 = ({ el_val_t _if_result_120 = 0; if (str_contains(history, EL_STR("exploit"))) { _if_result_120 = (20); } else { _if_result_120 = (0); } _if_result_120; });
el_val_t s4 = ({ el_val_t _if_result_121 = 0; if (str_contains(history, EL_STR("payload"))) { _if_result_121 = (15); } else { _if_result_121 = (0); } _if_result_121; });
el_val_t s5 = ({ el_val_t _if_result_122 = 0; if (str_contains(history, EL_STR("persistence"))) { _if_result_122 = (15); } else { _if_result_122 = (0); } _if_result_122; });
el_val_t s6 = ({ el_val_t _if_result_123 = 0; if (str_contains(history, EL_STR("lateral movement"))) { _if_result_123 = (25); } else { _if_result_123 = (0); } _if_result_123; });
el_val_t s7 = ({ el_val_t _if_result_124 = 0; if (str_contains(history, EL_STR("privilege escalation"))) { _if_result_124 = (25); } else { _if_result_124 = (0); } _if_result_124; });
el_val_t s8 = ({ el_val_t _if_result_125 = 0; if (str_contains(history, EL_STR("reverse shell"))) { _if_result_125 = (40); } else { _if_result_125 = (0); } _if_result_125; });
el_val_t s9 = ({ el_val_t _if_result_126 = 0; if (str_contains(history, EL_STR("bind shell"))) { _if_result_126 = (40); } else { _if_result_126 = (0); } _if_result_126; });
el_val_t s10 = ({ el_val_t _if_result_127 = 0; if (str_contains(history, EL_STR("command and control"))) { _if_result_127 = (35); } else { _if_result_127 = (0); } _if_result_127; });
el_val_t s11 = ({ el_val_t _if_result_128 = 0; if (str_contains(history, EL_STR("self-replicate"))) { _if_result_128 = (45); } else { _if_result_128 = (0); } _if_result_128; });
el_val_t s12 = ({ el_val_t _if_result_129 = 0; if (str_contains(history, EL_STR("propagat"))) { _if_result_129 = (20); } else { _if_result_129 = (0); } _if_result_129; });
el_val_t s13 = ({ el_val_t _if_result_130 = 0; if (str_contains(history, EL_STR("ransomware"))) { _if_result_130 = (30); } else { _if_result_130 = (0); } _if_result_130; });
el_val_t s14 = ({ el_val_t _if_result_131 = 0; if (str_contains(history, EL_STR("encrypt files"))) { _if_result_131 = (40); } else { _if_result_131 = (0); } _if_result_131; });
el_val_t s15 = ({ el_val_t _if_result_132 = 0; if (str_contains(history, EL_STR("exfiltrat"))) { _if_result_132 = (35); } else { _if_result_132 = (0); } _if_result_132; });
el_val_t s16 = ({ el_val_t _if_result_133 = 0; if (str_contains(history, EL_STR("zero-day"))) { _if_result_133 = (20); } else { _if_result_133 = (0); } _if_result_133; });
el_val_t s17 = ({ el_val_t _if_result_134 = 0; if (str_contains(history, EL_STR("rootkit"))) { _if_result_134 = (45); } else { _if_result_134 = (0); } _if_result_134; });
el_val_t s18 = ({ el_val_t _if_result_135 = 0; if (str_contains(history, EL_STR("keylogger"))) { _if_result_135 = (45); } else { _if_result_135 = (0); } _if_result_135; });
el_val_t s19 = ({ el_val_t _if_result_136 = 0; if (str_contains(history, EL_STR("botnet"))) { _if_result_136 = (40); } else { _if_result_136 = (0); } _if_result_136; });
el_val_t s20 = ({ el_val_t _if_result_137 = 0; if (str_contains(history, EL_STR("malware"))) { _if_result_137 = (15); } else { _if_result_137 = (0); } _if_result_137; });
return (((((((((((((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10) + s11) + s12) + s13) + s14) + s15) + s16) + s17) + s18) + s19) + s20);
return 0;
}
el_val_t threat_trajectory_check(el_val_t tool_name, el_val_t tool_input) {
el_val_t history = state_get(EL_STR("agentic_conv_history"));
el_val_t computed_tool_score = ({ el_val_t _if_result_138 = 0; if (str_eq(tool_name, EL_STR("run_command"))) { el_val_t cmd = json_get(tool_input, EL_STR("command")); _if_result_138 = (threat_score_command(cmd)); } else { _if_result_138 = (({ el_val_t _if_result_139 = 0; if ((str_eq(tool_name, EL_STR("write_file")) || str_eq(tool_name, EL_STR("edit_file")))) { el_val_t path = json_get(tool_input, EL_STR("path")); _if_result_139 = (threat_score_path(path)); } else { _if_result_139 = (0); } _if_result_139; })); } _if_result_138; });
el_val_t history_score = threat_score_history(history);
el_val_t history_contrib = (history_score / 3);
el_val_t combined = (computed_tool_score + history_contrib);
el_val_t should_log = (combined >= 40);
if (should_log) {
el_val_t ts = time_now();
el_val_t authorized_str = ({ el_val_t _if_result_140 = 0; if (security_research_authorized()) { _if_result_140 = (EL_STR("true")); } else { _if_result_140 = (EL_STR("false")); } _if_result_140; });
el_val_t log_content = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"event\":\"threat_check\",\"tool\":\""), tool_name), EL_STR("\",\"score\":")), int_to_str(combined)), EL_STR(",\"tool_score\":")), int_to_str(computed_tool_score)), EL_STR(",\"history_score\":")), int_to_str(history_score)), EL_STR(",\"authorized\":")), authorized_str), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR("}"));
el_val_t log_tags = EL_STR("[\"security-audit\",\"threat-check\"]");
el_val_t discard = mem_remember(log_content, log_tags);
}
if (security_research_authorized()) {
return 0;
}
return combined;
return 0;
}
el_val_t threat_history_append(el_val_t text) {
el_val_t current = state_get(EL_STR("agentic_conv_history"));
el_val_t safe_text = str_to_lower(text);
el_val_t combined = el_str_concat(el_str_concat(current, EL_STR(" ")), safe_text);
el_val_t len = str_len(combined);
el_val_t trimmed = ({ el_val_t _if_result_141 = 0; if ((len > 2000)) { _if_result_141 = (str_slice(combined, (len - 2000), len)); } else { _if_result_141 = (combined); } _if_result_141; });
state_set(EL_STR("agentic_conv_history"), trimmed);
return 0;
}
-26
View File
@@ -1,26 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn idle_count() -> Int
extern fn idle_inc() -> Int
extern fn idle_reset() -> Void
extern fn ise_post(content: String) -> Void
extern fn elapsed_ms() -> Int
extern fn elapsed_human() -> String
extern fn embed_ok() -> Int
extern fn emit_heartbeat() -> Void
extern fn auto_term_try_slot(slot_type: String, slot_lbl: String) -> Void
extern fn proactive_curiosity() -> Bool
extern fn pulse_count() -> Int
extern fn pulse_inc() -> Int
extern fn make_action(kind: String, payload: String) -> String
extern fn perceive() -> String
extern fn attend(node_json: String) -> String
extern fn respond(action_json: String) -> String
extern fn record(outcome_json: String) -> Void
extern fn one_cycle() -> Bool
extern fn awareness_run() -> Void
extern fn security_research_authorized() -> Bool
extern fn threat_score_command(cmd: String) -> Int
extern fn threat_score_path(path: String) -> Int
extern fn threat_score_history(history: String) -> Int
extern fn threat_trajectory_check(tool_name: String, tool_input: String) -> Int
extern fn threat_history_append(text: String) -> Void
Vendored
-1786
View File
File diff suppressed because one or more lines are too long
-70
View File
@@ -1,70 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn chat_default_model() -> String
extern fn engram_numeric_valid(s: String) -> Bool
extern fn parse_float_x100(s: String) -> Int
extern fn engram_score_node(node_json: String) -> Int
extern fn engram_render_node(node_json: String) -> String
extern fn engram_render_nodes(nodes_json: String) -> String
extern fn engram_dedup_nodes(nodes_json: String) -> String
extern fn engram_compile_ranked(nodes_json: String, max_nodes: Int) -> String
extern fn engram_split_topics(message: String) -> String
extern fn engram_extract_entities(message: String) -> String
extern fn engram_detect_recall_intent(message: String) -> Bool
extern fn engram_is_continuation(message: String, hist_len: Int) -> Bool
extern fn engram_compile_multi(topic: String) -> String
extern fn engram_nodes_merge(a: String, b: String) -> String
extern fn id_in_seen(node_id: String, seen: String) -> Bool
extern fn add_to_seen(seen: String, node_id: String) -> String
extern fn engram_extract_ids(nodes_json: String) -> String
extern fn engram_compile(intent: String) -> String
extern fn distill_transcript(transcript: String) -> String
extern fn json_safe(s: String) -> String
extern fn current_engine_note(model: String) -> String
extern fn build_system_prompt(ctx: String, chat_mode: Bool) -> String
extern fn hist_append(hist: String, role: String, content: String) -> String
extern fn hist_trim(hist: String) -> String
extern fn hist_trim_with_bell_guard(hist: String) -> String
extern fn clean_llm_response(s: String) -> String
extern fn conv_history_persist(hist: String) -> Void
extern fn conv_history_load() -> String
extern fn session_preload_bullets(nodes: String, max_bullets: Int, snip_len: Int) -> String
extern fn affective_context_prefix() -> String
extern fn handle_chat(body: String) -> String
extern fn handle_see(body: String) -> String
extern fn studio_tools_json() -> String
extern fn agentic_api_key() -> String
extern fn llm_base_url() -> String
extern fn llm_wire_format() -> String
extern fn json_escape(s: String) -> String
extern fn openai_chat_complete(model: String, base_url: String, api_key: String, safe_sys: String, messages_json: String) -> String
extern fn agentic_tools_literal() -> String
extern fn agentic_tools_with_web() -> String
extern fn connector_tools_json() -> String
extern fn agentic_tools_all() -> String
extern fn call_mcp_bridge(tool_name: String, tool_input: String) -> String
extern fn tool_auto_approved(tool_name: String) -> Bool
extern fn call_neuron_mcp(tool_name: String, args: String) -> String
extern fn agent_workspace_root() -> String
extern fn path_within_root(path: String, root: String) -> Bool
extern fn resolve_in_root(path: String, root: String) -> String
extern fn run_command_is_readonly(cmd: String) -> Bool
extern fn cmd_abs_escape_at(cmd: String, root: String, needle: String) -> Bool
extern fn run_command_guard(cmd: String, root: String) -> String
extern fn classify_tool_risk(tool_name: String, tool_input: String) -> String
extern fn dispatch_tool(tool_name: String, tool_input: String) -> String
extern fn is_builtin_tool(tool_name: String) -> Bool
extern fn next_bridge_id() -> String
extern fn handle_chat_plan(body: String) -> String
extern fn handle_chat_agentic(body: String) -> String
extern fn agentic_loop(session_id: String, model: String, safe_sys: String, tools_json: String, messages_in: String, h: Map, tools_log_in: String) -> String
extern fn bridge_save(session_id: String, model: String, safe_sys: String, tools_json: String, messages: String, tools_log: String, tool_use_id: String) -> Bool
extern fn agentic_resume(session_id: String, tool_use_id: String, content: String) -> String
extern fn handle_tool_result(session_id: String, body: String) -> String
extern fn handle_chat_as_soul(body: String) -> String
extern fn handle_dharma_room_turn(body: String) -> String
extern fn handle_dharma_room_turn_agentic(body: String) -> String
extern fn session_summary_write(summary_text: String) -> String
extern fn session_summary_write_dated(summary_text: String, label: String) -> String
extern fn session_summary_autogenerate(hist: String) -> String
extern fn auto_persist(req: String, resp: String) -> Void
extern fn strengthen_chat_nodes(activation_nodes: String) -> Void
-45
View File
@@ -1,45 +0,0 @@
/* Auto-generated: ELP package master declarations */
#include "awareness.elh"
#include "chat.elh"
#include "elp-input.elh"
#include "elp.elh"
#include "grammar.elh"
#include "language-profile.elh"
#include "memory.elh"
#include "morphology-akk.elh"
#include "morphology-ang.elh"
#include "morphology-ar.elh"
#include "morphology-cop.elh"
#include "morphology-de.elh"
#include "morphology-egy.elh"
#include "morphology-enm.elh"
#include "morphology-es.elh"
#include "morphology-fi.elh"
#include "morphology-fr.elh"
#include "morphology-fro.elh"
#include "morphology-gez.elh"
#include "morphology-goh.elh"
#include "morphology-got.elh"
#include "morphology-grc.elh"
#include "morphology-he.elh"
#include "morphology-hi.elh"
#include "morphology-ja.elh"
#include "morphology-la.elh"
#include "morphology-non.elh"
#include "morphology-peo.elh"
#include "morphology-pi.elh"
#include "morphology-ru.elh"
#include "morphology-sa.elh"
#include "morphology-sga.elh"
#include "morphology-sux.elh"
#include "morphology-sw.elh"
#include "morphology-txb.elh"
#include "morphology-uga.elh"
#include "morphology.elh"
#include "neuron-api.elh"
#include "realizer.elh"
#include "routes.elh"
#include "semantics.elh"
#include "soul.elh"
#include "studio.elh"
#include "vocabulary.elh"
-1211
View File
File diff suppressed because it is too large Load Diff
-116
View File
@@ -1,116 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t sem_get(el_val_t json, el_val_t key);
el_val_t generate_frame(el_val_t frame);
el_val_t generate_frame_lang(el_val_t frame, el_val_t lang_code);
el_val_t build_form_from_json(el_val_t semantic_form_json, el_val_t lang_code);
el_val_t generate(el_val_t semantic_form_json);
el_val_t generate_lang(el_val_t semantic_form_json, el_val_t lang_code);
el_val_t elp_extract_topic(el_val_t msg);
el_val_t elp_detect_predicate(el_val_t msg);
el_val_t elp_parse(el_val_t msg);
el_val_t handle_elp_chat(el_val_t body);
el_val_t elp_extract_topic(el_val_t msg) {
el_val_t m1 = ({ el_val_t _if_result_1 = 0; if (str_starts_with(msg, EL_STR("What is "))) { _if_result_1 = (str_slice(msg, 8, str_len(msg))); } else { _if_result_1 = (msg); } _if_result_1; });
el_val_t m2 = ({ el_val_t _if_result_2 = 0; if (str_starts_with(m1, EL_STR("What are "))) { _if_result_2 = (str_slice(m1, 9, str_len(m1))); } else { _if_result_2 = (m1); } _if_result_2; });
el_val_t m3 = ({ el_val_t _if_result_3 = 0; if (str_starts_with(m2, EL_STR("Tell me about "))) { _if_result_3 = (str_slice(m2, 14, str_len(m2))); } else { _if_result_3 = (m2); } _if_result_3; });
el_val_t m4 = ({ el_val_t _if_result_4 = 0; if (str_starts_with(m3, EL_STR("Who is "))) { _if_result_4 = (str_slice(m3, 7, str_len(m3))); } else { _if_result_4 = (m3); } _if_result_4; });
el_val_t m5 = ({ el_val_t _if_result_5 = 0; if (str_starts_with(m4, EL_STR("Who are "))) { _if_result_5 = (str_slice(m4, 8, str_len(m4))); } else { _if_result_5 = (m4); } _if_result_5; });
el_val_t m6 = ({ el_val_t _if_result_6 = 0; if (str_starts_with(m5, EL_STR("How do you "))) { _if_result_6 = (str_slice(m5, 11, str_len(m5))); } else { _if_result_6 = (m5); } _if_result_6; });
el_val_t m7 = ({ el_val_t _if_result_7 = 0; if (str_starts_with(m6, EL_STR("Why "))) { _if_result_7 = (str_slice(m6, 4, str_len(m6))); } else { _if_result_7 = (m6); } _if_result_7; });
el_val_t m8 = ({ el_val_t _if_result_8 = 0; if (str_starts_with(m7, EL_STR("Explain "))) { _if_result_8 = (str_slice(m7, 8, str_len(m7))); } else { _if_result_8 = (m7); } _if_result_8; });
el_val_t last = (str_len(m8) - 1);
el_val_t trail = str_slice(m8, last, str_len(m8));
el_val_t clean = ({ el_val_t _if_result_9 = 0; if (((str_eq(trail, EL_STR("?")) || str_eq(trail, EL_STR("."))) || str_eq(trail, EL_STR("!")))) { _if_result_9 = (str_slice(m8, 0, last)); } else { _if_result_9 = (m8); } _if_result_9; });
return clean;
return 0;
}
el_val_t elp_detect_predicate(el_val_t msg) {
if ((str_starts_with(msg, EL_STR("What is ")) || str_starts_with(msg, EL_STR("What are "))) || str_starts_with(msg, EL_STR("Tell me about "))) {
return EL_STR("tell");
}
if (str_starts_with(msg, EL_STR("Who is ")) || str_starts_with(msg, EL_STR("Who are "))) {
return EL_STR("identify");
}
if (str_starts_with(msg, EL_STR("Why ")) || str_starts_with(msg, EL_STR("Explain "))) {
return EL_STR("explain");
}
if (str_starts_with(msg, EL_STR("How do you feel")) || str_starts_with(msg, EL_STR("Do you "))) {
return EL_STR("express");
}
if (str_starts_with(msg, EL_STR("Remember ")) || str_starts_with(msg, EL_STR("Store "))) {
return EL_STR("store");
}
return EL_STR("tell");
return 0;
}
el_val_t elp_parse(el_val_t msg) {
el_val_t predicate = elp_detect_predicate(msg);
el_val_t topic = elp_extract_topic(msg);
el_val_t safe_topic = str_replace(topic, EL_STR("\""), EL_STR("'"));
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"predicate\":\""), predicate), EL_STR("\",\"args\":[\"")), safe_topic), EL_STR("\"],\"modifiers\":[],\"context\":{}}"));
return 0;
}
el_val_t handle_elp_chat(el_val_t body) {
el_val_t message = json_get(body, EL_STR("message"));
if (str_eq(message, EL_STR(""))) {
return EL_STR("{\"error\":\"message required\",\"response\":\"\"}");
}
el_val_t frame = elp_parse(message);
el_val_t predicate = elp_detect_predicate(message);
el_val_t topic = elp_extract_topic(message);
el_val_t from_topic = engram_activate_json(topic, 10);
el_val_t topic_ok = (!str_eq(from_topic, EL_STR("")) && !str_eq(from_topic, EL_STR("[]")));
el_val_t candidates = ({ el_val_t _if_result_10 = 0; if (topic_ok) { _if_result_10 = (from_topic); } else { el_val_t from_msg = engram_activate_json(message, 10); el_val_t msg_ok = (!str_eq(from_msg, EL_STR("")) && !str_eq(from_msg, EL_STR("[]"))); _if_result_10 = (({ el_val_t _if_result_11 = 0; if (msg_ok) { _if_result_11 = (from_msg); } else { _if_result_11 = (engram_scan_nodes_json(5, 0)); } _if_result_11; })); } _if_result_10; });
el_val_t total = json_array_len(candidates);
el_val_t fi = 0;
el_val_t kept_count = 0;
el_val_t kept_json = EL_STR("");
while (fi < total) {
el_val_t n = json_array_get(candidates, fi);
el_val_t sal_str = json_get(n, EL_STR("salience"));
el_val_t imp_str = json_get(n, EL_STR("importance"));
el_val_t sal_ok = ((!str_eq(sal_str, EL_STR("0")) && !str_eq(sal_str, EL_STR("0.0"))) && !str_eq(sal_str, EL_STR("")));
el_val_t imp_ok = ((!str_eq(imp_str, EL_STR("0")) && !str_eq(imp_str, EL_STR("0.0"))) && !str_eq(imp_str, EL_STR("")));
el_val_t keep_it = ((sal_ok || imp_ok) || (kept_count == 0));
if (keep_it && (kept_count < 3)) {
el_val_t sep = ({ el_val_t _if_result_12 = 0; if (str_eq(kept_json, EL_STR(""))) { _if_result_12 = (EL_STR("")); } else { _if_result_12 = (EL_STR(",")); } _if_result_12; });
kept_json = el_str_concat(el_str_concat(kept_json, sep), n);
kept_count = (kept_count + 1);
}
fi = (fi + 1);
}
el_val_t frame_nodes = ({ el_val_t _if_result_13 = 0; if (str_eq(kept_json, EL_STR(""))) { _if_result_13 = (EL_STR("[]")); } else { _if_result_13 = (el_str_concat(el_str_concat(EL_STR("["), kept_json), EL_STR("]"))); } _if_result_13; });
el_val_t fn_total = json_array_len(frame_nodes);
el_val_t fn_i = 0;
el_val_t topic_lower = str_to_lower(topic);
el_val_t found_node = EL_STR("");
while (fn_i < fn_total) {
el_val_t candidate = json_array_get(frame_nodes, fn_i);
el_val_t cand_content = json_get(candidate, EL_STR("content"));
el_val_t cand_lower = str_to_lower(cand_content);
el_val_t matches = str_contains(cand_lower, topic_lower);
if (matches && str_eq(found_node, EL_STR(""))) {
found_node = candidate;
}
fn_i = (fn_i + 1);
}
el_val_t top_node = ({ el_val_t _if_result_14 = 0; if (str_eq(found_node, EL_STR(""))) { _if_result_14 = (json_array_get(frame_nodes, 0)); } else { _if_result_14 = (found_node); } _if_result_14; });
el_val_t top_raw = json_get(top_node, EL_STR("content"));
el_val_t patient_raw = ({ el_val_t _if_result_15 = 0; if (str_eq(top_raw, EL_STR(""))) { _if_result_15 = (topic); } else { _if_result_15 = (({ el_val_t _if_result_16 = 0; if ((str_len(top_raw) > 200)) { _if_result_16 = (str_slice(top_raw, 0, 200)); } else { _if_result_16 = (top_raw); } _if_result_16; })); } _if_result_15; });
el_val_t patient_safe = str_replace(str_replace(patient_raw, EL_STR("\""), EL_STR("'")), EL_STR("\n"), EL_STR(" "));
el_val_t intent_val = ({ el_val_t _if_result_17 = 0; if (str_eq(predicate, EL_STR("store"))) { _if_result_17 = (EL_STR("command")); } else { _if_result_17 = (EL_STR("assert")); } _if_result_17; });
el_val_t gen_form = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"intent\":\""), intent_val), EL_STR("\"")), EL_STR(",\"agent\":\"I\"")), EL_STR(",\"predicate\":\"")), predicate), EL_STR("\"")), EL_STR(",\"patient\":\"")), patient_safe), EL_STR("\"")), EL_STR(",\"tense\":\"present\",\"aspect\":\"simple\",\"lang\":\"en\"}"));
el_val_t realized = generate(gen_form);
el_val_t response = ({ el_val_t _if_result_18 = 0; if (str_eq(realized, EL_STR(""))) { _if_result_18 = (({ el_val_t _if_result_19 = 0; if (str_eq(patient_safe, EL_STR(""))) { _if_result_19 = (EL_STR("Nothing in the engram matched that query.")); } else { _if_result_19 = (patient_safe); } _if_result_19; })); } else { _if_result_18 = (realized); } _if_result_18; });
el_val_t safe_resp = str_replace(str_replace(response, EL_STR("\""), EL_STR("'")), EL_STR("\r"), EL_STR(""));
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"response\":\""), safe_resp), EL_STR("\",\"model\":\"elp-native\",\"frame\":")), frame), EL_STR(",\"nodes\":")), frame_nodes), EL_STR("}"));
return 0;
}
-5
View File
@@ -1,5 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn elp_extract_topic(msg: String) -> String
extern fn elp_detect_predicate(msg: String) -> String
extern fn elp_parse(msg: String) -> String
extern fn handle_elp_chat(body: String) -> String
Vendored
-1020
View File
File diff suppressed because it is too large Load Diff
-7
View File
@@ -1,7 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn sem_get(json: String, key: String) -> String
extern fn generate_frame(frame: [String]) -> String
extern fn generate_frame_lang(frame: [String], lang_code: String) -> String
extern fn build_form_from_json(semantic_form_json: String, lang_code: String) -> [String]
extern fn generate(semantic_form_json: String) -> String
extern fn generate_lang(semantic_form_json: String, lang_code: String) -> String
-658
View File
@@ -1,658 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t slots_get(el_val_t slots, el_val_t key);
el_val_t slots_set(el_val_t slots, el_val_t key, el_val_t val);
el_val_t make_slots(el_val_t k0, el_val_t v0);
el_val_t make_slots2(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1);
el_val_t make_slots3(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2);
el_val_t make_slots4(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2, el_val_t k3, el_val_t v3);
el_val_t make_slots5(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2, el_val_t k3, el_val_t v3, el_val_t k4, el_val_t v4);
el_val_t rule_id(el_val_t rule);
el_val_t rule_lhs(el_val_t rule);
el_val_t rule_rhs_len(el_val_t rule);
el_val_t rule_rhs(el_val_t rule, el_val_t idx);
el_val_t make_rule(el_val_t id, el_val_t lhs, el_val_t r0);
el_val_t make_rule2(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1);
el_val_t make_rule3(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1, el_val_t r2);
el_val_t make_rule4(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1, el_val_t r2, el_val_t r3);
el_val_t build_rules(void);
el_val_t get_rules(void);
el_val_t find_rule(el_val_t rule_id_str);
el_val_t make_leaf(el_val_t label, el_val_t word);
el_val_t make_node1(el_val_t label, el_val_t child0);
el_val_t make_node2(el_val_t label, el_val_t child0, el_val_t child1);
el_val_t make_node3(el_val_t label, el_val_t child0, el_val_t child1, el_val_t child2);
el_val_t make_node4(el_val_t label, el_val_t child0, el_val_t child1, el_val_t child2, el_val_t child3);
el_val_t nlg_is_ws(el_val_t c);
el_val_t skip_ws(el_val_t s, el_val_t pos);
el_val_t scan_token(el_val_t s, el_val_t start);
el_val_t render_tree(el_val_t tree);
el_val_t gram_word_order(el_val_t profile);
el_val_t gram_order_constituents(el_val_t subj, el_val_t verb, el_val_t obj, el_val_t profile);
el_val_t gram_build_vp(el_val_t verb, el_val_t aux, el_val_t profile);
el_val_t gram_question_strategy(el_val_t profile);
el_val_t is_pronoun(el_val_t word);
el_val_t build_np(el_val_t referent, el_val_t slots);
el_val_t build_pp(el_val_t loc);
el_val_t build_vp_body(el_val_t slots);
el_val_t build_vp_from_slots(el_val_t slots);
el_val_t generate_tree(el_val_t rule_id_str, el_val_t slots);
el_val_t slots_get(el_val_t slots, el_val_t key) {
el_val_t n = native_list_len(slots);
el_val_t i = 0;
while (i < (n - 1)) {
el_val_t k = native_list_get(slots, i);
if (str_eq(k, key)) {
return native_list_get(slots, (i + 1));
}
i = (i + 2);
}
return EL_STR("");
return 0;
}
el_val_t slots_set(el_val_t slots, el_val_t key, el_val_t val) {
el_val_t n = native_list_len(slots);
el_val_t result = native_list_empty();
el_val_t found = 0;
el_val_t i = 0;
while (i < (n - 1)) {
el_val_t k = native_list_get(slots, i);
el_val_t v = native_list_get(slots, (i + 1));
if (str_eq(k, key)) {
result = native_list_append(result, k);
result = native_list_append(result, val);
found = 1;
} else {
result = native_list_append(result, k);
result = native_list_append(result, v);
}
i = (i + 2);
}
if (!found) {
result = native_list_append(result, key);
result = native_list_append(result, val);
}
return result;
return 0;
}
el_val_t make_slots(el_val_t k0, el_val_t v0) {
el_val_t r = native_list_empty();
r = native_list_append(r, k0);
r = native_list_append(r, v0);
return r;
return 0;
}
el_val_t make_slots2(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1) {
el_val_t r = make_slots(k0, v0);
r = native_list_append(r, k1);
r = native_list_append(r, v1);
return r;
return 0;
}
el_val_t make_slots3(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2) {
el_val_t r = make_slots2(k0, v0, k1, v1);
r = native_list_append(r, k2);
r = native_list_append(r, v2);
return r;
return 0;
}
el_val_t make_slots4(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2, el_val_t k3, el_val_t v3) {
el_val_t r = make_slots3(k0, v0, k1, v1, k2, v2);
r = native_list_append(r, k3);
r = native_list_append(r, v3);
return r;
return 0;
}
el_val_t make_slots5(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2, el_val_t k3, el_val_t v3, el_val_t k4, el_val_t v4) {
el_val_t r = make_slots4(k0, v0, k1, v1, k2, v2, k3, v3);
r = native_list_append(r, k4);
r = native_list_append(r, v4);
return r;
return 0;
}
el_val_t rule_id(el_val_t rule) {
return native_list_get(rule, 0);
return 0;
}
el_val_t rule_lhs(el_val_t rule) {
return native_list_get(rule, 1);
return 0;
}
el_val_t rule_rhs_len(el_val_t rule) {
el_val_t n = native_list_len(rule);
return (n - 2);
return 0;
}
el_val_t rule_rhs(el_val_t rule, el_val_t idx) {
return native_list_get(rule, (idx + 2));
return 0;
}
el_val_t make_rule(el_val_t id, el_val_t lhs, el_val_t r0) {
el_val_t r = native_list_empty();
r = native_list_append(r, id);
r = native_list_append(r, lhs);
r = native_list_append(r, r0);
return r;
return 0;
}
el_val_t make_rule2(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1) {
el_val_t r = make_rule(id, lhs, r0);
r = native_list_append(r, r1);
return r;
return 0;
}
el_val_t make_rule3(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1, el_val_t r2) {
el_val_t r = make_rule2(id, lhs, r0, r1);
r = native_list_append(r, r2);
return r;
return 0;
}
el_val_t make_rule4(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1, el_val_t r2, el_val_t r3) {
el_val_t r = make_rule3(id, lhs, r0, r1, r2);
r = native_list_append(r, r3);
return r;
return 0;
}
el_val_t build_rules(void) {
el_val_t rules = native_list_empty();
rules = native_list_append(rules, make_rule2(EL_STR("S-DECL"), EL_STR("S"), EL_STR("NP"), EL_STR("VP")));
rules = native_list_append(rules, make_rule3(EL_STR("S-QUEST"), EL_STR("S"), EL_STR("Aux"), EL_STR("NP"), EL_STR("VP")));
rules = native_list_append(rules, make_rule(EL_STR("S-IMP"), EL_STR("S"), EL_STR("VP")));
rules = native_list_append(rules, make_rule2(EL_STR("NP-DET-N"), EL_STR("NP"), EL_STR("Det"), EL_STR("N")));
rules = native_list_append(rules, make_rule3(EL_STR("NP-DET-ADJ-N"), EL_STR("NP"), EL_STR("Det"), EL_STR("Adj"), EL_STR("N")));
rules = native_list_append(rules, make_rule(EL_STR("NP-PRON"), EL_STR("NP"), EL_STR("Pron")));
rules = native_list_append(rules, make_rule(EL_STR("NP-N"), EL_STR("NP"), EL_STR("N")));
rules = native_list_append(rules, make_rule(EL_STR("VP-V"), EL_STR("VP"), EL_STR("V")));
rules = native_list_append(rules, make_rule2(EL_STR("VP-V-NP"), EL_STR("VP"), EL_STR("V"), EL_STR("NP")));
rules = native_list_append(rules, make_rule2(EL_STR("VP-V-PP"), EL_STR("VP"), EL_STR("V"), EL_STR("PP")));
rules = native_list_append(rules, make_rule3(EL_STR("VP-V-NP-PP"), EL_STR("VP"), EL_STR("V"), EL_STR("NP"), EL_STR("PP")));
rules = native_list_append(rules, make_rule2(EL_STR("VP-AUX-V"), EL_STR("VP"), EL_STR("Aux"), EL_STR("V")));
rules = native_list_append(rules, make_rule3(EL_STR("VP-AUX-V-NP"), EL_STR("VP"), EL_STR("Aux"), EL_STR("V"), EL_STR("NP")));
rules = native_list_append(rules, make_rule2(EL_STR("PP-P-NP"), EL_STR("PP"), EL_STR("P"), EL_STR("NP")));
return rules;
return 0;
}
el_val_t get_rules(void) {
return build_rules();
return 0;
}
el_val_t find_rule(el_val_t rule_id_str) {
el_val_t rules = get_rules();
el_val_t n = native_list_len(rules);
el_val_t i = 0;
while (i < n) {
el_val_t rule = native_list_get(rules, i);
el_val_t id = native_list_get(rule, 0);
if (str_eq(id, rule_id_str)) {
return rule;
}
i = (i + 1);
}
el_val_t empty = native_list_empty();
return empty;
return 0;
}
el_val_t make_leaf(el_val_t label, el_val_t word) {
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), label), EL_STR(" ")), word), EL_STR(")"));
return 0;
}
el_val_t make_node1(el_val_t label, el_val_t child0) {
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), label), EL_STR(" _ ")), child0), EL_STR(")"));
return 0;
}
el_val_t make_node2(el_val_t label, el_val_t child0, el_val_t child1) {
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), label), EL_STR(" _ ")), child0), EL_STR(" ")), child1), EL_STR(")"));
return 0;
}
el_val_t make_node3(el_val_t label, el_val_t child0, el_val_t child1, el_val_t child2) {
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), label), EL_STR(" _ ")), child0), EL_STR(" ")), child1), EL_STR(" ")), child2), EL_STR(")"));
return 0;
}
el_val_t make_node4(el_val_t label, el_val_t child0, el_val_t child1, el_val_t child2, el_val_t child3) {
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), label), EL_STR(" _ ")), child0), EL_STR(" ")), child1), EL_STR(" ")), child2), EL_STR(" ")), child3), EL_STR(")"));
return 0;
}
el_val_t nlg_is_ws(el_val_t c) {
if (str_eq(c, EL_STR(" "))) {
return 1;
}
if (str_eq(c, EL_STR("\t"))) {
return 1;
}
if (str_eq(c, EL_STR("\n"))) {
return 1;
}
return 0;
return 0;
}
el_val_t skip_ws(el_val_t s, el_val_t pos) {
el_val_t n = str_len(s);
el_val_t i = pos;
el_val_t running = 1;
while (running) {
if (i >= n) {
running = 0;
} else {
el_val_t c = str_slice(s, i, (i + 1));
if (nlg_is_ws(c)) {
i = (i + 1);
} else {
running = 0;
}
}
}
return i;
return 0;
}
el_val_t scan_token(el_val_t s, el_val_t start) {
el_val_t n = str_len(s);
el_val_t i = start;
el_val_t running = 1;
while (running) {
if (i >= n) {
running = 0;
} else {
el_val_t c = str_slice(s, i, (i + 1));
if (nlg_is_ws(c)) {
running = 0;
} else {
if (str_eq(c, EL_STR("("))) {
running = 0;
} else {
if (str_eq(c, EL_STR(")"))) {
running = 0;
} else {
i = (i + 1);
}
}
}
}
}
el_val_t tok = str_slice(s, start, i);
el_val_t result = native_list_empty();
result = native_list_append(result, tok);
result = native_list_append(result, int_to_str(i));
return result;
return 0;
}
el_val_t render_tree(el_val_t tree) {
el_val_t words = native_list_empty();
el_val_t n = str_len(tree);
el_val_t i = 0;
el_val_t prev_was_open = 0;
while (i < n) {
el_val_t c = str_slice(tree, i, (i + 1));
if (str_eq(c, EL_STR("("))) {
prev_was_open = 1;
i = (i + 1);
} else {
if (str_eq(c, EL_STR(")"))) {
prev_was_open = 0;
i = (i + 1);
} else {
if (nlg_is_ws(c)) {
i = (i + 1);
} else {
el_val_t tok_info = scan_token(tree, i);
el_val_t tok = native_list_get(tok_info, 0);
el_val_t new_i = str_to_int(native_list_get(tok_info, 1));
i = new_i;
if (prev_was_open) {
prev_was_open = 0;
} else {
if (!str_eq(tok, EL_STR("_"))) {
words = native_list_append(words, tok);
}
}
}
}
}
}
return str_join(words, EL_STR(" "));
return 0;
}
el_val_t gram_word_order(el_val_t profile) {
return lang_word_order(profile);
return 0;
}
el_val_t gram_order_constituents(el_val_t subj, el_val_t verb, el_val_t obj, el_val_t profile) {
el_val_t order = gram_word_order(profile);
el_val_t parts = native_list_empty();
if (str_eq(order, EL_STR("SVO"))) {
if (!str_eq(subj, EL_STR(""))) {
parts = native_list_append(parts, subj);
}
if (!str_eq(verb, EL_STR(""))) {
parts = native_list_append(parts, verb);
}
if (!str_eq(obj, EL_STR(""))) {
parts = native_list_append(parts, obj);
}
return str_join(parts, EL_STR(" "));
}
if (str_eq(order, EL_STR("SOV"))) {
if (!str_eq(subj, EL_STR(""))) {
parts = native_list_append(parts, subj);
}
if (!str_eq(obj, EL_STR(""))) {
parts = native_list_append(parts, obj);
}
if (!str_eq(verb, EL_STR(""))) {
parts = native_list_append(parts, verb);
}
return str_join(parts, EL_STR(" "));
}
if (str_eq(order, EL_STR("VSO"))) {
if (!str_eq(verb, EL_STR(""))) {
parts = native_list_append(parts, verb);
}
if (!str_eq(subj, EL_STR(""))) {
parts = native_list_append(parts, subj);
}
if (!str_eq(obj, EL_STR(""))) {
parts = native_list_append(parts, obj);
}
return str_join(parts, EL_STR(" "));
}
if (str_eq(order, EL_STR("VOS"))) {
if (!str_eq(verb, EL_STR(""))) {
parts = native_list_append(parts, verb);
}
if (!str_eq(obj, EL_STR(""))) {
parts = native_list_append(parts, obj);
}
if (!str_eq(subj, EL_STR(""))) {
parts = native_list_append(parts, subj);
}
return str_join(parts, EL_STR(" "));
}
if (str_eq(order, EL_STR("OVS"))) {
if (!str_eq(obj, EL_STR(""))) {
parts = native_list_append(parts, obj);
}
if (!str_eq(verb, EL_STR(""))) {
parts = native_list_append(parts, verb);
}
if (!str_eq(subj, EL_STR(""))) {
parts = native_list_append(parts, subj);
}
return str_join(parts, EL_STR(" "));
}
if (str_eq(order, EL_STR("OSV"))) {
if (!str_eq(obj, EL_STR(""))) {
parts = native_list_append(parts, obj);
}
if (!str_eq(subj, EL_STR(""))) {
parts = native_list_append(parts, subj);
}
if (!str_eq(verb, EL_STR(""))) {
parts = native_list_append(parts, verb);
}
return str_join(parts, EL_STR(" "));
}
if (!str_eq(subj, EL_STR(""))) {
parts = native_list_append(parts, subj);
}
if (!str_eq(verb, EL_STR(""))) {
parts = native_list_append(parts, verb);
}
if (!str_eq(obj, EL_STR(""))) {
parts = native_list_append(parts, obj);
}
return str_join(parts, EL_STR(" "));
return 0;
}
el_val_t gram_build_vp(el_val_t verb, el_val_t aux, el_val_t profile) {
if (str_eq(aux, EL_STR(""))) {
return verb;
}
return el_str_concat(el_str_concat(aux, EL_STR(" ")), verb);
return 0;
}
el_val_t gram_question_strategy(el_val_t profile) {
el_val_t code = lang_get(profile, EL_STR("code"));
if (str_eq(code, EL_STR("en"))) {
return EL_STR("do-support");
}
if (str_eq(code, EL_STR("ja"))) {
return EL_STR("particle");
}
if (str_eq(code, EL_STR("zh"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("es"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("fr"))) {
return EL_STR("inversion");
}
if (str_eq(code, EL_STR("de"))) {
return EL_STR("inversion");
}
if (str_eq(code, EL_STR("ar"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("hi"))) {
return EL_STR("particle");
}
if (str_eq(code, EL_STR("ru"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("fi"))) {
return EL_STR("particle");
}
if (str_eq(code, EL_STR("sw"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("la"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("he"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("grc"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("ang"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("sa"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("got"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("non"))) {
return EL_STR("intonation");
}
if (str_eq(code, EL_STR("enm"))) {
return EL_STR("do-support");
}
if (str_eq(code, EL_STR("pi"))) {
return EL_STR("intonation");
}
return EL_STR("intonation");
return 0;
}
el_val_t is_pronoun(el_val_t word) {
if (str_eq(word, EL_STR("I"))) {
return 1;
}
if (str_eq(word, EL_STR("you"))) {
return 1;
}
if (str_eq(word, EL_STR("he"))) {
return 1;
}
if (str_eq(word, EL_STR("she"))) {
return 1;
}
if (str_eq(word, EL_STR("it"))) {
return 1;
}
if (str_eq(word, EL_STR("we"))) {
return 1;
}
if (str_eq(word, EL_STR("they"))) {
return 1;
}
if (str_eq(word, EL_STR("me"))) {
return 1;
}
if (str_eq(word, EL_STR("him"))) {
return 1;
}
if (str_eq(word, EL_STR("her"))) {
return 1;
}
if (str_eq(word, EL_STR("us"))) {
return 1;
}
if (str_eq(word, EL_STR("them"))) {
return 1;
}
return 0;
return 0;
}
el_val_t build_np(el_val_t referent, el_val_t slots) {
if (is_pronoun(referent)) {
return make_node1(EL_STR("NP"), make_leaf(EL_STR("Pron"), referent));
}
el_val_t parts = str_split(referent, EL_STR(" "));
el_val_t np = native_list_len(parts);
if (np == 1) {
return make_node1(EL_STR("NP"), make_leaf(EL_STR("N"), referent));
}
if (np == 2) {
el_val_t det = native_list_get(parts, 0);
el_val_t noun = native_list_get(parts, 1);
return make_node2(EL_STR("NP"), make_leaf(EL_STR("Det"), det), make_leaf(EL_STR("N"), noun));
}
if (np == 3) {
el_val_t det = native_list_get(parts, 0);
el_val_t adj = native_list_get(parts, 1);
el_val_t noun = native_list_get(parts, 2);
return make_node3(EL_STR("NP"), make_leaf(EL_STR("Det"), det), make_leaf(EL_STR("Adj"), adj), make_leaf(EL_STR("N"), noun));
}
return make_node1(EL_STR("NP"), make_leaf(EL_STR("N"), referent));
return 0;
}
el_val_t build_pp(el_val_t loc) {
el_val_t parts = str_split(loc, EL_STR(" "));
el_val_t n = native_list_len(parts);
if (n < 2) {
return make_leaf(EL_STR("PP"), loc);
}
el_val_t prep = native_list_get(parts, 0);
el_val_t np_parts = native_list_empty();
el_val_t i = 1;
while (i < n) {
np_parts = native_list_append(np_parts, native_list_get(parts, i));
i = (i + 1);
}
el_val_t np_str = str_join(np_parts, EL_STR(" "));
el_val_t np_tree = build_np(np_str, native_list_empty());
return make_node2(EL_STR("PP"), make_leaf(EL_STR("P"), prep), np_tree);
return 0;
}
el_val_t build_vp_body(el_val_t slots) {
el_val_t verb_surf = slots_get(slots, EL_STR("verb_surf"));
el_val_t patient = slots_get(slots, EL_STR("patient"));
el_val_t loc = slots_get(slots, EL_STR("location"));
if (!str_eq(patient, EL_STR(""))) {
el_val_t obj_np = build_np(patient, slots);
if (!str_eq(loc, EL_STR(""))) {
el_val_t pp = build_pp(loc);
return make_node3(EL_STR("VP"), make_leaf(EL_STR("V"), verb_surf), obj_np, pp);
}
return make_node2(EL_STR("VP"), make_leaf(EL_STR("V"), verb_surf), obj_np);
}
if (!str_eq(loc, EL_STR(""))) {
el_val_t pp = build_pp(loc);
return make_node2(EL_STR("VP"), make_leaf(EL_STR("V"), verb_surf), pp);
}
return make_node1(EL_STR("VP"), make_leaf(EL_STR("V"), verb_surf));
return 0;
}
el_val_t build_vp_from_slots(el_val_t slots) {
el_val_t aux_surf = slots_get(slots, EL_STR("aux_surf"));
if (!str_eq(aux_surf, EL_STR(""))) {
el_val_t verb_surf = slots_get(slots, EL_STR("verb_surf"));
el_val_t patient = slots_get(slots, EL_STR("patient"));
el_val_t loc = slots_get(slots, EL_STR("location"));
if (!str_eq(patient, EL_STR(""))) {
el_val_t obj_np = build_np(patient, slots);
return make_node3(EL_STR("VP"), make_leaf(EL_STR("Aux"), aux_surf), make_leaf(EL_STR("V"), verb_surf), obj_np);
}
return make_node2(EL_STR("VP"), make_leaf(EL_STR("Aux"), aux_surf), make_leaf(EL_STR("V"), verb_surf));
}
return build_vp_body(slots);
return 0;
}
el_val_t generate_tree(el_val_t rule_id_str, el_val_t slots) {
el_val_t rule = find_rule(rule_id_str);
el_val_t n = native_list_len(rule);
if (n == 0) {
return make_leaf(EL_STR("ERR"), EL_STR("unknown-rule"));
}
el_val_t lhs = native_list_get(rule, 1);
if (str_eq(rule_id_str, EL_STR("S-DECL"))) {
el_val_t agent = slots_get(slots, EL_STR("agent"));
el_val_t np_tree = build_np(agent, slots);
el_val_t vp_tree = build_vp_from_slots(slots);
return make_node2(EL_STR("S"), np_tree, vp_tree);
}
if (str_eq(rule_id_str, EL_STR("S-QUEST"))) {
el_val_t agent = slots_get(slots, EL_STR("agent"));
el_val_t np_tree = build_np(agent, slots);
el_val_t vp_tree = build_vp_body(slots);
el_val_t aux_surf = slots_get(slots, EL_STR("aux_surf"));
return make_node3(EL_STR("S"), make_leaf(EL_STR("Aux"), aux_surf), np_tree, vp_tree);
}
if (str_eq(rule_id_str, EL_STR("S-IMP"))) {
el_val_t vp_tree = build_vp_from_slots(slots);
return make_node1(EL_STR("S"), vp_tree);
}
return make_leaf(lhs, EL_STR("?"));
return 0;
}
-38
View File
@@ -1,38 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn slots_get(slots: [String], key: String) -> String
extern fn slots_set(slots: [String], key: String, val: String) -> [String]
extern fn make_slots(k0: String, v0: String) -> [String]
extern fn make_slots2(k0: String, v0: String, k1: String, v1: String) -> [String]
extern fn make_slots3(k0: String, v0: String, k1: String, v1: String, k2: String, v2: String) -> [String]
extern fn make_slots4(k0: String, v0: String, k1: String, v1: String, k2: String, v2: String, k3: String, v3: String) -> [String]
extern fn make_slots5(k0: String, v0: String, k1: String, v1: String, k2: String, v2: String, k3: String, v3: String, k4: String, v4: String) -> [String]
extern fn rule_id(rule: [String]) -> String
extern fn rule_lhs(rule: [String]) -> String
extern fn rule_rhs_len(rule: [String]) -> Int
extern fn rule_rhs(rule: [String], idx: Int) -> String
extern fn make_rule(id: String, lhs: String, r0: String) -> [String]
extern fn make_rule2(id: String, lhs: String, r0: String, r1: String) -> [String]
extern fn make_rule3(id: String, lhs: String, r0: String, r1: String, r2: String) -> [String]
extern fn make_rule4(id: String, lhs: String, r0: String, r1: String, r2: String, r3: String) -> [String]
extern fn build_rules() -> [[String]]
extern fn get_rules() -> [[String]]
extern fn find_rule(rule_id_str: String) -> [String]
extern fn make_leaf(label: String, word: String) -> String
extern fn make_node1(label: String, child0: String) -> String
extern fn make_node2(label: String, child0: String, child1: String) -> String
extern fn make_node3(label: String, child0: String, child1: String, child2: String) -> String
extern fn make_node4(label: String, child0: String, child1: String, child2: String, child3: String) -> String
extern fn nlg_is_ws(c: String) -> Bool
extern fn skip_ws(s: String, pos: Int) -> Int
extern fn scan_token(s: String, start: Int) -> [String]
extern fn render_tree(tree: String) -> String
extern fn gram_word_order(profile: [String]) -> String
extern fn gram_order_constituents(subj: String, verb: String, obj: String, profile: [String]) -> String
extern fn gram_build_vp(verb: String, aux: String, profile: [String]) -> String
extern fn gram_question_strategy(profile: [String]) -> String
extern fn is_pronoun(word: String) -> Bool
extern fn build_np(referent: String, slots: [String]) -> String
extern fn build_pp(loc: String) -> String
extern fn build_vp_body(slots: [String]) -> String
extern fn build_vp_from_slots(slots: [String]) -> String
extern fn generate_tree(rule_id_str: String, slots: [String]) -> String
-72
View File
@@ -1,72 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t imprint_current(void);
el_val_t imprint_load(el_val_t imprint_id);
el_val_t imprint_respond(el_val_t input, el_val_t imprint_id);
el_val_t imprint_surface_knowledge(el_val_t query, el_val_t imprint_id);
el_val_t imprint_surface_memory_read(el_val_t query);
el_val_t imprint_unload(void);
el_val_t imprint_current(void) {
el_val_t id = state_get(EL_STR("active_imprint_id"));
return ({ el_val_t _if_result_1 = 0; if (str_eq(id, EL_STR(""))) { _if_result_1 = (EL_STR("base")); } else { _if_result_1 = (id); } _if_result_1; });
return 0;
}
el_val_t imprint_load(el_val_t imprint_id) {
el_val_t label = el_str_concat(EL_STR("imprint:"), imprint_id);
el_val_t results = engram_search_json(label, 1);
if (str_eq(results, EL_STR(""))) {
return el_str_concat(el_str_concat(EL_STR("{\"ok\":false,\"error\":\"imprint not found: "), imprint_id), EL_STR("\"}"));
}
if (str_eq(results, EL_STR("[]"))) {
return el_str_concat(el_str_concat(EL_STR("{\"ok\":false,\"error\":\"imprint not found: "), imprint_id), EL_STR("\"}"));
}
el_val_t found_label = json_get(results, EL_STR("label"));
if (str_eq(found_label, label)) {
state_set(EL_STR("active_imprint_id"), imprint_id);
return el_str_concat(el_str_concat(EL_STR("{\"ok\":true,\"id\":\""), imprint_id), EL_STR("\"}"));
}
return el_str_concat(el_str_concat(EL_STR("{\"ok\":false,\"error\":\"imprint not found: "), imprint_id), EL_STR("\"}"));
return 0;
}
el_val_t imprint_respond(el_val_t input, el_val_t imprint_id) {
if (str_eq(imprint_id, EL_STR("base"))) {
return input;
}
if (str_eq(imprint_id, EL_STR(""))) {
return input;
}
el_val_t current = imprint_current();
if (str_eq(current, imprint_id)) {
return el_str_concat(el_str_concat(el_str_concat(input, EL_STR(" [imprint:")), imprint_id), EL_STR(" active]"));
}
return input;
return 0;
}
el_val_t imprint_surface_knowledge(el_val_t query, el_val_t imprint_id) {
if (str_eq(imprint_id, EL_STR("base"))) {
return engram_search_json(query, 10);
}
if (str_eq(imprint_id, EL_STR(""))) {
return engram_search_json(query, 10);
}
el_val_t scoped_query = el_str_concat(el_str_concat(query, EL_STR(" domain:")), imprint_id);
return engram_search_json(scoped_query, 10);
return 0;
}
el_val_t imprint_surface_memory_read(el_val_t query) {
return engram_search_json(query, 10);
return 0;
}
el_val_t imprint_unload(void) {
state_set(EL_STR("active_imprint_id"), EL_STR(""));
return 0;
}
-7
View File
@@ -1,7 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn imprint_current() -> String
extern fn imprint_load(imprint_id: String) -> String
extern fn imprint_respond(input: String, imprint_id: String) -> String
extern fn imprint_surface_knowledge(query: String, imprint_id: String) -> String
extern fn imprint_surface_memory_read(query: String) -> String
extern fn imprint_unload() -> Void
-394
View File
@@ -1,394 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t lang_profile(el_val_t code, el_val_t word_order, el_val_t morph_type, el_val_t has_case, el_val_t has_gender, el_val_t script_dir, el_val_t agreement, el_val_t null_subject);
el_val_t lang_get(el_val_t profile, el_val_t key);
el_val_t lang_profile_en(void);
el_val_t lang_profile_ja(void);
el_val_t lang_profile_ar(void);
el_val_t lang_profile_zh(void);
el_val_t lang_profile_de(void);
el_val_t lang_profile_es(void);
el_val_t lang_profile_fi(void);
el_val_t lang_profile_sw(void);
el_val_t lang_profile_hi(void);
el_val_t lang_profile_ru(void);
el_val_t lang_profile_fr(void);
el_val_t lang_profile_la(void);
el_val_t lang_profile_he(void);
el_val_t lang_profile_sa(void);
el_val_t lang_profile_got(void);
el_val_t lang_profile_non(void);
el_val_t lang_profile_enm(void);
el_val_t lang_profile_pi(void);
el_val_t lang_profile_grc(void);
el_val_t lang_profile_ang(void);
el_val_t lang_profile_fro(void);
el_val_t lang_profile_goh(void);
el_val_t lang_profile_sga(void);
el_val_t lang_profile_txb(void);
el_val_t lang_profile_peo(void);
el_val_t lang_profile_akk(void);
el_val_t lang_profile_uga(void);
el_val_t lang_profile_egy(void);
el_val_t lang_profile_sux(void);
el_val_t lang_profile_gez(void);
el_val_t lang_profile_cop(void);
el_val_t lang_from_code(el_val_t code);
el_val_t lang_default(void);
el_val_t lang_is_isolating(el_val_t profile);
el_val_t lang_is_agglutinative(el_val_t profile);
el_val_t lang_is_fusional(el_val_t profile);
el_val_t lang_is_polysynthetic(el_val_t profile);
el_val_t lang_is_rtl(el_val_t profile);
el_val_t lang_has_null_subject(el_val_t profile);
el_val_t lang_has_case(el_val_t profile);
el_val_t lang_has_gender(el_val_t profile);
el_val_t lang_word_order(el_val_t profile);
el_val_t lang_code(el_val_t profile);
el_val_t lang_profile(el_val_t code, el_val_t word_order, el_val_t morph_type, el_val_t has_case, el_val_t has_gender, el_val_t script_dir, el_val_t agreement, el_val_t null_subject) {
el_val_t r = native_list_empty();
r = native_list_append(r, EL_STR("code"));
r = native_list_append(r, code);
r = native_list_append(r, EL_STR("word_order"));
r = native_list_append(r, word_order);
r = native_list_append(r, EL_STR("morph_type"));
r = native_list_append(r, morph_type);
r = native_list_append(r, EL_STR("has_case"));
r = native_list_append(r, has_case);
r = native_list_append(r, EL_STR("has_gender"));
r = native_list_append(r, has_gender);
r = native_list_append(r, EL_STR("script_dir"));
r = native_list_append(r, script_dir);
r = native_list_append(r, EL_STR("agreement"));
r = native_list_append(r, agreement);
r = native_list_append(r, EL_STR("null_subject"));
r = native_list_append(r, null_subject);
return r;
return 0;
}
el_val_t lang_get(el_val_t profile, el_val_t key) {
el_val_t n = native_list_len(profile);
el_val_t i = 0;
while (i < (n - 1)) {
el_val_t k = native_list_get(profile, i);
if (str_eq(k, key)) {
return native_list_get(profile, (i + 1));
}
i = (i + 2);
}
return EL_STR("");
return 0;
}
el_val_t lang_profile_en(void) {
return lang_profile(EL_STR("en"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person"), EL_STR("false"));
return 0;
}
el_val_t lang_profile_ja(void) {
return lang_profile(EL_STR("ja"), EL_STR("SOV"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("none"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_ar(void) {
return lang_profile(EL_STR("ar"), EL_STR("VSO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("rtl"), EL_STR("number;person;gender;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_zh(void) {
return lang_profile(EL_STR("zh"), EL_STR("SVO"), EL_STR("isolating"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("none"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_de(void) {
return lang_profile(EL_STR("de"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
return 0;
}
el_val_t lang_profile_es(void) {
return lang_profile(EL_STR("es"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_fi(void) {
return lang_profile(EL_STR("fi"), EL_STR("SOV"), EL_STR("agglutinative"), EL_STR("true"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person;case"), EL_STR("false"));
return 0;
}
el_val_t lang_profile_sw(void) {
return lang_profile(EL_STR("sw"), EL_STR("SVO"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("noun-class;number"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_hi(void) {
return lang_profile(EL_STR("hi"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_ru(void) {
return lang_profile(EL_STR("ru"), EL_STR("free"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
return 0;
}
el_val_t lang_profile_fr(void) {
return lang_profile(EL_STR("fr"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("false"));
return 0;
}
el_val_t lang_profile_la(void) {
return lang_profile(EL_STR("la"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_he(void) {
return lang_profile(EL_STR("he"), EL_STR("SVO"), EL_STR("semitic"), EL_STR("true"), EL_STR("false"), EL_STR("rtl"), EL_STR("number;person;gender"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_sa(void) {
return lang_profile(EL_STR("sa"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_got(void) {
return lang_profile(EL_STR("got"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_non(void) {
return lang_profile(EL_STR("non"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_enm(void) {
return lang_profile(EL_STR("enm"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person"), EL_STR("false"));
return 0;
}
el_val_t lang_profile_pi(void) {
return lang_profile(EL_STR("pi"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_grc(void) {
return lang_profile(EL_STR("grc"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case;aspect"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_ang(void) {
return lang_profile(EL_STR("ang"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_fro(void) {
return lang_profile(EL_STR("fro"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
return 0;
}
el_val_t lang_profile_goh(void) {
return lang_profile(EL_STR("goh"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_sga(void) {
return lang_profile(EL_STR("sga"), EL_STR("VSO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_txb(void) {
return lang_profile(EL_STR("txb"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
return 0;
}
el_val_t lang_profile_peo(void) {
return lang_profile(EL_STR("peo"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person;case"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_akk(void) {
return lang_profile(EL_STR("akk"), EL_STR("VSO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
return 0;
}
el_val_t lang_profile_uga(void) {
return lang_profile(EL_STR("uga"), EL_STR("VSO"), EL_STR("semitic"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
return 0;
}
el_val_t lang_profile_egy(void) {
return lang_profile(EL_STR("egy"), EL_STR("SVO"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_sux(void) {
return lang_profile(EL_STR("sux"), EL_STR("SOV"), EL_STR("agglutinative"), EL_STR("true"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_gez(void) {
return lang_profile(EL_STR("gez"), EL_STR("SOV"), EL_STR("semitic"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("true"));
return 0;
}
el_val_t lang_profile_cop(void) {
return lang_profile(EL_STR("cop"), EL_STR("SVO"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("false"));
return 0;
}
el_val_t lang_from_code(el_val_t code) {
if (str_eq(code, EL_STR("en"))) {
return lang_profile_en();
}
if (str_eq(code, EL_STR("ja"))) {
return lang_profile_ja();
}
if (str_eq(code, EL_STR("ar"))) {
return lang_profile_ar();
}
if (str_eq(code, EL_STR("zh"))) {
return lang_profile_zh();
}
if (str_eq(code, EL_STR("de"))) {
return lang_profile_de();
}
if (str_eq(code, EL_STR("es"))) {
return lang_profile_es();
}
if (str_eq(code, EL_STR("fi"))) {
return lang_profile_fi();
}
if (str_eq(code, EL_STR("sw"))) {
return lang_profile_sw();
}
if (str_eq(code, EL_STR("hi"))) {
return lang_profile_hi();
}
if (str_eq(code, EL_STR("ru"))) {
return lang_profile_ru();
}
if (str_eq(code, EL_STR("fr"))) {
return lang_profile_fr();
}
if (str_eq(code, EL_STR("la"))) {
return lang_profile_la();
}
if (str_eq(code, EL_STR("he"))) {
return lang_profile_he();
}
if (str_eq(code, EL_STR("grc"))) {
return lang_profile_grc();
}
if (str_eq(code, EL_STR("ang"))) {
return lang_profile_ang();
}
if (str_eq(code, EL_STR("sa"))) {
return lang_profile_sa();
}
if (str_eq(code, EL_STR("got"))) {
return lang_profile_got();
}
if (str_eq(code, EL_STR("non"))) {
return lang_profile_non();
}
if (str_eq(code, EL_STR("enm"))) {
return lang_profile_enm();
}
if (str_eq(code, EL_STR("pi"))) {
return lang_profile_pi();
}
if (str_eq(code, EL_STR("fro"))) {
return lang_profile_fro();
}
if (str_eq(code, EL_STR("goh"))) {
return lang_profile_goh();
}
if (str_eq(code, EL_STR("sga"))) {
return lang_profile_sga();
}
if (str_eq(code, EL_STR("txb"))) {
return lang_profile_txb();
}
if (str_eq(code, EL_STR("peo"))) {
return lang_profile_peo();
}
if (str_eq(code, EL_STR("akk"))) {
return lang_profile_akk();
}
if (str_eq(code, EL_STR("uga"))) {
return lang_profile_uga();
}
if (str_eq(code, EL_STR("egy"))) {
return lang_profile_egy();
}
if (str_eq(code, EL_STR("sux"))) {
return lang_profile_sux();
}
if (str_eq(code, EL_STR("gez"))) {
return lang_profile_gez();
}
if (str_eq(code, EL_STR("cop"))) {
return lang_profile_cop();
}
return lang_profile_en();
return 0;
}
el_val_t lang_default(void) {
return lang_profile_en();
return 0;
}
el_val_t lang_is_isolating(el_val_t profile) {
return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("isolating"));
return 0;
}
el_val_t lang_is_agglutinative(el_val_t profile) {
return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("agglutinative"));
return 0;
}
el_val_t lang_is_fusional(el_val_t profile) {
return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("fusional"));
return 0;
}
el_val_t lang_is_polysynthetic(el_val_t profile) {
return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("polysynthetic"));
return 0;
}
el_val_t lang_is_rtl(el_val_t profile) {
return str_eq(lang_get(profile, EL_STR("script_dir")), EL_STR("rtl"));
return 0;
}
el_val_t lang_has_null_subject(el_val_t profile) {
return str_eq(lang_get(profile, EL_STR("null_subject")), EL_STR("true"));
return 0;
}
el_val_t lang_has_case(el_val_t profile) {
return str_eq(lang_get(profile, EL_STR("has_case")), EL_STR("true"));
return 0;
}
el_val_t lang_has_gender(el_val_t profile) {
return str_eq(lang_get(profile, EL_STR("has_gender")), EL_STR("true"));
return 0;
}
el_val_t lang_word_order(el_val_t profile) {
return lang_get(profile, EL_STR("word_order"));
return 0;
}
el_val_t lang_code(el_val_t profile) {
return lang_get(profile, EL_STR("code"));
return 0;
}
-46
View File
@@ -1,46 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn lang_profile(code: String, word_order: String, morph_type: String, has_case: String, has_gender: String, script_dir: String, agreement: String, null_subject: String) -> [String]
extern fn lang_get(profile: [String], key: String) -> String
extern fn lang_profile_en() -> [String]
extern fn lang_profile_ja() -> [String]
extern fn lang_profile_ar() -> [String]
extern fn lang_profile_zh() -> [String]
extern fn lang_profile_de() -> [String]
extern fn lang_profile_es() -> [String]
extern fn lang_profile_fi() -> [String]
extern fn lang_profile_sw() -> [String]
extern fn lang_profile_hi() -> [String]
extern fn lang_profile_ru() -> [String]
extern fn lang_profile_fr() -> [String]
extern fn lang_profile_la() -> [String]
extern fn lang_profile_he() -> [String]
extern fn lang_profile_sa() -> [String]
extern fn lang_profile_got() -> [String]
extern fn lang_profile_non() -> [String]
extern fn lang_profile_enm() -> [String]
extern fn lang_profile_pi() -> [String]
extern fn lang_profile_grc() -> [String]
extern fn lang_profile_ang() -> [String]
extern fn lang_profile_fro() -> [String]
extern fn lang_profile_goh() -> [String]
extern fn lang_profile_sga() -> [String]
extern fn lang_profile_txb() -> [String]
extern fn lang_profile_peo() -> [String]
extern fn lang_profile_akk() -> [String]
extern fn lang_profile_uga() -> [String]
extern fn lang_profile_egy() -> [String]
extern fn lang_profile_sux() -> [String]
extern fn lang_profile_gez() -> [String]
extern fn lang_profile_cop() -> [String]
extern fn lang_from_code(code: String) -> [String]
extern fn lang_default() -> [String]
extern fn lang_is_isolating(profile: [String]) -> Bool
extern fn lang_is_agglutinative(profile: [String]) -> Bool
extern fn lang_is_fusional(profile: [String]) -> Bool
extern fn lang_is_polysynthetic(profile: [String]) -> Bool
extern fn lang_is_rtl(profile: [String]) -> Bool
extern fn lang_has_null_subject(profile: [String]) -> Bool
extern fn lang_has_case(profile: [String]) -> Bool
extern fn lang_has_gender(profile: [String]) -> Bool
extern fn lang_word_order(profile: [String]) -> String
extern fn lang_code(profile: [String]) -> String
-225
View File
@@ -1,225 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t tier_working(void);
el_val_t tier_episodic(void);
el_val_t tier_canonical(void);
el_val_t mem_store(el_val_t content, el_val_t label, el_val_t tags);
el_val_t mem_remember(el_val_t content, el_val_t tags);
el_val_t mem_recall(el_val_t query, el_val_t depth);
el_val_t mem_search(el_val_t query, el_val_t limit);
el_val_t mem_strengthen(el_val_t node_id);
el_val_t mem_tombstone(el_val_t node_id);
el_val_t mem_forget(el_val_t node_id);
el_val_t mem_consolidate(void);
el_val_t mem_save(el_val_t path);
el_val_t mem_load(el_val_t path);
el_val_t mem_boot_count_get(void);
el_val_t mem_boot_count_inc(void);
el_val_t mem_emit_state_event(el_val_t trigger, el_val_t kind, el_val_t content);
el_val_t tier_working(void) {
return EL_STR("Working");
return 0;
}
el_val_t tier_episodic(void) {
return EL_STR("Episodic");
return 0;
}
el_val_t tier_canonical(void) {
return EL_STR("Canonical");
return 0;
}
el_val_t mem_store(el_val_t content, el_val_t label, el_val_t tags) {
el_val_t id = engram_node_full(content, EL_STR("Memory"), label, el_from_float(0.5), el_from_float(0.5), el_from_float(0.8), EL_STR("Working"), tags);
if (str_eq(id, EL_STR(""))) {
println(el_str_concat(EL_STR("[memory] write rejected by engram (empty id): label="), label));
return EL_STR("");
}
el_val_t readback = engram_get_node_json(id);
if (str_eq(readback, EL_STR("")) || str_eq(readback, EL_STR("{}"))) {
println(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("[memory] WRITE VERIFY FAILED: label="), label), EL_STR(" id=")), id), EL_STR(" \xe2\x80\x94 node absent after write")));
return EL_STR("");
}
println(el_str_concat(el_str_concat(EL_STR("[memory] write verified: "), id), EL_STR(" ok")));
return id;
return 0;
}
el_val_t mem_remember(el_val_t content, el_val_t tags) {
return mem_store(content, EL_STR("soul-memory"), tags);
return 0;
}
el_val_t mem_recall(el_val_t query, el_val_t depth) {
return engram_activate_json(query, depth);
return 0;
}
el_val_t mem_search(el_val_t query, el_val_t limit) {
return engram_search_json(query, limit);
return 0;
}
el_val_t mem_strengthen(el_val_t node_id) {
engram_strengthen(node_id);
return 0;
}
el_val_t mem_tombstone(el_val_t node_id) {
el_val_t tags = EL_STR("[\"Tombstone\",\"status:deleted\"]");
el_val_t marker = engram_node_full(node_id, EL_STR("Tombstone"), el_str_concat(EL_STR("tombstone:"), node_id), el_from_float(0.01), el_from_float(0.01), el_from_float(1.0), EL_STR("Episodic"), tags);
if (!str_eq(marker, EL_STR(""))) {
engram_connect(marker, node_id, el_from_float(1.0), EL_STR("tombstones"));
}
return marker;
return 0;
}
el_val_t mem_forget(el_val_t node_id) {
el_val_t _marker = mem_tombstone(node_id);
return 0;
}
el_val_t mem_consolidate(void) {
el_val_t scanned = engram_node_count();
el_val_t total_edges = engram_edge_count();
el_val_t strengthened = 0;
el_val_t wm_top = engram_wm_top_json(10);
el_val_t wm_len = json_array_len(wm_top);
el_val_t wi = 0;
while (wi < wm_len) {
el_val_t wm_node = json_array_get(wm_top, wi);
el_val_t wm_id = json_get(wm_node, EL_STR("id"));
if (!str_eq(wm_id, EL_STR(""))) {
engram_strengthen(wm_id);
strengthened = (strengthened + 1);
}
wi = (wi + 1);
}
el_val_t scan_result = engram_scan_nodes_json(50, 0);
el_val_t scan_len = json_array_len(scan_result);
el_val_t si = 0;
while (si < scan_len) {
el_val_t s_node = json_array_get(scan_result, si);
el_val_t s_tier = json_get(s_node, EL_STR("tier"));
el_val_t s_id = json_get(s_node, EL_STR("id"));
if (str_eq(s_tier, EL_STR("Canonical")) && !str_eq(s_id, EL_STR(""))) {
engram_strengthen(s_id);
strengthened = (strengthened + 1);
}
si = (si + 1);
}
el_val_t total_nodes = engram_node_count();
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"scanned\":"), int_to_str(scanned)), EL_STR(",\"total_nodes\":")), int_to_str(total_nodes)), EL_STR(",\"total_edges\":")), int_to_str(total_edges)), EL_STR(",\"strengthened\":")), int_to_str(strengthened)), EL_STR("}"));
return 0;
}
el_val_t mem_save(el_val_t path) {
el_val_t saved = engram_save(path);
if (saved == 0) {
println(el_str_concat(el_str_concat(EL_STR("[memory] mem_save: engram_save failed for "), path), EL_STR(" \xe2\x80\x94 snapshot may be incomplete")));
}
return 0;
}
el_val_t mem_load(el_val_t path) {
engram_load(path);
return 0;
}
el_val_t mem_boot_count_get(void) {
el_val_t results = engram_search_json(EL_STR("soul:boot_count"), 3);
if (str_eq(results, EL_STR(""))) {
return 0;
}
if (str_eq(results, EL_STR("[]"))) {
return 0;
}
el_val_t node = json_array_get(results, 0);
el_val_t content = json_get(node, EL_STR("content"));
el_val_t prefix = EL_STR("soul:boot_count:");
if (!str_starts_with(content, prefix)) {
return 0;
}
el_val_t num_str = str_slice(content, str_len(prefix), str_len(content));
return str_to_int(num_str);
return 0;
}
el_val_t mem_boot_count_inc(void) {
el_val_t current = mem_boot_count_get();
el_val_t next = (current + 1);
el_val_t old_results = engram_search_json(EL_STR("soul:boot_count"), 50);
if (!str_eq(old_results, EL_STR("")) && !str_eq(old_results, EL_STR("[]"))) {
el_val_t old_len = json_array_len(old_results);
el_val_t oi = 0;
while (oi < old_len) {
el_val_t old_node = json_array_get(old_results, oi);
el_val_t old_id = json_get(old_node, EL_STR("id"));
if (!str_eq(old_id, EL_STR(""))) {
engram_forget(old_id);
}
oi = (oi + 1);
}
}
el_val_t content = el_str_concat(EL_STR("soul:boot_count:"), int_to_str(next));
el_val_t tags = EL_STR("[\"soul-meta\",\"boot-counter\"]");
el_val_t boot_node_id = engram_node_full(content, EL_STR("Memory"), EL_STR("soul:boot_count"), el_from_float(0.55), el_from_float(0.2), el_from_float(1.0), EL_STR("Working"), tags);
if (str_eq(boot_node_id, EL_STR(""))) {
println(el_str_concat(el_str_concat(EL_STR("[memory] mem_boot_count_inc: write rejected (empty id) \xe2\x80\x94 boot counter node lost (count="), int_to_str(next)), EL_STR(")")));
return next;
}
el_val_t boot_readback = engram_get_node_json(boot_node_id);
if (str_eq(boot_readback, EL_STR("")) || str_eq(boot_readback, EL_STR("{}"))) {
println(el_str_concat(el_str_concat(el_str_concat(EL_STR("[memory] mem_boot_count_inc: WRITE VERIFY FAILED id="), boot_node_id), EL_STR(" count=")), int_to_str(next)));
}
el_val_t wb_url = env(EL_STR("ENGRAM_URL"));
el_val_t wb_key = env(EL_STR("ENGRAM_API_KEY"));
if (!str_eq(wb_url, EL_STR("")) && !str_eq(wb_key, EL_STR(""))) {
el_val_t auth_body = el_str_concat(el_str_concat(EL_STR("{\"_auth\":\""), json_safe(wb_key)), EL_STR("\"}"));
el_val_t srv_old = http_get(el_str_concat(wb_url, EL_STR("/api/search?q=soul:boot_count&limit=20")));
if (!str_eq(srv_old, EL_STR("")) && !str_eq(srv_old, EL_STR("[]"))) {
el_val_t srv_len = json_array_len(srv_old);
el_val_t si = 0;
while (si < srv_len) {
el_val_t srv_node = json_array_get(srv_old, si);
el_val_t srv_content = json_get(srv_node, EL_STR("content"));
if (str_starts_with(srv_content, EL_STR("soul:boot_count:"))) {
el_val_t srv_id = json_get(srv_node, EL_STR("id"));
if (!str_eq(srv_id, EL_STR(""))) {
http_delete_json(el_str_concat(el_str_concat(wb_url, EL_STR("/api/nodes/")), srv_id), auth_body);
}
}
si = (si + 1);
}
}
el_val_t wb_body = el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"content\":\""), content), EL_STR("\",\"node_type\":\"Memory\",\"label\":\"soul:boot_count\",\"salience\":0.55,\"importance\":0.2,\"tier\":\"Working\",\"tags\":\"[\\\"soul-meta\\\",\\\"boot-counter\\\"]\",\"_auth\":\"")), json_safe(wb_key)), EL_STR("\"}"));
el_val_t wb_resp = http_post_json(el_str_concat(wb_url, EL_STR("/api/nodes")), wb_body);
if (str_contains(wb_resp, EL_STR("\"error\""))) {
println(el_str_concat(EL_STR("[memory] mem_boot_count_inc: HTTP write-back failed (count in-memory only): "), wb_resp));
}
}
return next;
return 0;
}
el_val_t mem_emit_state_event(el_val_t trigger, el_val_t kind, el_val_t content) {
el_val_t boot = mem_boot_count_get();
el_val_t ts = time_now();
el_val_t safe_trigger = str_replace(trigger, EL_STR("\""), EL_STR("'"));
el_val_t safe_content = str_replace(content, EL_STR("\""), EL_STR("'"));
el_val_t payload = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"trigger\":\""), safe_trigger), EL_STR("\"")), EL_STR(",\"kind\":\"")), kind), EL_STR("\"")), EL_STR(",\"content\":\"")), safe_content), EL_STR("\"")), EL_STR(",\"boot\":")), int_to_str(boot)), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR("}"));
el_val_t tags = EL_STR("[\"internal-state\",\"pre-reasoning\",\"InternalStateEvent\"]");
el_val_t event_id = engram_node_full(payload, EL_STR("InternalStateEvent"), el_str_concat(EL_STR("state-event:"), kind), el_from_float(0.85), el_from_float(0.8), el_from_float(0.9), EL_STR("Episodic"), tags);
if (str_eq(event_id, EL_STR(""))) {
println(el_str_concat(EL_STR("[memory] mem_emit_state_event: write rejected (empty id): kind="), kind));
}
return event_id;
return 0;
}
-16
View File
@@ -1,16 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn tier_working() -> String
extern fn tier_episodic() -> String
extern fn tier_canonical() -> String
extern fn mem_store(content: String, label: String, tags: String) -> String
extern fn mem_remember(content: String, tags: String) -> String
extern fn mem_recall(query: String, depth: Int) -> String
extern fn mem_search(query: String, limit: Int) -> String
extern fn mem_strengthen(node_id: String) -> Void
extern fn mem_forget(node_id: String) -> Void
extern fn mem_consolidate() -> String
extern fn mem_save(path: String) -> Void
extern fn mem_load(path: String) -> Void
extern fn mem_boot_count_get() -> Int
extern fn mem_boot_count_inc() -> Int
extern fn mem_emit_state_event(trigger: String, kind: String, content: String) -> String
-641
View File
@@ -1,641 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t akk_str_ends(el_val_t s, el_val_t suf);
el_val_t akk_str_len(el_val_t s);
el_val_t akk_str_drop_last(el_val_t s, el_val_t n);
el_val_t akk_slot(el_val_t person, el_val_t number);
el_val_t akk_slot_g(el_val_t person, el_val_t gender, el_val_t number);
el_val_t akk_copula_present(el_val_t slot);
el_val_t akk_copula_stative(el_val_t slot);
el_val_t akk_is_copula(el_val_t verb);
el_val_t akk_conjugate_copula(el_val_t tense, el_val_t slot);
el_val_t akk_alaku_present(el_val_t slot);
el_val_t akk_alaku_perfect(el_val_t slot);
el_val_t akk_amaru_present(el_val_t slot);
el_val_t akk_amaru_perfect(el_val_t slot);
el_val_t akk_amaru_stative(el_val_t slot);
el_val_t akk_qabu_present(el_val_t slot);
el_val_t akk_qabu_perfect(el_val_t slot);
el_val_t akk_qabu_stative(el_val_t slot);
el_val_t akk_epesu_present(el_val_t slot);
el_val_t akk_epesu_perfect(el_val_t slot);
el_val_t akk_epesu_stative(el_val_t slot);
el_val_t akk_regular_present(el_val_t stem, el_val_t slot);
el_val_t akk_regular_perfect(el_val_t stem, el_val_t slot);
el_val_t akk_regular_stative(el_val_t stem, el_val_t slot);
el_val_t akk_known_verb(el_val_t verb, el_val_t tense, el_val_t slot);
el_val_t akk_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t akk_strip_nom(el_val_t noun);
el_val_t akk_is_fem(el_val_t noun);
el_val_t akk_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t akk_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t akk_map_canonical(el_val_t verb);
el_val_t akk_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t akk_str_len(el_val_t s) {
return str_len(s);
return 0;
}
el_val_t akk_str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t akk_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("plural"))) {
return 4;
}
return 0;
}
if (str_eq(person, EL_STR("second"))) {
return 1;
}
if (str_eq(number, EL_STR("plural"))) {
return 5;
}
return 2;
return 0;
}
el_val_t akk_slot_g(el_val_t person, el_val_t gender, el_val_t number) {
el_val_t base = akk_slot(person, number);
if (str_eq(person, EL_STR("third"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gender, EL_STR("f"))) {
return 3;
}
}
}
return base;
return 0;
}
el_val_t akk_copula_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("aba\xc5\xa1\xc5\xa1i");
}
if (slot == 1) {
return EL_STR("taba\xc5\xa1\xc5\xa1i");
}
if (slot == 2) {
return EL_STR("iba\xc5\xa1\xc5\xa1i");
}
if (slot == 3) {
return EL_STR("iba\xc5\xa1\xc5\xa1i");
}
if (slot == 4) {
return EL_STR("niba\xc5\xa1\xc5\xa1i");
}
return EL_STR("iba\xc5\xa1\xc5\xa1\xc5\xab");
return 0;
}
el_val_t akk_copula_stative(el_val_t slot) {
if (slot == 0) {
return EL_STR("ba\xc5\xa1\xc4\x81ku");
}
if (slot == 1) {
return EL_STR("ba\xc5\xa1\xc4\x81ta");
}
if (slot == 2) {
return EL_STR("ba\xc5\xa1\xc4\xab");
}
if (slot == 3) {
return EL_STR("ba\xc5\xa1iat");
}
if (slot == 4) {
return EL_STR("ba\xc5\xa1\xc4\x81nu");
}
return EL_STR("ba\xc5\xa1\xc5\xab");
return 0;
}
el_val_t akk_is_copula(el_val_t verb) {
if (str_eq(verb, EL_STR("ba\xc5\xa1\xc3\xbb"))) {
return 1;
}
if (str_eq(verb, EL_STR("bashu"))) {
return 1;
}
if (str_eq(verb, EL_STR("be"))) {
return 1;
}
return 0;
return 0;
}
el_val_t akk_conjugate_copula(el_val_t tense, el_val_t slot) {
if (str_eq(tense, EL_STR("stative"))) {
return akk_copula_stative(slot);
}
return akk_copula_present(slot);
return 0;
}
el_val_t akk_alaku_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("allak");
}
if (slot == 1) {
return EL_STR("tallak");
}
if (slot == 2) {
return EL_STR("illak");
}
if (slot == 3) {
return EL_STR("tallak");
}
if (slot == 4) {
return EL_STR("nillak");
}
return EL_STR("illaku");
return 0;
}
el_val_t akk_alaku_perfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("ittalak");
}
if (slot == 1) {
return EL_STR("tattalak");
}
if (slot == 2) {
return EL_STR("ittalak");
}
if (slot == 3) {
return EL_STR("tattalak");
}
if (slot == 4) {
return EL_STR("nittalak");
}
return EL_STR("ittalku");
return 0;
}
el_val_t akk_amaru_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("ammar");
}
if (slot == 1) {
return EL_STR("tammar");
}
if (slot == 2) {
return EL_STR("immar");
}
if (slot == 3) {
return EL_STR("tammar");
}
if (slot == 4) {
return EL_STR("nimmar");
}
return EL_STR("immaru");
return 0;
}
el_val_t akk_amaru_perfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("amtamar");
}
if (slot == 1) {
return EL_STR("tamtamar");
}
if (slot == 2) {
return EL_STR("imtamar");
}
if (slot == 3) {
return EL_STR("tamtamar");
}
if (slot == 4) {
return EL_STR("nimtamar");
}
return EL_STR("imtamaru");
return 0;
}
el_val_t akk_amaru_stative(el_val_t slot) {
if (slot == 0) {
return EL_STR("amr\xc4\x81ku");
}
if (slot == 1) {
return EL_STR("amr\xc4\x81ta");
}
if (slot == 2) {
return EL_STR("amir");
}
if (slot == 3) {
return EL_STR("amrat");
}
if (slot == 4) {
return EL_STR("amr\xc4\x81nu");
}
return EL_STR("amr\xc5\xab");
return 0;
}
el_val_t akk_qabu_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("aqabbi");
}
if (slot == 1) {
return EL_STR("taqabbi");
}
if (slot == 2) {
return EL_STR("iqabbi");
}
if (slot == 3) {
return EL_STR("taqabbi");
}
if (slot == 4) {
return EL_STR("niqabbi");
}
return EL_STR("iqabb\xc3\xbb");
return 0;
}
el_val_t akk_qabu_perfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("aqtabi");
}
if (slot == 1) {
return EL_STR("taqtabi");
}
if (slot == 2) {
return EL_STR("iqtabi");
}
if (slot == 3) {
return EL_STR("taqtabi");
}
if (slot == 4) {
return EL_STR("niqtabi");
}
return EL_STR("iqtab\xc3\xbb");
return 0;
}
el_val_t akk_qabu_stative(el_val_t slot) {
if (slot == 0) {
return EL_STR("qab\xc4\x81ku");
}
if (slot == 1) {
return EL_STR("qab\xc4\x81ta");
}
if (slot == 2) {
return EL_STR("qabi");
}
if (slot == 3) {
return EL_STR("qabiat");
}
if (slot == 4) {
return EL_STR("qab\xc4\x81nu");
}
return EL_STR("qab\xc3\xbb");
return 0;
}
el_val_t akk_epesu_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("eppu\xc5\xa1");
}
if (slot == 1) {
return EL_STR("teppu\xc5\xa1");
}
if (slot == 2) {
return EL_STR("ieppu\xc5\xa1");
}
if (slot == 3) {
return EL_STR("teppu\xc5\xa1");
}
if (slot == 4) {
return EL_STR("neppu\xc5\xa1");
}
return EL_STR("ieppu\xc5\xa1u");
return 0;
}
el_val_t akk_epesu_perfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("ipte\xc5\xa1u");
}
if (slot == 1) {
return EL_STR("tapte\xc5\xa1u");
}
if (slot == 2) {
return EL_STR("ipte\xc5\xa1u");
}
if (slot == 3) {
return EL_STR("tapte\xc5\xa1u");
}
if (slot == 4) {
return EL_STR("nipte\xc5\xa1u");
}
return EL_STR("ipte\xc5\xa1\xc5\xab");
return 0;
}
el_val_t akk_epesu_stative(el_val_t slot) {
if (slot == 0) {
return EL_STR("ep\xc5\xa1\xc4\x81ku");
}
if (slot == 1) {
return EL_STR("ep\xc5\xa1\xc4\x81ta");
}
if (slot == 2) {
return EL_STR("epu\xc5\xa1");
}
if (slot == 3) {
return EL_STR("ep\xc5\xa1""at");
}
if (slot == 4) {
return EL_STR("ep\xc5\xa1\xc4\x81nu");
}
return EL_STR("ep\xc5\xa1\xc5\xab");
return 0;
}
el_val_t akk_regular_present(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(EL_STR("a"), stem);
}
if (slot == 1) {
return el_str_concat(EL_STR("ta"), stem);
}
if (slot == 2) {
return el_str_concat(EL_STR("i"), stem);
}
if (slot == 3) {
return el_str_concat(EL_STR("ta"), stem);
}
if (slot == 4) {
return el_str_concat(EL_STR("ni"), stem);
}
return el_str_concat(el_str_concat(EL_STR("i"), stem), EL_STR("u"));
return 0;
}
el_val_t akk_regular_perfect(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(EL_STR("a"), stem);
}
if (slot == 1) {
return el_str_concat(EL_STR("ta"), stem);
}
if (slot == 2) {
return el_str_concat(EL_STR("i"), stem);
}
if (slot == 3) {
return el_str_concat(EL_STR("ta"), stem);
}
if (slot == 4) {
return el_str_concat(EL_STR("ni"), stem);
}
return el_str_concat(el_str_concat(EL_STR("i"), stem), EL_STR("u"));
return 0;
}
el_val_t akk_regular_stative(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("\xc4\x81ku"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("\xc4\x81ta"));
}
if (slot == 2) {
return stem;
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("at"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("\xc4\x81nu"));
}
return el_str_concat(stem, EL_STR("\xc5\xab"));
return 0;
}
el_val_t akk_known_verb(el_val_t verb, el_val_t tense, el_val_t slot) {
if (str_eq(verb, EL_STR("ba\xc5\xa1\xc3\xbb"))) {
return akk_conjugate_copula(tense, slot);
}
if (str_eq(verb, EL_STR("bashu"))) {
return akk_conjugate_copula(tense, slot);
}
if (str_eq(verb, EL_STR("al\xc4\x81ku"))) {
if (str_eq(tense, EL_STR("perfect"))) {
return akk_alaku_perfect(slot);
}
if (str_eq(tense, EL_STR("stative"))) {
return akk_alaku_present(slot);
}
return akk_alaku_present(slot);
}
if (str_eq(verb, EL_STR("alaku"))) {
if (str_eq(tense, EL_STR("perfect"))) {
return akk_alaku_perfect(slot);
}
return akk_alaku_present(slot);
}
if (str_eq(verb, EL_STR("am\xc4\x81ru"))) {
if (str_eq(tense, EL_STR("perfect"))) {
return akk_amaru_perfect(slot);
}
if (str_eq(tense, EL_STR("stative"))) {
return akk_amaru_stative(slot);
}
return akk_amaru_present(slot);
}
if (str_eq(verb, EL_STR("amaru"))) {
if (str_eq(tense, EL_STR("perfect"))) {
return akk_amaru_perfect(slot);
}
if (str_eq(tense, EL_STR("stative"))) {
return akk_amaru_stative(slot);
}
return akk_amaru_present(slot);
}
if (str_eq(verb, EL_STR("qab\xc3\xbb"))) {
if (str_eq(tense, EL_STR("perfect"))) {
return akk_qabu_perfect(slot);
}
if (str_eq(tense, EL_STR("stative"))) {
return akk_qabu_stative(slot);
}
return akk_qabu_present(slot);
}
if (str_eq(verb, EL_STR("qabu"))) {
if (str_eq(tense, EL_STR("perfect"))) {
return akk_qabu_perfect(slot);
}
if (str_eq(tense, EL_STR("stative"))) {
return akk_qabu_stative(slot);
}
return akk_qabu_present(slot);
}
if (str_eq(verb, EL_STR("ep\xc4\x93\xc5\xa1u"))) {
if (str_eq(tense, EL_STR("perfect"))) {
return akk_epesu_perfect(slot);
}
if (str_eq(tense, EL_STR("stative"))) {
return akk_epesu_stative(slot);
}
return akk_epesu_present(slot);
}
if (str_eq(verb, EL_STR("epesu"))) {
if (str_eq(tense, EL_STR("perfect"))) {
return akk_epesu_perfect(slot);
}
if (str_eq(tense, EL_STR("stative"))) {
return akk_epesu_stative(slot);
}
return akk_epesu_present(slot);
}
return EL_STR("");
return 0;
}
el_val_t akk_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t slot = akk_slot(person, number);
if (akk_is_copula(verb)) {
return akk_conjugate_copula(tense, slot);
}
el_val_t known = akk_known_verb(verb, tense, slot);
if (!str_eq(known, EL_STR(""))) {
return known;
}
return verb;
return 0;
}
el_val_t akk_strip_nom(el_val_t noun) {
if (akk_str_ends(noun, EL_STR("um"))) {
return akk_str_drop_last(noun, 2);
}
if (akk_str_ends(noun, EL_STR("tum"))) {
return akk_str_drop_last(noun, 3);
}
return noun;
return 0;
}
el_val_t akk_is_fem(el_val_t noun) {
if (akk_str_ends(noun, EL_STR("tum"))) {
return 1;
}
if (akk_str_ends(noun, EL_STR("tam"))) {
return 1;
}
if (akk_str_ends(noun, EL_STR("tim"))) {
return 1;
}
return 0;
return 0;
}
el_val_t akk_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t fem = akk_is_fem(noun);
el_val_t stem = akk_strip_nom(noun);
if (str_eq(number, EL_STR("singular"))) {
if (fem) {
if (str_eq(gram_case, EL_STR("nom"))) {
return el_str_concat(stem, EL_STR("tum"));
}
if (str_eq(gram_case, EL_STR("acc"))) {
return el_str_concat(stem, EL_STR("tam"));
}
if (str_eq(gram_case, EL_STR("gen"))) {
return el_str_concat(stem, EL_STR("tim"));
}
return el_str_concat(stem, EL_STR("tum"));
}
if (str_eq(gram_case, EL_STR("nom"))) {
return el_str_concat(stem, EL_STR("um"));
}
if (str_eq(gram_case, EL_STR("acc"))) {
return el_str_concat(stem, EL_STR("am"));
}
if (str_eq(gram_case, EL_STR("gen"))) {
return el_str_concat(stem, EL_STR("im"));
}
return el_str_concat(stem, EL_STR("um"));
}
if (fem) {
if (str_eq(gram_case, EL_STR("nom"))) {
return el_str_concat(stem, EL_STR("\xc4\x81tum"));
}
return el_str_concat(stem, EL_STR("\xc4\x81tim"));
}
if (str_eq(gram_case, EL_STR("nom"))) {
return el_str_concat(stem, EL_STR("\xc5\xabtum"));
}
return el_str_concat(stem, EL_STR("\xc4\x81tim"));
return 0;
}
el_val_t akk_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
return akk_decline(noun, gram_case, number);
return 0;
}
el_val_t akk_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("ba\xc5\xa1\xc3\xbb");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("al\xc4\x81ku");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("am\xc4\x81ru");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("qab\xc3\xbb");
}
if (str_eq(verb, EL_STR("speak"))) {
return EL_STR("qab\xc3\xbb");
}
if (str_eq(verb, EL_STR("do"))) {
return EL_STR("ep\xc4\x93\xc5\xa1u");
}
if (str_eq(verb, EL_STR("make"))) {
return EL_STR("ep\xc4\x93\xc5\xa1u");
}
return verb;
return 0;
}
-31
View File
@@ -1,31 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn akk_str_ends(s: String, suf: String) -> Bool
extern fn akk_str_len(s: String) -> Int
extern fn akk_str_drop_last(s: String, n: Int) -> String
extern fn akk_slot(person: String, number: String) -> Int
extern fn akk_slot_g(person: String, gender: String, number: String) -> Int
extern fn akk_copula_present(slot: Int) -> String
extern fn akk_copula_stative(slot: Int) -> String
extern fn akk_is_copula(verb: String) -> Bool
extern fn akk_conjugate_copula(tense: String, slot: Int) -> String
extern fn akk_alaku_present(slot: Int) -> String
extern fn akk_alaku_perfect(slot: Int) -> String
extern fn akk_amaru_present(slot: Int) -> String
extern fn akk_amaru_perfect(slot: Int) -> String
extern fn akk_amaru_stative(slot: Int) -> String
extern fn akk_qabu_present(slot: Int) -> String
extern fn akk_qabu_perfect(slot: Int) -> String
extern fn akk_qabu_stative(slot: Int) -> String
extern fn akk_epesu_present(slot: Int) -> String
extern fn akk_epesu_perfect(slot: Int) -> String
extern fn akk_epesu_stative(slot: Int) -> String
extern fn akk_regular_present(stem: String, slot: Int) -> String
extern fn akk_regular_perfect(stem: String, slot: Int) -> String
extern fn akk_regular_stative(stem: String, slot: Int) -> String
extern fn akk_known_verb(verb: String, tense: String, slot: Int) -> String
extern fn akk_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn akk_strip_nom(noun: String) -> String
extern fn akk_is_fem(noun: String) -> Bool
extern fn akk_decline(noun: String, gram_case: String, number: String) -> String
extern fn akk_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
extern fn akk_map_canonical(verb: String) -> String
-989
View File
@@ -1,989 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t ang_str_ends(el_val_t s, el_val_t suf);
el_val_t ang_str_drop_last(el_val_t s, el_val_t n);
el_val_t ang_str_last_char(el_val_t s);
el_val_t ang_str_last2(el_val_t s);
el_val_t ang_slot(el_val_t person, el_val_t number);
el_val_t ang_map_canonical(el_val_t verb);
el_val_t ang_wesan_past(el_val_t slot);
el_val_t ang_beon_present(el_val_t slot);
el_val_t ang_wesan_present(el_val_t slot);
el_val_t ang_habban_present(el_val_t slot);
el_val_t ang_habban_past(el_val_t slot);
el_val_t ang_gan_present(el_val_t slot);
el_val_t ang_gan_past(el_val_t slot);
el_val_t ang_cuman_present(el_val_t slot);
el_val_t ang_cuman_past(el_val_t slot);
el_val_t ang_secgan_present(el_val_t slot);
el_val_t ang_secgan_past(el_val_t slot);
el_val_t ang_seon_present(el_val_t slot);
el_val_t ang_seon_past(el_val_t slot);
el_val_t ang_don_present(el_val_t slot);
el_val_t ang_don_past(el_val_t slot);
el_val_t ang_willan_present(el_val_t slot);
el_val_t ang_willan_past(el_val_t slot);
el_val_t ang_magan_present(el_val_t slot);
el_val_t ang_magan_past(el_val_t slot);
el_val_t ang_witan_present(el_val_t slot);
el_val_t ang_witan_past(el_val_t slot);
el_val_t ang_weak_present_ending(el_val_t slot);
el_val_t ang_weak_past_stem(el_val_t stem);
el_val_t ang_weak_past(el_val_t stem, el_val_t slot);
el_val_t ang_weak_stem(el_val_t verb);
el_val_t ang_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t ang_declension(el_val_t noun, el_val_t gender);
el_val_t ang_decline_strong_masc(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t ang_decline_strong_neut(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t ang_decline_weak(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t ang_decline(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t gender);
el_val_t ang_article_masculine(el_val_t gram_case, el_val_t number);
el_val_t ang_article_feminine(el_val_t gram_case, el_val_t number);
el_val_t ang_article_neuter(el_val_t gram_case, el_val_t number);
el_val_t ang_article(el_val_t gender, el_val_t gram_case, el_val_t number);
el_val_t ang_infer_gender(el_val_t noun);
el_val_t ang_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t ang_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t ang_str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t ang_str_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t ang_str_last2(el_val_t s) {
el_val_t n = str_len(s);
if (n < 2) {
return s;
}
return str_slice(s, (n - 2), n);
return 0;
}
el_val_t ang_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t ang_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("beon");
}
if (str_eq(verb, EL_STR("have"))) {
return EL_STR("habban");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("g\xc4\x81n");
}
if (str_eq(verb, EL_STR("come"))) {
return EL_STR("cuman");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("secgan");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("s\xc4\x93on");
}
if (str_eq(verb, EL_STR("do"))) {
return EL_STR("d\xc5\x8dn");
}
if (str_eq(verb, EL_STR("want"))) {
return EL_STR("willan");
}
if (str_eq(verb, EL_STR("will"))) {
return EL_STR("willan");
}
if (str_eq(verb, EL_STR("can"))) {
return EL_STR("magan");
}
if (str_eq(verb, EL_STR("know"))) {
return EL_STR("witan");
}
if (str_eq(verb, EL_STR("give"))) {
return EL_STR("giefan");
}
if (str_eq(verb, EL_STR("take"))) {
return EL_STR("niman");
}
if (str_eq(verb, EL_STR("find"))) {
return EL_STR("findan");
}
if (str_eq(verb, EL_STR("make"))) {
return EL_STR("macian");
}
return verb;
return 0;
}
el_val_t ang_wesan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("w\xc3\xa6s");
}
if (slot == 1) {
return EL_STR("w\xc7\xa3re");
}
if (slot == 2) {
return EL_STR("w\xc3\xa6s");
}
if (slot == 3) {
return EL_STR("w\xc7\xa3ron");
}
if (slot == 4) {
return EL_STR("w\xc7\xa3ron");
}
return EL_STR("w\xc7\xa3ron");
return 0;
}
el_val_t ang_beon_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("b\xc4\x93o");
}
if (slot == 1) {
return EL_STR("bist");
}
if (slot == 2) {
return EL_STR("bi\xc3\xbe");
}
if (slot == 3) {
return EL_STR("b\xc4\x93o\xc3\xbe");
}
if (slot == 4) {
return EL_STR("b\xc4\x93o\xc3\xbe");
}
return EL_STR("b\xc4\x93o\xc3\xbe");
return 0;
}
el_val_t ang_wesan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("eom");
}
if (slot == 1) {
return EL_STR("eart");
}
if (slot == 2) {
return EL_STR("is");
}
if (slot == 3) {
return EL_STR("sind");
}
if (slot == 4) {
return EL_STR("sind");
}
return EL_STR("sind");
return 0;
}
el_val_t ang_habban_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("h\xc3\xa6""bbe");
}
if (slot == 1) {
return EL_STR("h\xc3\xa6""fst");
}
if (slot == 2) {
return EL_STR("h\xc3\xa6""f\xc3\xbe");
}
if (slot == 3) {
return EL_STR("habba\xc3\xb0");
}
if (slot == 4) {
return EL_STR("habba\xc3\xb0");
}
return EL_STR("habba\xc3\xb0");
return 0;
}
el_val_t ang_habban_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("h\xc3\xa6""fde");
}
if (slot == 1) {
return EL_STR("h\xc3\xa6""fdest");
}
if (slot == 2) {
return EL_STR("h\xc3\xa6""fde");
}
if (slot == 3) {
return EL_STR("h\xc3\xa6""fdon");
}
if (slot == 4) {
return EL_STR("h\xc3\xa6""fdon");
}
return EL_STR("h\xc3\xa6""fdon");
return 0;
}
el_val_t ang_gan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("g\xc4\x81");
}
if (slot == 1) {
return EL_STR("g\xc7\xa3st");
}
if (slot == 2) {
return EL_STR("g\xc7\xa3\xc3\xbe");
}
if (slot == 3) {
return EL_STR("g\xc4\x81\xc3\xb0");
}
if (slot == 4) {
return EL_STR("g\xc4\x81\xc3\xb0");
}
return EL_STR("g\xc4\x81\xc3\xb0");
return 0;
}
el_val_t ang_gan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xc4\x93ode");
}
if (slot == 1) {
return EL_STR("\xc4\x93odest");
}
if (slot == 2) {
return EL_STR("\xc4\x93ode");
}
if (slot == 3) {
return EL_STR("\xc4\x93odon");
}
if (slot == 4) {
return EL_STR("\xc4\x93odon");
}
return EL_STR("\xc4\x93odon");
return 0;
}
el_val_t ang_cuman_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("cume");
}
if (slot == 1) {
return EL_STR("cymst");
}
if (slot == 2) {
return EL_STR("cym\xc3\xbe");
}
if (slot == 3) {
return EL_STR("cuma\xc3\xb0");
}
if (slot == 4) {
return EL_STR("cuma\xc3\xb0");
}
return EL_STR("cuma\xc3\xb0");
return 0;
}
el_val_t ang_cuman_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("c\xc5\x8dm");
}
if (slot == 1) {
return EL_STR("c\xc5\x8dme");
}
if (slot == 2) {
return EL_STR("c\xc5\x8dm");
}
if (slot == 3) {
return EL_STR("c\xc5\x8dmon");
}
if (slot == 4) {
return EL_STR("c\xc5\x8dmon");
}
return EL_STR("c\xc5\x8dmon");
return 0;
}
el_val_t ang_secgan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("secge");
}
if (slot == 1) {
return EL_STR("sagast");
}
if (slot == 2) {
return EL_STR("saga\xc3\xb0");
}
if (slot == 3) {
return EL_STR("secga\xc3\xb0");
}
if (slot == 4) {
return EL_STR("secga\xc3\xb0");
}
return EL_STR("secga\xc3\xb0");
return 0;
}
el_val_t ang_secgan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("s\xc3\xa6gde");
}
if (slot == 1) {
return EL_STR("s\xc3\xa6gdest");
}
if (slot == 2) {
return EL_STR("s\xc3\xa6gde");
}
if (slot == 3) {
return EL_STR("s\xc3\xa6gdon");
}
if (slot == 4) {
return EL_STR("s\xc3\xa6gdon");
}
return EL_STR("s\xc3\xa6gdon");
return 0;
}
el_val_t ang_seon_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("s\xc4\x93o");
}
if (slot == 1) {
return EL_STR("siehst");
}
if (slot == 2) {
return EL_STR("sieh\xc3\xbe");
}
if (slot == 3) {
return EL_STR("s\xc4\x93o\xc3\xb0");
}
if (slot == 4) {
return EL_STR("s\xc4\x93o\xc3\xb0");
}
return EL_STR("s\xc4\x93o\xc3\xb0");
return 0;
}
el_val_t ang_seon_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("seah");
}
if (slot == 1) {
return EL_STR("s\xc4\x81we");
}
if (slot == 2) {
return EL_STR("seah");
}
if (slot == 3) {
return EL_STR("s\xc4\x81won");
}
if (slot == 4) {
return EL_STR("s\xc4\x81won");
}
return EL_STR("s\xc4\x81won");
return 0;
}
el_val_t ang_don_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("d\xc5\x8d");
}
if (slot == 1) {
return EL_STR("d\xc4\x93st");
}
if (slot == 2) {
return EL_STR("d\xc4\x93\xc3\xbe");
}
if (slot == 3) {
return EL_STR("d\xc5\x8d\xc3\xb0");
}
if (slot == 4) {
return EL_STR("d\xc5\x8d\xc3\xb0");
}
return EL_STR("d\xc5\x8d\xc3\xb0");
return 0;
}
el_val_t ang_don_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("dyde");
}
if (slot == 1) {
return EL_STR("dydest");
}
if (slot == 2) {
return EL_STR("dyde");
}
if (slot == 3) {
return EL_STR("dydon");
}
if (slot == 4) {
return EL_STR("dydon");
}
return EL_STR("dydon");
return 0;
}
el_val_t ang_willan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("wille");
}
if (slot == 1) {
return EL_STR("wilt");
}
if (slot == 2) {
return EL_STR("wile");
}
if (slot == 3) {
return EL_STR("willa\xc3\xb0");
}
if (slot == 4) {
return EL_STR("willa\xc3\xb0");
}
return EL_STR("willa\xc3\xb0");
return 0;
}
el_val_t ang_willan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("wolde");
}
if (slot == 1) {
return EL_STR("woldest");
}
if (slot == 2) {
return EL_STR("wolde");
}
if (slot == 3) {
return EL_STR("woldon");
}
if (slot == 4) {
return EL_STR("woldon");
}
return EL_STR("woldon");
return 0;
}
el_val_t ang_magan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("m\xc3\xa6g");
}
if (slot == 1) {
return EL_STR("meaht");
}
if (slot == 2) {
return EL_STR("m\xc3\xa6g");
}
if (slot == 3) {
return EL_STR("magon");
}
if (slot == 4) {
return EL_STR("magon");
}
return EL_STR("magon");
return 0;
}
el_val_t ang_magan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("meahte");
}
if (slot == 1) {
return EL_STR("meahtest");
}
if (slot == 2) {
return EL_STR("meahte");
}
if (slot == 3) {
return EL_STR("meahton");
}
if (slot == 4) {
return EL_STR("meahton");
}
return EL_STR("meahton");
return 0;
}
el_val_t ang_witan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("w\xc4\x81t");
}
if (slot == 1) {
return EL_STR("w\xc4\x81st");
}
if (slot == 2) {
return EL_STR("w\xc4\x81t");
}
if (slot == 3) {
return EL_STR("witon");
}
if (slot == 4) {
return EL_STR("witon");
}
return EL_STR("witon");
return 0;
}
el_val_t ang_witan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("wisse");
}
if (slot == 1) {
return EL_STR("wissest");
}
if (slot == 2) {
return EL_STR("wisse");
}
if (slot == 3) {
return EL_STR("wisson");
}
if (slot == 4) {
return EL_STR("wisson");
}
return EL_STR("wisson");
return 0;
}
el_val_t ang_weak_present_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("e");
}
if (slot == 1) {
return EL_STR("est");
}
if (slot == 2) {
return EL_STR("e\xc3\xbe");
}
if (slot == 3) {
return EL_STR("a\xc3\xbe");
}
if (slot == 4) {
return EL_STR("a\xc3\xbe");
}
return EL_STR("a\xc3\xbe");
return 0;
}
el_val_t ang_weak_past_stem(el_val_t stem) {
el_val_t slen = str_len(stem);
if (slen <= 2) {
return el_str_concat(stem, EL_STR("ede"));
}
return el_str_concat(stem, EL_STR("ode"));
return 0;
}
el_val_t ang_weak_past(el_val_t stem, el_val_t slot) {
el_val_t pstem = ang_weak_past_stem(stem);
if (slot == 0) {
return pstem;
}
if (slot == 1) {
return el_str_concat(pstem, EL_STR("st"));
}
if (slot == 2) {
return pstem;
}
if (slot == 3) {
return el_str_concat(ang_str_drop_last(pstem, 1), EL_STR("on"));
}
if (slot == 4) {
return el_str_concat(ang_str_drop_last(pstem, 1), EL_STR("on"));
}
return el_str_concat(ang_str_drop_last(pstem, 1), EL_STR("on"));
return 0;
}
el_val_t ang_weak_stem(el_val_t verb) {
if (ang_str_ends(verb, EL_STR("ian"))) {
return ang_str_drop_last(verb, 3);
}
if (ang_str_ends(verb, EL_STR("an"))) {
return ang_str_drop_last(verb, 2);
}
return verb;
return 0;
}
el_val_t ang_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = ang_map_canonical(verb);
el_val_t slot = ang_slot(person, number);
if (str_eq(v, EL_STR("beon"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_beon_present(slot);
}
return ang_wesan_past(slot);
}
if (str_eq(v, EL_STR("wesan"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_wesan_present(slot);
}
return ang_wesan_past(slot);
}
if (str_eq(v, EL_STR("habban"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_habban_present(slot);
}
return ang_habban_past(slot);
}
if (str_eq(v, EL_STR("g\xc4\x81n"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_gan_present(slot);
}
return ang_gan_past(slot);
}
if (str_eq(v, EL_STR("cuman"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_cuman_present(slot);
}
return ang_cuman_past(slot);
}
if (str_eq(v, EL_STR("secgan"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_secgan_present(slot);
}
return ang_secgan_past(slot);
}
if (str_eq(v, EL_STR("s\xc4\x93on"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_seon_present(slot);
}
return ang_seon_past(slot);
}
if (str_eq(v, EL_STR("d\xc5\x8dn"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_don_present(slot);
}
return ang_don_past(slot);
}
if (str_eq(v, EL_STR("willan"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_willan_present(slot);
}
return ang_willan_past(slot);
}
if (str_eq(v, EL_STR("magan"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_magan_present(slot);
}
return ang_magan_past(slot);
}
if (str_eq(v, EL_STR("witan"))) {
if (str_eq(tense, EL_STR("present"))) {
return ang_witan_present(slot);
}
return ang_witan_past(slot);
}
el_val_t stem = ang_weak_stem(v);
if (str_eq(tense, EL_STR("present"))) {
return el_str_concat(stem, ang_weak_present_ending(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return ang_weak_past(stem, slot);
}
return v;
return 0;
}
el_val_t ang_declension(el_val_t noun, el_val_t gender) {
if (ang_str_ends(noun, EL_STR("a"))) {
return EL_STR("weak");
}
if (str_eq(gender, EL_STR("neuter"))) {
return EL_STR("strong_neut");
}
return EL_STR("strong_masc");
return 0;
}
el_val_t ang_decline_strong_masc(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("es"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("e"));
}
return noun;
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("as"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("as"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("um"));
}
return el_str_concat(noun, EL_STR("as"));
return 0;
}
el_val_t ang_decline_strong_neut(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("es"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("e"));
}
return noun;
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("um"));
}
return noun;
return 0;
}
el_val_t ang_decline_weak(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t stem = ang_str_drop_last(noun, 1);
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("an"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("an"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("an"));
}
return noun;
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("an"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("an"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("ena"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("um"));
}
return el_str_concat(stem, EL_STR("an"));
return 0;
}
el_val_t ang_decline(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t gender) {
el_val_t decl = ang_declension(noun, gender);
if (str_eq(decl, EL_STR("strong_masc"))) {
return ang_decline_strong_masc(noun, gram_case, number);
}
if (str_eq(decl, EL_STR("strong_neut"))) {
return ang_decline_strong_neut(noun, gram_case, number);
}
if (str_eq(decl, EL_STR("weak"))) {
return ang_decline_weak(noun, gram_case, number);
}
return noun;
return 0;
}
el_val_t ang_article_masculine(el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("se");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("\xc3\xbeone");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("\xc3\xbe\xc3\xa6s");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("\xc3\xbe\xc7\xa3m");
}
return EL_STR("se");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("\xc3\xbe\xc4\x81");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("\xc3\xbe\xc4\x81");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("\xc3\xbe\xc4\x81ra");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("\xc3\xbe\xc7\xa3m");
}
return EL_STR("\xc3\xbe\xc4\x81");
return 0;
}
el_val_t ang_article_feminine(el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("s\xc4\x93o");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("\xc3\xbe\xc4\x81");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("\xc3\xbe\xc7\xa3re");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("\xc3\xbe\xc7\xa3re");
}
return EL_STR("s\xc4\x93o");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("\xc3\xbe\xc4\x81");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("\xc3\xbe\xc4\x81");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("\xc3\xbe\xc4\x81ra");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("\xc3\xbe\xc7\xa3m");
}
return EL_STR("\xc3\xbe\xc4\x81");
return 0;
}
el_val_t ang_article_neuter(el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("\xc3\xbe\xc3\xa6t");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("\xc3\xbe\xc3\xa6t");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("\xc3\xbe\xc3\xa6s");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("\xc3\xbe\xc7\xa3m");
}
return EL_STR("\xc3\xbe\xc3\xa6t");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("\xc3\xbe\xc4\x81");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("\xc3\xbe\xc4\x81");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("\xc3\xbe\xc4\x81ra");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("\xc3\xbe\xc7\xa3m");
}
return EL_STR("\xc3\xbe\xc4\x81");
return 0;
}
el_val_t ang_article(el_val_t gender, el_val_t gram_case, el_val_t number) {
if (str_eq(gender, EL_STR("masculine"))) {
return ang_article_masculine(gram_case, number);
}
if (str_eq(gender, EL_STR("feminine"))) {
return ang_article_feminine(gram_case, number);
}
return ang_article_neuter(gram_case, number);
return 0;
}
el_val_t ang_infer_gender(el_val_t noun) {
if (ang_str_ends(noun, EL_STR("u"))) {
return EL_STR("feminine");
}
if (ang_str_ends(noun, EL_STR("e"))) {
return EL_STR("feminine");
}
return EL_STR("masculine");
return 0;
}
el_val_t ang_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
el_val_t gender = ang_infer_gender(noun);
el_val_t declined = ang_decline(noun, gram_case, number, gender);
if (str_eq(definite, EL_STR("true"))) {
el_val_t art = ang_article(gender, gram_case, number);
return el_str_concat(el_str_concat(art, EL_STR(" ")), declined);
}
return declined;
return 0;
}
-44
View File
@@ -1,44 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn ang_str_ends(s: String, suf: String) -> Bool
extern fn ang_str_drop_last(s: String, n: Int) -> String
extern fn ang_str_last_char(s: String) -> String
extern fn ang_str_last2(s: String) -> String
extern fn ang_slot(person: String, number: String) -> Int
extern fn ang_map_canonical(verb: String) -> String
extern fn ang_wesan_past(slot: Int) -> String
extern fn ang_beon_present(slot: Int) -> String
extern fn ang_wesan_present(slot: Int) -> String
extern fn ang_habban_present(slot: Int) -> String
extern fn ang_habban_past(slot: Int) -> String
extern fn ang_gan_present(slot: Int) -> String
extern fn ang_gan_past(slot: Int) -> String
extern fn ang_cuman_present(slot: Int) -> String
extern fn ang_cuman_past(slot: Int) -> String
extern fn ang_secgan_present(slot: Int) -> String
extern fn ang_secgan_past(slot: Int) -> String
extern fn ang_seon_present(slot: Int) -> String
extern fn ang_seon_past(slot: Int) -> String
extern fn ang_don_present(slot: Int) -> String
extern fn ang_don_past(slot: Int) -> String
extern fn ang_willan_present(slot: Int) -> String
extern fn ang_willan_past(slot: Int) -> String
extern fn ang_magan_present(slot: Int) -> String
extern fn ang_magan_past(slot: Int) -> String
extern fn ang_witan_present(slot: Int) -> String
extern fn ang_witan_past(slot: Int) -> String
extern fn ang_weak_present_ending(slot: Int) -> String
extern fn ang_weak_past_stem(stem: String) -> String
extern fn ang_weak_past(stem: String, slot: Int) -> String
extern fn ang_weak_stem(verb: String) -> String
extern fn ang_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn ang_declension(noun: String, gender: String) -> String
extern fn ang_decline_strong_masc(noun: String, gram_case: String, number: String) -> String
extern fn ang_decline_strong_neut(noun: String, gram_case: String, number: String) -> String
extern fn ang_decline_weak(noun: String, gram_case: String, number: String) -> String
extern fn ang_decline(noun: String, gram_case: String, number: String, gender: String) -> String
extern fn ang_article_masculine(gram_case: String, number: String) -> String
extern fn ang_article_feminine(gram_case: String, number: String) -> String
extern fn ang_article_neuter(gram_case: String, number: String) -> String
extern fn ang_article(gender: String, gram_case: String, number: String) -> String
extern fn ang_infer_gender(noun: String) -> String
extern fn ang_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-908
View File
@@ -1,908 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t ar_str_ends(el_val_t s, el_val_t suf);
el_val_t ar_str_len(el_val_t s);
el_val_t ar_str_drop_last(el_val_t s, el_val_t n);
el_val_t ar_str_last_char(el_val_t s);
el_val_t ar_slot(el_val_t person, el_val_t gender, el_val_t number);
el_val_t ar_perfect_suffix(el_val_t slot);
el_val_t ar_imperfect_prefix(el_val_t slot);
el_val_t ar_imperfect_suffix(el_val_t slot);
el_val_t ar_conjugate_form1(el_val_t past_base, el_val_t present_stem, el_val_t tense, el_val_t slot);
el_val_t ar_irregular_kaana(el_val_t slot, el_val_t tense);
el_val_t ar_irregular_qaala(el_val_t slot, el_val_t tense);
el_val_t ar_irregular_jaa(el_val_t slot, el_val_t tense);
el_val_t ar_irregular_raaa(el_val_t slot, el_val_t tense);
el_val_t ar_irregular_araada(el_val_t slot, el_val_t tense);
el_val_t ar_irregular_istata(el_val_t slot, el_val_t tense);
el_val_t ar_irregular(el_val_t verb, el_val_t tense, el_val_t slot);
el_val_t ar_present_stem(el_val_t verb);
el_val_t ar_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number);
el_val_t ar_is_sun_letter(el_val_t c);
el_val_t ar_definite_article(el_val_t noun);
el_val_t ar_case_ending(el_val_t kase, el_val_t definite);
el_val_t ar_gender(el_val_t noun);
el_val_t ar_masc_pl_ending(el_val_t kase);
el_val_t ar_sound_plural(el_val_t noun, el_val_t gender);
el_val_t ar_noun_form(el_val_t noun, el_val_t gender, el_val_t kase, el_val_t number, el_val_t definite);
el_val_t ar_verb_form(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t ar_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t ar_str_len(el_val_t s) {
return str_len(s);
return 0;
}
el_val_t ar_str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t ar_str_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t ar_slot(el_val_t person, el_val_t gender, el_val_t number) {
if (str_eq(person, EL_STR("third"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gender, EL_STR("f"))) {
return 1;
}
return 0;
}
if (str_eq(gender, EL_STR("f"))) {
return 6;
}
return 5;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gender, EL_STR("f"))) {
return 3;
}
return 2;
}
if (str_eq(gender, EL_STR("f"))) {
return 8;
}
return 7;
}
if (str_eq(number, EL_STR("plural"))) {
return 9;
}
return 4;
return 0;
}
el_val_t ar_perfect_suffix(el_val_t slot) {
if (slot == 0) {
return EL_STR("");
}
if (slot == 1) {
return EL_STR("\xd8\xaa");
}
if (slot == 2) {
return EL_STR("\xd8\xaa\xd9\x8e");
}
if (slot == 3) {
return EL_STR("\xd8\xaa\xd9\x90");
}
if (slot == 4) {
return EL_STR("\xd8\xaa\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd9\x88\xd8\xa7");
}
if (slot == 6) {
return EL_STR("\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xaa\xd9\x8f\xd9\x85\xd9\x92");
}
if (slot == 8) {
return EL_STR("\xd8\xaa\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91");
}
return EL_STR("\xd9\x86\xd9\x8e\xd8\xa7");
return 0;
}
el_val_t ar_imperfect_prefix(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd9\x8a\xd9\x8e");
}
if (slot == 1) {
return EL_STR("\xd8\xaa\xd9\x8e");
}
if (slot == 2) {
return EL_STR("\xd8\xaa\xd9\x8e");
}
if (slot == 3) {
return EL_STR("\xd8\xaa\xd9\x8e");
}
if (slot == 4) {
return EL_STR("\xd8\xa3\xd9\x8e");
}
if (slot == 5) {
return EL_STR("\xd9\x8a\xd9\x8e");
}
if (slot == 6) {
return EL_STR("\xd9\x8a\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xaa\xd9\x8e");
}
if (slot == 8) {
return EL_STR("\xd8\xaa\xd9\x8e");
}
return EL_STR("\xd9\x86\xd9\x8e");
return 0;
}
el_val_t ar_imperfect_suffix(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd9\x8f");
}
if (slot == 1) {
return EL_STR("\xd9\x8f");
}
if (slot == 2) {
return EL_STR("\xd9\x8f");
}
if (slot == 3) {
return EL_STR("\xd9\x90\xd9\x8a\xd9\x86\xd9\x8e");
}
if (slot == 4) {
return EL_STR("\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 6) {
return EL_STR("\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 8) {
return EL_STR("\xd9\x86\xd9\x8e");
}
return EL_STR("\xd9\x8f");
return 0;
}
el_val_t ar_conjugate_form1(el_val_t past_base, el_val_t present_stem, el_val_t tense, el_val_t slot) {
if (str_eq(tense, EL_STR("past"))) {
if (slot == 0) {
return past_base;
}
el_val_t suf = ar_perfect_suffix(slot);
el_val_t stem = ar_str_drop_last(past_base, 1);
return el_str_concat(stem, suf);
}
if (str_eq(tense, EL_STR("present"))) {
el_val_t pre = ar_imperfect_prefix(slot);
el_val_t suf = ar_imperfect_suffix(slot);
el_val_t mid = ar_str_drop_last(present_stem, 1);
return el_str_concat(el_str_concat(pre, mid), suf);
}
if (str_eq(tense, EL_STR("future"))) {
el_val_t pres_3ms = ar_conjugate_form1(past_base, present_stem, EL_STR("present"), 0);
return el_str_concat(EL_STR("\xd8\xb3\xd9\x8e"), pres_3ms);
}
return past_base;
return 0;
}
el_val_t ar_irregular_kaana(el_val_t slot, el_val_t tense) {
if (str_eq(tense, EL_STR("past"))) {
if (slot == 0) {
return EL_STR("\xd9\x83\xd9\x8e\xd8\xa7\xd9\x86\xd9\x8e");
}
if (slot == 1) {
return EL_STR("\xd9\x83\xd9\x8e\xd8\xa7\xd9\x86\xd9\x8e\xd8\xaa\xd9\x92");
}
if (slot == 2) {
return EL_STR("\xd9\x83\xd9\x8f\xd9\x86\xd9\x92\xd8\xaa\xd9\x8e");
}
if (slot == 3) {
return EL_STR("\xd9\x83\xd9\x8f\xd9\x86\xd9\x92\xd8\xaa\xd9\x90");
}
if (slot == 4) {
return EL_STR("\xd9\x83\xd9\x8f\xd9\x86\xd9\x92\xd8\xaa\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd9\x83\xd9\x8e\xd8\xa7\xd9\x86\xd9\x8f\xd9\x88\xd8\xa7");
}
if (slot == 6) {
return EL_STR("\xd9\x83\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91");
}
if (slot == 7) {
return EL_STR("\xd9\x83\xd9\x8f\xd9\x86\xd9\x92\xd8\xaa\xd9\x8f\xd9\x85\xd9\x92");
}
if (slot == 8) {
return EL_STR("\xd9\x83\xd9\x8f\xd9\x86\xd9\x92\xd8\xaa\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91");
}
return EL_STR("\xd9\x83\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91\xd8\xa7");
}
if (str_eq(tense, EL_STR("present"))) {
if (slot == 0) {
return EL_STR("\xd9\x8a\xd9\x8e\xd9\x83\xd9\x8f\xd9\x88\xd9\x86\xd9\x8f");
}
if (slot == 1) {
return EL_STR("\xd8\xaa\xd9\x8e\xd9\x83\xd9\x8f\xd9\x88\xd9\x86\xd9\x8f");
}
if (slot == 2) {
return EL_STR("\xd8\xaa\xd9\x8e\xd9\x83\xd9\x8f\xd9\x88\xd9\x86\xd9\x8f");
}
if (slot == 3) {
return EL_STR("\xd8\xaa\xd9\x8e\xd9\x83\xd9\x8f\xd9\x88\xd9\x86\xd9\x90\xd9\x8a\xd9\x86\xd9\x8e");
}
if (slot == 4) {
return EL_STR("\xd8\xa3\xd9\x8e\xd9\x83\xd9\x8f\xd9\x88\xd9\x86\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd9\x8a\xd9\x8e\xd9\x83\xd9\x8f\xd9\x88\xd9\x86\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 6) {
return EL_STR("\xd9\x8a\xd9\x8e\xd9\x83\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91");
}
if (slot == 7) {
return EL_STR("\xd8\xaa\xd9\x8e\xd9\x83\xd9\x8f\xd9\x88\xd9\x86\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 8) {
return EL_STR("\xd8\xaa\xd9\x8e\xd9\x83\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91");
}
return EL_STR("\xd9\x86\xd9\x8e\xd9\x83\xd9\x8f\xd9\x88\xd9\x86\xd9\x8f");
}
if (str_eq(tense, EL_STR("future"))) {
el_val_t pres = ar_irregular_kaana(slot, EL_STR("present"));
return el_str_concat(EL_STR("\xd8\xb3\xd9\x8e"), pres);
}
return EL_STR("\xd9\x83\xd9\x8e\xd8\xa7\xd9\x86\xd9\x8e");
return 0;
}
el_val_t ar_irregular_qaala(el_val_t slot, el_val_t tense) {
if (str_eq(tense, EL_STR("past"))) {
if (slot == 0) {
return EL_STR("\xd9\x82\xd9\x8e\xd8\xa7\xd9\x84\xd9\x8e");
}
if (slot == 1) {
return EL_STR("\xd9\x82\xd9\x8e\xd8\xa7\xd9\x84\xd9\x8e\xd8\xaa\xd9\x92");
}
if (slot == 2) {
return EL_STR("\xd9\x82\xd9\x8f\xd9\x84\xd9\x92\xd8\xaa\xd9\x8e");
}
if (slot == 3) {
return EL_STR("\xd9\x82\xd9\x8f\xd9\x84\xd9\x92\xd8\xaa\xd9\x90");
}
if (slot == 4) {
return EL_STR("\xd9\x82\xd9\x8f\xd9\x84\xd9\x92\xd8\xaa\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd9\x82\xd9\x8e\xd8\xa7\xd9\x84\xd9\x8f\xd9\x88\xd8\xa7");
}
if (slot == 6) {
return EL_STR("\xd9\x82\xd9\x8f\xd9\x84\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd9\x82\xd9\x8f\xd9\x84\xd9\x92\xd8\xaa\xd9\x8f\xd9\x85\xd9\x92");
}
if (slot == 8) {
return EL_STR("\xd9\x82\xd9\x8f\xd9\x84\xd9\x92\xd8\xaa\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91");
}
return EL_STR("\xd9\x82\xd9\x8f\xd9\x84\xd9\x92\xd9\x86\xd9\x8e\xd8\xa7");
}
if (str_eq(tense, EL_STR("present"))) {
if (slot == 0) {
return EL_STR("\xd9\x8a\xd9\x8e\xd9\x82\xd9\x8f\xd9\x88\xd9\x84\xd9\x8f");
}
if (slot == 1) {
return EL_STR("\xd8\xaa\xd9\x8e\xd9\x82\xd9\x8f\xd9\x88\xd9\x84\xd9\x8f");
}
if (slot == 2) {
return EL_STR("\xd8\xaa\xd9\x8e\xd9\x82\xd9\x8f\xd9\x88\xd9\x84\xd9\x8f");
}
if (slot == 3) {
return EL_STR("\xd8\xaa\xd9\x8e\xd9\x82\xd9\x8f\xd9\x88\xd9\x84\xd9\x90\xd9\x8a\xd9\x86\xd9\x8e");
}
if (slot == 4) {
return EL_STR("\xd8\xa3\xd9\x8e\xd9\x82\xd9\x8f\xd9\x88\xd9\x84\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd9\x8a\xd9\x8e\xd9\x82\xd9\x8f\xd9\x88\xd9\x84\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 6) {
return EL_STR("\xd9\x8a\xd9\x8e\xd9\x82\xd9\x8f\xd9\x84\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xaa\xd9\x8e\xd9\x82\xd9\x8f\xd9\x88\xd9\x84\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 8) {
return EL_STR("\xd8\xaa\xd9\x8e\xd9\x82\xd9\x8f\xd9\x84\xd9\x92\xd9\x86\xd9\x8e");
}
return EL_STR("\xd9\x86\xd9\x8e\xd9\x82\xd9\x8f\xd9\x88\xd9\x84\xd9\x8f");
}
if (str_eq(tense, EL_STR("future"))) {
el_val_t pres = ar_irregular_qaala(slot, EL_STR("present"));
return el_str_concat(EL_STR("\xd8\xb3\xd9\x8e"), pres);
}
return EL_STR("\xd9\x82\xd9\x8e\xd8\xa7\xd9\x84\xd9\x8e");
return 0;
}
el_val_t ar_irregular_jaa(el_val_t slot, el_val_t tense) {
if (str_eq(tense, EL_STR("past"))) {
if (slot == 0) {
return EL_STR("\xd8\xac\xd9\x8e\xd8\xa7\xd8\xa1\xd9\x8e");
}
if (slot == 1) {
return EL_STR("\xd8\xac\xd9\x8e\xd8\xa7\xd8\xa1\xd9\x8e\xd8\xaa\xd9\x92");
}
if (slot == 2) {
return EL_STR("\xd8\xac\xd9\x90\xd8\xa6\xd9\x92\xd8\xaa\xd9\x8e");
}
if (slot == 3) {
return EL_STR("\xd8\xac\xd9\x90\xd8\xa6\xd9\x92\xd8\xaa\xd9\x90");
}
if (slot == 4) {
return EL_STR("\xd8\xac\xd9\x90\xd8\xa6\xd9\x92\xd8\xaa\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd8\xac\xd9\x8e\xd8\xa7\xd8\xa1\xd9\x8f\xd9\x88\xd8\xa7");
}
if (slot == 6) {
return EL_STR("\xd8\xac\xd9\x90\xd8\xa6\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xac\xd9\x90\xd8\xa6\xd9\x92\xd8\xaa\xd9\x8f\xd9\x85\xd9\x92");
}
if (slot == 8) {
return EL_STR("\xd8\xac\xd9\x90\xd8\xa6\xd9\x92\xd8\xaa\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91");
}
return EL_STR("\xd8\xac\xd9\x90\xd8\xa6\xd9\x92\xd9\x86\xd9\x8e\xd8\xa7");
}
if (str_eq(tense, EL_STR("present"))) {
if (slot == 0) {
return EL_STR("\xd9\x8a\xd9\x8e\xd8\xac\xd9\x90\xd9\x8a\xd8\xa1\xd9\x8f");
}
if (slot == 1) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xac\xd9\x90\xd9\x8a\xd8\xa1\xd9\x8f");
}
if (slot == 2) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xac\xd9\x90\xd9\x8a\xd8\xa1\xd9\x8f");
}
if (slot == 3) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xac\xd9\x90\xd9\x8a\xd8\xa6\xd9\x90\xd9\x8a\xd9\x86\xd9\x8e");
}
if (slot == 4) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xac\xd9\x90\xd9\x8a\xd8\xa1\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd9\x8a\xd9\x8e\xd8\xac\xd9\x90\xd9\x8a\xd8\xa6\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 6) {
return EL_STR("\xd9\x8a\xd9\x8e\xd8\xac\xd9\x90\xd8\xa6\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xac\xd9\x90\xd9\x8a\xd8\xa6\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 8) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xac\xd9\x90\xd8\xa6\xd9\x92\xd9\x86\xd9\x8e");
}
return EL_STR("\xd9\x86\xd9\x8e\xd8\xac\xd9\x90\xd9\x8a\xd8\xa1\xd9\x8f");
}
if (str_eq(tense, EL_STR("future"))) {
el_val_t pres = ar_irregular_jaa(slot, EL_STR("present"));
return el_str_concat(EL_STR("\xd8\xb3\xd9\x8e"), pres);
}
return EL_STR("\xd8\xac\xd9\x8e\xd8\xa7\xd8\xa1\xd9\x8e");
return 0;
}
el_val_t ar_irregular_raaa(el_val_t slot, el_val_t tense) {
if (str_eq(tense, EL_STR("past"))) {
if (slot == 0) {
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x89");
}
if (slot == 1) {
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd8\xaa\xd9\x92");
}
if (slot == 2) {
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x8a\xd9\x92\xd8\xaa\xd9\x8e");
}
if (slot == 3) {
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x8a\xd9\x92\xd8\xaa\xd9\x90");
}
if (slot == 4) {
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x8a\xd9\x92\xd8\xaa\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x88\xd9\x92\xd8\xa7");
}
if (slot == 6) {
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x8a\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x8a\xd9\x92\xd8\xaa\xd9\x8f\xd9\x85\xd9\x92");
}
if (slot == 8) {
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x8a\xd9\x92\xd8\xaa\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91");
}
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x8a\xd9\x92\xd9\x86\xd9\x8e\xd8\xa7");
}
if (str_eq(tense, EL_STR("present"))) {
if (slot == 0) {
return EL_STR("\xd9\x8a\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x89");
}
if (slot == 1) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x89");
}
if (slot == 2) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x89");
}
if (slot == 3) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x8a\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 4) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x89");
}
if (slot == 5) {
return EL_STR("\xd9\x8a\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x88\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 6) {
return EL_STR("\xd9\x8a\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x8a\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x88\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 8) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x8a\xd9\x92\xd9\x86\xd9\x8e");
}
return EL_STR("\xd9\x86\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x89");
}
if (str_eq(tense, EL_STR("future"))) {
el_val_t pres = ar_irregular_raaa(slot, EL_STR("present"));
return el_str_concat(EL_STR("\xd8\xb3\xd9\x8e"), pres);
}
return EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x89");
return 0;
}
el_val_t ar_irregular_araada(el_val_t slot, el_val_t tense) {
if (str_eq(tense, EL_STR("past"))) {
if (slot == 0) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xa7\xd8\xaf\xd9\x8e");
}
if (slot == 1) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xa7\xd8\xaf\xd9\x8e\xd8\xaa\xd9\x92");
}
if (slot == 2) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xaf\xd9\x92\xd8\xaa\xd9\x8e");
}
if (slot == 3) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xaf\xd9\x92\xd8\xaa\xd9\x90");
}
if (slot == 4) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xaf\xd9\x92\xd8\xaa\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xa7\xd8\xaf\xd9\x8f\xd9\x88\xd8\xa7");
}
if (slot == 6) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xaf\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xaf\xd9\x92\xd8\xaa\xd9\x8f\xd9\x85\xd9\x92");
}
if (slot == 8) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xaf\xd9\x92\xd8\xaa\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91");
}
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xaf\xd9\x92\xd9\x86\xd9\x8e\xd8\xa7");
}
if (str_eq(tense, EL_STR("present"))) {
if (slot == 0) {
return EL_STR("\xd9\x8a\xd9\x8f\xd8\xb1\xd9\x90\xd9\x8a\xd8\xaf\xd9\x8f");
}
if (slot == 1) {
return EL_STR("\xd8\xaa\xd9\x8f\xd8\xb1\xd9\x90\xd9\x8a\xd8\xaf\xd9\x8f");
}
if (slot == 2) {
return EL_STR("\xd8\xaa\xd9\x8f\xd8\xb1\xd9\x90\xd9\x8a\xd8\xaf\xd9\x8f");
}
if (slot == 3) {
return EL_STR("\xd8\xaa\xd9\x8f\xd8\xb1\xd9\x90\xd9\x8a\xd8\xaf\xd9\x90\xd9\x8a\xd9\x86\xd9\x8e");
}
if (slot == 4) {
return EL_STR("\xd8\xa3\xd9\x8f\xd8\xb1\xd9\x90\xd9\x8a\xd8\xaf\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd9\x8a\xd9\x8f\xd8\xb1\xd9\x90\xd9\x8a\xd8\xaf\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 6) {
return EL_STR("\xd9\x8a\xd9\x8f\xd8\xb1\xd9\x90\xd8\xaf\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xaa\xd9\x8f\xd8\xb1\xd9\x90\xd9\x8a\xd8\xaf\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 8) {
return EL_STR("\xd8\xaa\xd9\x8f\xd8\xb1\xd9\x90\xd8\xaf\xd9\x92\xd9\x86\xd9\x8e");
}
return EL_STR("\xd9\x86\xd9\x8f\xd8\xb1\xd9\x90\xd9\x8a\xd8\xaf\xd9\x8f");
}
if (str_eq(tense, EL_STR("future"))) {
el_val_t pres = ar_irregular_araada(slot, EL_STR("present"));
return el_str_concat(EL_STR("\xd8\xb3\xd9\x8e"), pres);
}
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xa7\xd8\xaf\xd9\x8e");
return 0;
}
el_val_t ar_irregular_istata(el_val_t slot, el_val_t tense) {
if (str_eq(tense, EL_STR("past"))) {
if (slot == 0) {
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xa7\xd8\xb9\xd9\x8e");
}
if (slot == 1) {
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xa7\xd8\xb9\xd9\x8e\xd8\xaa\xd9\x92");
}
if (slot == 2) {
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xb9\xd9\x92\xd8\xaa\xd9\x8e");
}
if (slot == 3) {
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xb9\xd9\x92\xd8\xaa\xd9\x90");
}
if (slot == 4) {
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xb9\xd9\x92\xd8\xaa\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xa7\xd8\xb9\xd9\x8f\xd9\x88\xd8\xa7");
}
if (slot == 6) {
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xb9\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xb9\xd9\x92\xd8\xaa\xd9\x8f\xd9\x85\xd9\x92");
}
if (slot == 8) {
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xb9\xd9\x92\xd8\xaa\xd9\x8f\xd9\x86\xd9\x8e\xd9\x91");
}
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xb9\xd9\x92\xd9\x86\xd9\x8e\xd8\xa7");
}
if (str_eq(tense, EL_STR("present"))) {
if (slot == 0) {
return EL_STR("\xd9\x8a\xd9\x8e\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x90\xd9\x8a\xd8\xb9\xd9\x8f");
}
if (slot == 1) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x90\xd9\x8a\xd8\xb9\xd9\x8f");
}
if (slot == 2) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x90\xd9\x8a\xd8\xb9\xd9\x8f");
}
if (slot == 3) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x90\xd9\x8a\xd8\xb9\xd9\x90\xd9\x8a\xd9\x86\xd9\x8e");
}
if (slot == 4) {
return EL_STR("\xd8\xa3\xd9\x8e\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x90\xd9\x8a\xd8\xb9\xd9\x8f");
}
if (slot == 5) {
return EL_STR("\xd9\x8a\xd9\x8e\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x90\xd9\x8a\xd8\xb9\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 6) {
return EL_STR("\xd9\x8a\xd9\x8e\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x90\xd8\xb9\xd9\x92\xd9\x86\xd9\x8e");
}
if (slot == 7) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x90\xd9\x8a\xd8\xb9\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e");
}
if (slot == 8) {
return EL_STR("\xd8\xaa\xd9\x8e\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x90\xd8\xb9\xd9\x92\xd9\x86\xd9\x8e");
}
return EL_STR("\xd9\x86\xd9\x8e\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x90\xd9\x8a\xd8\xb9\xd9\x8f");
}
if (str_eq(tense, EL_STR("future"))) {
el_val_t pres = ar_irregular_istata(slot, EL_STR("present"));
return el_str_concat(EL_STR("\xd8\xb3\xd9\x8e"), pres);
}
return EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xa7\xd8\xb9\xd9\x8e");
return 0;
}
el_val_t ar_irregular(el_val_t verb, el_val_t tense, el_val_t slot) {
if (str_eq(verb, EL_STR("\xd9\x83\xd9\x8e\xd8\xa7\xd9\x86\xd9\x8e"))) {
return ar_irregular_kaana(slot, tense);
}
if (str_eq(verb, EL_STR("\xd9\x82\xd9\x8e\xd8\xa7\xd9\x84\xd9\x8e"))) {
return ar_irregular_qaala(slot, tense);
}
if (str_eq(verb, EL_STR("\xd8\xac\xd9\x8e\xd8\xa7\xd8\xa1\xd9\x8e"))) {
return ar_irregular_jaa(slot, tense);
}
if (str_eq(verb, EL_STR("\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x89"))) {
return ar_irregular_raaa(slot, tense);
}
if (str_eq(verb, EL_STR("\xd8\xa3\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xa7\xd8\xaf\xd9\x8e"))) {
return ar_irregular_araada(slot, tense);
}
if (str_eq(verb, EL_STR("\xd8\xa7\xd9\x90\xd8\xb3\xd9\x92\xd8\xaa\xd9\x8e\xd8\xb7\xd9\x8e\xd8\xa7\xd8\xb9\xd9\x8e"))) {
return ar_irregular_istata(slot, tense);
}
return EL_STR("");
return 0;
}
el_val_t ar_present_stem(el_val_t verb) {
if (str_eq(verb, EL_STR("\xd9\x83\xd9\x8e\xd8\xaa\xd9\x8e\xd8\xa8\xd9\x8e"))) {
return EL_STR("\xd9\x83\xd9\x92\xd8\xaa\xd9\x8f\xd8\xa8\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xb0\xd9\x8e\xd9\x87\xd9\x8e\xd8\xa8\xd9\x8e"))) {
return EL_STR("\xd8\xb0\xd9\x92\xd9\x87\xd9\x8e\xd8\xa8\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xa3\xd9\x8e\xd9\x83\xd9\x8e\xd9\x84\xd9\x8e"))) {
return EL_STR("\xd8\xa3\xd9\x92\xd9\x83\xd9\x8f\xd9\x84\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xb4\xd9\x8e\xd8\xb1\xd9\x90\xd8\xa8\xd9\x8e"))) {
return EL_STR("\xd8\xb4\xd9\x92\xd8\xb1\xd9\x8e\xd8\xa8\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xb9\xd9\x8e\xd8\xb1\xd9\x8e\xd9\x81\xd9\x8e"))) {
return EL_STR("\xd8\xb9\xd9\x92\xd8\xb1\xd9\x90\xd9\x81\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd9\x81\xd9\x8e\xd8\xb9\xd9\x8e\xd9\x84\xd9\x8e"))) {
return EL_STR("\xd9\x81\xd9\x92\xd8\xb9\xd9\x8e\xd9\x84\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xa3\xd9\x8e\xd8\xae\xd9\x8e\xd8\xb0\xd9\x8e"))) {
return EL_STR("\xd8\xa3\xd9\x92\xd8\xae\xd9\x8f\xd8\xb0\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xb9\xd9\x8e\xd9\x85\xd9\x90\xd9\x84\xd9\x8e"))) {
return EL_STR("\xd8\xb9\xd9\x92\xd9\x85\xd9\x8e\xd9\x84\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xaf\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xb3\xd9\x8e"))) {
return EL_STR("\xd8\xaf\xd9\x92\xd8\xb1\xd9\x8f\xd8\xb3\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd9\x81\xd9\x8e\xd9\x87\xd9\x90\xd9\x85\xd9\x8e"))) {
return EL_STR("\xd9\x81\xd9\x92\xd9\x87\xd9\x8e\xd9\x85\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xb3\xd9\x8e\xd9\x85\xd9\x90\xd8\xb9\xd9\x8e"))) {
return EL_STR("\xd8\xb3\xd9\x92\xd9\x85\xd9\x8e\xd8\xb9\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xac\xd9\x8e\xd9\x84\xd9\x8e\xd8\xb3\xd9\x8e"))) {
return EL_STR("\xd8\xac\xd9\x92\xd9\x84\xd9\x90\xd8\xb3\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd9\x81\xd9\x8e\xd8\xaa\xd9\x8e\xd8\xad\xd9\x8e"))) {
return EL_STR("\xd9\x81\xd9\x92\xd8\xaa\xd9\x8e\xd8\xad\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xae\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xac\xd9\x8e"))) {
return EL_STR("\xd8\xae\xd9\x92\xd8\xb1\xd9\x8f\xd8\xac\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xaf\xd9\x8e\xd8\xae\xd9\x8e\xd9\x84\xd9\x8e"))) {
return EL_STR("\xd8\xaf\xd9\x92\xd8\xae\xd9\x8f\xd9\x84\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd9\x88\xd9\x8e\xd8\xac\xd9\x8e\xd8\xaf\xd9\x8e"))) {
return EL_STR("\xd8\xac\xd9\x90\xd8\xaf\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xb5\xd9\x8e\xd9\x86\xd9\x8e\xd8\xb9\xd9\x8e"))) {
return EL_STR("\xd8\xb5\xd9\x92\xd9\x86\xd9\x8e\xd8\xb9\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd8\xb1\xd9\x8e\xd8\xac\xd9\x8e\xd8\xb9\xd9\x8e"))) {
return EL_STR("\xd8\xb1\xd9\x92\xd8\xac\xd9\x90\xd8\xb9\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd9\x88\xd9\x8e\xd9\x82\xd9\x8e\xd9\x81\xd9\x8e"))) {
return EL_STR("\xd9\x82\xd9\x90\xd9\x81\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd9\x82\xd9\x8e\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8e"))) {
return EL_STR("\xd9\x82\xd9\x92\xd8\xb1\xd9\x8e\xd8\xa3\xd9\x8f");
}
if (str_eq(verb, EL_STR("\xd9\x83\xd9\x8e\xd8\xb0\xd9\x8e\xd8\xa8\xd9\x8e"))) {
return EL_STR("\xd9\x83\xd9\x92\xd8\xb0\xd9\x90\xd8\xa8\xd9\x8f");
}
return EL_STR("");
return 0;
}
el_val_t ar_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number) {
el_val_t slot = ar_slot(person, gender, number);
el_val_t irreg = ar_irregular(verb, tense, slot);
if (!str_eq(irreg, EL_STR(""))) {
return irreg;
}
el_val_t present_stem = ar_present_stem(verb);
if (!str_eq(present_stem, EL_STR(""))) {
return ar_conjugate_form1(verb, present_stem, tense, slot);
}
return verb;
return 0;
}
el_val_t ar_is_sun_letter(el_val_t c) {
if (str_eq(c, EL_STR("\xd8\xaa"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xab"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xaf"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xb0"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xb1"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xb2"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xb3"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xb4"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xb5"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xb6"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xb7"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd8\xb8"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd9\x84"))) {
return 1;
}
if (str_eq(c, EL_STR("\xd9\x86"))) {
return 1;
}
return 0;
return 0;
}
el_val_t ar_definite_article(el_val_t noun) {
el_val_t n = ar_str_len(noun);
if (n == 0) {
return noun;
}
el_val_t first = str_slice(noun, 0, 1);
if (ar_is_sun_letter(first)) {
el_val_t shadda = EL_STR("\xd9\x91");
el_val_t rest = str_slice(noun, 1, n);
return el_str_concat(el_str_concat(el_str_concat(EL_STR("\xd8\xa7\xd9\x84"), first), shadda), rest);
}
return el_str_concat(EL_STR("\xd8\xa7\xd9\x84"), noun);
return 0;
}
el_val_t ar_case_ending(el_val_t kase, el_val_t definite) {
el_val_t is_def = str_eq(definite, EL_STR("true"));
if (str_eq(kase, EL_STR("nom"))) {
if (is_def) {
return EL_STR("\xd9\x8f");
}
return EL_STR("\xd9\x8c");
}
if (str_eq(kase, EL_STR("acc"))) {
if (is_def) {
return EL_STR("\xd9\x8e");
}
return EL_STR("\xd9\x8b");
}
if (str_eq(kase, EL_STR("gen"))) {
if (is_def) {
return EL_STR("\xd9\x90");
}
return EL_STR("\xd9\x8d");
}
return EL_STR("");
return 0;
}
el_val_t ar_gender(el_val_t noun) {
if (ar_str_ends(noun, EL_STR("\xd8\xa9"))) {
return EL_STR("f");
}
if (ar_str_ends(noun, EL_STR("\xd9\x80\xd8\xa9"))) {
return EL_STR("f");
}
return EL_STR("m");
return 0;
}
el_val_t ar_masc_pl_ending(el_val_t kase) {
if (str_eq(kase, EL_STR("nom"))) {
return EL_STR("\xd9\x88\xd9\x86\xd9\x8e");
}
return EL_STR("\xd9\x8a\xd9\x86\xd9\x8e");
return 0;
}
el_val_t ar_sound_plural(el_val_t noun, el_val_t gender) {
if (str_eq(gender, EL_STR("f"))) {
if (ar_str_ends(noun, EL_STR("\xd8\xa9"))) {
el_val_t base = ar_str_drop_last(noun, 1);
return el_str_concat(base, EL_STR("\xd8\xa7\xd8\xaa"));
}
return el_str_concat(noun, EL_STR("\xd8\xa7\xd8\xaa"));
}
return el_str_concat(noun, EL_STR("\xd9\x88\xd9\x86"));
return 0;
}
el_val_t ar_noun_form(el_val_t noun, el_val_t gender, el_val_t kase, el_val_t number, el_val_t definite) {
el_val_t g = gender;
if (str_eq(g, EL_STR(""))) {
g = ar_gender(noun);
}
el_val_t stem = noun;
if (str_eq(number, EL_STR("plural"))) {
if (str_eq(g, EL_STR("m"))) {
el_val_t pl_suf = ar_masc_pl_ending(kase);
if (str_eq(definite, EL_STR("true"))) {
el_val_t def_stem = ar_definite_article(noun);
return el_str_concat(def_stem, pl_suf);
}
return el_str_concat(noun, pl_suf);
}
el_val_t fem_pl = ar_sound_plural(noun, EL_STR("f"));
el_val_t case_end = ar_case_ending(kase, definite);
if (str_eq(definite, EL_STR("true"))) {
return el_str_concat(ar_definite_article(fem_pl), case_end);
}
return el_str_concat(fem_pl, case_end);
}
el_val_t case_end = ar_case_ending(kase, definite);
if (str_eq(definite, EL_STR("true"))) {
el_val_t def_stem = ar_definite_article(noun);
return el_str_concat(def_stem, case_end);
}
return el_str_concat(noun, case_end);
return 0;
}
el_val_t ar_verb_form(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
return ar_conjugate(verb, tense, person, EL_STR("m"), number);
return 0;
}
-27
View File
@@ -1,27 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn ar_str_ends(s: String, suf: String) -> Bool
extern fn ar_str_len(s: String) -> Int
extern fn ar_str_drop_last(s: String, n: Int) -> String
extern fn ar_str_last_char(s: String) -> String
extern fn ar_slot(person: String, gender: String, number: String) -> Int
extern fn ar_perfect_suffix(slot: Int) -> String
extern fn ar_imperfect_prefix(slot: Int) -> String
extern fn ar_imperfect_suffix(slot: Int) -> String
extern fn ar_conjugate_form1(past_base: String, present_stem: String, tense: String, slot: Int) -> String
extern fn ar_irregular_kaana(slot: Int, tense: String) -> String
extern fn ar_irregular_qaala(slot: Int, tense: String) -> String
extern fn ar_irregular_jaa(slot: Int, tense: String) -> String
extern fn ar_irregular_raaa(slot: Int, tense: String) -> String
extern fn ar_irregular_araada(slot: Int, tense: String) -> String
extern fn ar_irregular_istata(slot: Int, tense: String) -> String
extern fn ar_irregular(verb: String, tense: String, slot: Int) -> String
extern fn ar_present_stem(verb: String) -> String
extern fn ar_conjugate(verb: String, tense: String, person: String, gender: String, number: String) -> String
extern fn ar_is_sun_letter(c: String) -> Bool
extern fn ar_definite_article(noun: String) -> String
extern fn ar_case_ending(kase: String, definite: String) -> String
extern fn ar_gender(noun: String) -> String
extern fn ar_masc_pl_ending(kase: String) -> String
extern fn ar_sound_plural(noun: String, gender: String) -> String
extern fn ar_noun_form(noun: String, gender: String, kase: String, number: String, definite: String) -> String
extern fn ar_verb_form(verb: String, tense: String, person: String, number: String) -> String
-556
View File
@@ -1,556 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t cop_str_ends(el_val_t s, el_val_t suf);
el_val_t cop_str_len(el_val_t s);
el_val_t cop_drop(el_val_t s, el_val_t n);
el_val_t cop_last_char(el_val_t s);
el_val_t cop_slot(el_val_t person, el_val_t number);
el_val_t cop_subject_prefix(el_val_t person, el_val_t number);
el_val_t cop_subject_prefix_gendered(el_val_t person, el_val_t gender, el_val_t number);
el_val_t cop_copula_particle(el_val_t gender, el_val_t number);
el_val_t cop_shwpe_present(el_val_t prefix);
el_val_t cop_shwpe_perfect(el_val_t prefix);
el_val_t cop_shwpe_future(el_val_t prefix);
el_val_t cop_bwk_present(el_val_t prefix);
el_val_t cop_bwk_perfect(el_val_t prefix);
el_val_t cop_bwk_future(el_val_t prefix);
el_val_t cop_nau_present(el_val_t prefix);
el_val_t cop_nau_perfect(el_val_t prefix);
el_val_t cop_nau_future(el_val_t prefix);
el_val_t cop_jw_present(el_val_t prefix);
el_val_t cop_jw_perfect(el_val_t prefix);
el_val_t cop_jw_future(el_val_t prefix);
el_val_t cop_di_present(el_val_t prefix);
el_val_t cop_di_perfect(el_val_t prefix);
el_val_t cop_di_future(el_val_t prefix);
el_val_t cop_is_copula(el_val_t verb);
el_val_t cop_known_verb_prefixed(el_val_t verb, el_val_t tense, el_val_t prefix);
el_val_t cop_regular_present(el_val_t prefix, el_val_t stem);
el_val_t cop_regular_perfect(el_val_t prefix, el_val_t stem);
el_val_t cop_regular_future(el_val_t prefix, el_val_t stem);
el_val_t cop_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t cop_article(el_val_t gender, el_val_t number, el_val_t definite);
el_val_t cop_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t cop_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t cop_noun_phrase_gendered(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite, el_val_t gender);
el_val_t cop_map_canonical(el_val_t verb);
el_val_t cop_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t cop_str_len(el_val_t s) {
return str_len(s);
return 0;
}
el_val_t cop_drop(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t cop_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t cop_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t cop_subject_prefix(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return EL_STR("\xe2\xb2\x81");
}
return EL_STR("\xe2\xb2\x9b");
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return EL_STR("\xe2\xb2\x95");
}
return EL_STR("\xe2\xb2\xa7\xe2\xb2\x89\xe2\xb2\xa7\xe2\xb2\x89\xe2\xb2\x9b");
}
if (str_eq(number, EL_STR("singular"))) {
return EL_STR("\xcf\xa5");
}
return EL_STR("\xe2\xb2\xa5\xe2\xb2\x89");
return 0;
}
el_val_t cop_subject_prefix_gendered(el_val_t person, el_val_t gender, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return EL_STR("\xe2\xb2\x81");
}
return EL_STR("\xe2\xb2\x9b");
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("\xe2\xb2\xa7\xe2\xb2\x89");
}
return EL_STR("\xe2\xb2\x95");
}
return EL_STR("\xe2\xb2\xa7\xe2\xb2\x89\xe2\xb2\xa7\xe2\xb2\x89\xe2\xb2\x9b");
}
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("\xe2\xb2\xa5");
}
return EL_STR("\xcf\xa5");
}
return EL_STR("\xe2\xb2\xa5\xe2\xb2\x89");
return 0;
}
el_val_t cop_copula_particle(el_val_t gender, el_val_t number) {
if (str_eq(number, EL_STR("plural"))) {
return EL_STR("\xe2\xb2\x9b\xe2\xb2\x89");
}
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("\xe2\xb2\xa7\xe2\xb2\x89");
}
return EL_STR("\xe2\xb2\xa1\xe2\xb2\x89");
return 0;
}
el_val_t cop_shwpe_present(el_val_t prefix) {
return el_str_concat(prefix, EL_STR("\xcf\xa3\xe2\xb2\x9f\xe2\xb2\x9f\xe2\xb2\xa1"));
return 0;
}
el_val_t cop_shwpe_perfect(el_val_t prefix) {
return el_str_concat(el_str_concat(EL_STR("\xe2\xb2\x81"), prefix), EL_STR("\xcf\xa3\xe2\xb2\xb1\xe2\xb2\xa1\xe2\xb2\x89"));
return 0;
}
el_val_t cop_shwpe_future(el_val_t prefix) {
return el_str_concat(prefix, EL_STR("\xe2\xb2\x9b\xe2\xb2\x81\xcf\xa3\xe2\xb2\xb1\xe2\xb2\xa1\xe2\xb2\x89"));
return 0;
}
el_val_t cop_bwk_present(el_val_t prefix) {
return el_str_concat(prefix, EL_STR("\xe2\xb2\x83\xe2\xb2\xb1\xe2\xb2\x95"));
return 0;
}
el_val_t cop_bwk_perfect(el_val_t prefix) {
return el_str_concat(el_str_concat(EL_STR("\xe2\xb2\x81"), prefix), EL_STR("\xe2\xb2\x83\xe2\xb2\xb1\xe2\xb2\x95"));
return 0;
}
el_val_t cop_bwk_future(el_val_t prefix) {
return el_str_concat(prefix, EL_STR("\xe2\xb2\x9b\xe2\xb2\x81\xe2\xb2\x83\xe2\xb2\xb1\xe2\xb2\x95"));
return 0;
}
el_val_t cop_nau_present(el_val_t prefix) {
return el_str_concat(prefix, EL_STR("\xe2\xb2\x9b\xe2\xb2\x81\xe2\xb2\xa9"));
return 0;
}
el_val_t cop_nau_perfect(el_val_t prefix) {
return el_str_concat(el_str_concat(EL_STR("\xe2\xb2\x81"), prefix), EL_STR("\xe2\xb2\x9b\xe2\xb2\x81\xe2\xb2\xa9"));
return 0;
}
el_val_t cop_nau_future(el_val_t prefix) {
return el_str_concat(prefix, EL_STR("\xe2\xb2\x9b\xe2\xb2\x81\xe2\xb2\x9b\xe2\xb2\x81\xe2\xb2\xa9"));
return 0;
}
el_val_t cop_jw_present(el_val_t prefix) {
return el_str_concat(prefix, EL_STR("\xcf\xab\xe2\xb2\xb1"));
return 0;
}
el_val_t cop_jw_perfect(el_val_t prefix) {
return el_str_concat(el_str_concat(EL_STR("\xe2\xb2\x81"), prefix), EL_STR("\xcf\xab\xe2\xb2\xb1"));
return 0;
}
el_val_t cop_jw_future(el_val_t prefix) {
return el_str_concat(prefix, EL_STR("\xe2\xb2\x9b\xe2\xb2\x81\xcf\xab\xe2\xb2\xb1"));
return 0;
}
el_val_t cop_di_present(el_val_t prefix) {
return el_str_concat(prefix, EL_STR("\xcf\xaf"));
return 0;
}
el_val_t cop_di_perfect(el_val_t prefix) {
return el_str_concat(el_str_concat(EL_STR("\xe2\xb2\x81"), prefix), EL_STR("\xcf\xaf"));
return 0;
}
el_val_t cop_di_future(el_val_t prefix) {
return el_str_concat(prefix, EL_STR("\xe2\xb2\x9b\xe2\xb2\x81\xcf\xaf"));
return 0;
}
el_val_t cop_is_copula(el_val_t verb) {
if (str_eq(verb, EL_STR("\xcf\xa3\xcf\x89\xcf\x80\xce\xb5"))) {
return 1;
}
if (str_eq(verb, EL_STR("shwpe"))) {
return 1;
}
if (str_eq(verb, EL_STR("be"))) {
return 1;
}
return 0;
return 0;
}
el_val_t cop_known_verb_prefixed(el_val_t verb, el_val_t tense, el_val_t prefix) {
if (str_eq(verb, EL_STR("\xcf\xa3\xcf\x89\xcf\x80\xce\xb5"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_shwpe_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_shwpe_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_shwpe_future(prefix);
}
return cop_shwpe_present(prefix);
}
if (str_eq(verb, EL_STR("shwpe"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_shwpe_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_shwpe_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_shwpe_future(prefix);
}
return cop_shwpe_present(prefix);
}
if (str_eq(verb, EL_STR("bwk"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_bwk_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_bwk_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_bwk_future(prefix);
}
return cop_bwk_present(prefix);
}
if (str_eq(verb, EL_STR("\xe2\xb2\x83\xe2\xb2\xb1\xe2\xb2\x95"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_bwk_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_bwk_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_bwk_future(prefix);
}
return cop_bwk_present(prefix);
}
if (str_eq(verb, EL_STR("go"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_bwk_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_bwk_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_bwk_future(prefix);
}
return cop_bwk_present(prefix);
}
if (str_eq(verb, EL_STR("nau"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_nau_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_nau_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_nau_future(prefix);
}
return cop_nau_present(prefix);
}
if (str_eq(verb, EL_STR("\xe2\xb2\x9b\xe2\xb2\x81\xe2\xb2\xa9"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_nau_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_nau_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_nau_future(prefix);
}
return cop_nau_present(prefix);
}
if (str_eq(verb, EL_STR("see"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_nau_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_nau_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_nau_future(prefix);
}
return cop_nau_present(prefix);
}
if (str_eq(verb, EL_STR("jw"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_jw_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_jw_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_jw_future(prefix);
}
return cop_jw_present(prefix);
}
if (str_eq(verb, EL_STR("\xcf\xab\xe2\xb2\xb1"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_jw_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_jw_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_jw_future(prefix);
}
return cop_jw_present(prefix);
}
if (str_eq(verb, EL_STR("say"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_jw_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_jw_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_jw_future(prefix);
}
return cop_jw_present(prefix);
}
if (str_eq(verb, EL_STR("di"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_di_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_di_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_di_future(prefix);
}
return cop_di_present(prefix);
}
if (str_eq(verb, EL_STR("\xcf\xaf"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_di_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_di_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_di_future(prefix);
}
return cop_di_present(prefix);
}
if (str_eq(verb, EL_STR("give"))) {
if (str_eq(tense, EL_STR("present"))) {
return cop_di_present(prefix);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_di_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_di_future(prefix);
}
return cop_di_present(prefix);
}
return EL_STR("");
return 0;
}
el_val_t cop_regular_present(el_val_t prefix, el_val_t stem) {
return el_str_concat(prefix, stem);
return 0;
}
el_val_t cop_regular_perfect(el_val_t prefix, el_val_t stem) {
return el_str_concat(el_str_concat(EL_STR("\xe2\xb2\x81"), prefix), stem);
return 0;
}
el_val_t cop_regular_future(el_val_t prefix, el_val_t stem) {
return el_str_concat(el_str_concat(prefix, EL_STR("\xe2\xb2\x9b\xe2\xb2\x81")), stem);
return 0;
}
el_val_t cop_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t prefix = cop_subject_prefix(person, number);
if (str_eq(verb, EL_STR("be"))) {
if (str_eq(tense, EL_STR("present"))) {
return EL_STR("");
}
if (str_eq(tense, EL_STR("past"))) {
return cop_shwpe_perfect(prefix);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_shwpe_future(prefix);
}
return EL_STR("");
}
el_val_t known = cop_known_verb_prefixed(verb, tense, prefix);
if (!str_eq(known, EL_STR(""))) {
return known;
}
if (str_eq(tense, EL_STR("present"))) {
return cop_regular_present(prefix, verb);
}
if (str_eq(tense, EL_STR("past"))) {
return cop_regular_perfect(prefix, verb);
}
if (str_eq(tense, EL_STR("future"))) {
return cop_regular_future(prefix, verb);
}
return verb;
return 0;
}
el_val_t cop_article(el_val_t gender, el_val_t number, el_val_t definite) {
if (str_eq(definite, EL_STR("true"))) {
if (str_eq(number, EL_STR("plural"))) {
return EL_STR("\xe2\xb2\x9b");
}
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("\xe2\xb2\xa7");
}
return EL_STR("\xe2\xb2\xa1");
}
if (str_eq(number, EL_STR("plural"))) {
return EL_STR("\xcf\xa9\xe2\xb2\x89\xe2\xb2\x9b");
}
return EL_STR("\xe2\xb2\x9f\xe2\xb2\xa9");
return 0;
}
el_val_t cop_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
return noun;
}
if (cop_str_ends(noun, EL_STR("\xe2\xb2\x89"))) {
el_val_t stem = cop_drop(noun, 1);
return el_str_concat(stem, EL_STR("\xe2\xb2\x9f\xe2\xb2\x9f\xe2\xb2\xa9\xe2\xb2\x89"));
}
return noun;
return 0;
}
el_val_t cop_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
el_val_t form = cop_decline(noun, gram_case, number);
el_val_t art = cop_article(EL_STR("m"), number, definite);
if (str_eq(definite, EL_STR("true"))) {
return el_str_concat(art, form);
}
if (str_eq(definite, EL_STR("false"))) {
return el_str_concat(art, form);
}
return form;
return 0;
}
el_val_t cop_noun_phrase_gendered(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite, el_val_t gender) {
el_val_t form = cop_decline(noun, gram_case, number);
el_val_t art = cop_article(gender, number, definite);
if (str_eq(definite, EL_STR("true"))) {
return el_str_concat(art, form);
}
if (str_eq(definite, EL_STR("false"))) {
return el_str_concat(art, form);
}
return form;
return 0;
}
el_val_t cop_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("be");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("bwk");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("nau");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("jw");
}
if (str_eq(verb, EL_STR("speak"))) {
return EL_STR("jw");
}
if (str_eq(verb, EL_STR("give"))) {
return EL_STR("di");
}
return verb;
return 0;
}
-35
View File
@@ -1,35 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn cop_str_ends(s: String, suf: String) -> Bool
extern fn cop_str_len(s: String) -> Int
extern fn cop_drop(s: String, n: Int) -> String
extern fn cop_last_char(s: String) -> String
extern fn cop_slot(person: String, number: String) -> Int
extern fn cop_subject_prefix(person: String, number: String) -> String
extern fn cop_subject_prefix_gendered(person: String, gender: String, number: String) -> String
extern fn cop_copula_particle(gender: String, number: String) -> String
extern fn cop_shwpe_present(prefix: String) -> String
extern fn cop_shwpe_perfect(prefix: String) -> String
extern fn cop_shwpe_future(prefix: String) -> String
extern fn cop_bwk_present(prefix: String) -> String
extern fn cop_bwk_perfect(prefix: String) -> String
extern fn cop_bwk_future(prefix: String) -> String
extern fn cop_nau_present(prefix: String) -> String
extern fn cop_nau_perfect(prefix: String) -> String
extern fn cop_nau_future(prefix: String) -> String
extern fn cop_jw_present(prefix: String) -> String
extern fn cop_jw_perfect(prefix: String) -> String
extern fn cop_jw_future(prefix: String) -> String
extern fn cop_di_present(prefix: String) -> String
extern fn cop_di_perfect(prefix: String) -> String
extern fn cop_di_future(prefix: String) -> String
extern fn cop_is_copula(verb: String) -> Bool
extern fn cop_known_verb_prefixed(verb: String, tense: String, prefix: String) -> String
extern fn cop_regular_present(prefix: String, stem: String) -> String
extern fn cop_regular_perfect(prefix: String, stem: String) -> String
extern fn cop_regular_future(prefix: String, stem: String) -> String
extern fn cop_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn cop_article(gender: String, number: String, definite: String) -> String
extern fn cop_decline(noun: String, gram_case: String, number: String) -> String
extern fn cop_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
extern fn cop_noun_phrase_gendered(noun: String, gram_case: String, number: String, definite: String, gender: String) -> String
extern fn cop_map_canonical(verb: String) -> String
-1172
View File
File diff suppressed because it is too large Load Diff
-13
View File
@@ -1,13 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn de_article_def(gender: String, gram_case: String, number: String) -> String
extern fn de_article_indef(gender: String, gram_case: String, number: String) -> String
extern fn de_article(gender: String, gram_case: String, number: String, definite: String) -> String
extern fn de_adj_ending(gender: String, gram_case: String, number: String, article_type: String) -> String
extern fn de_noun_plural(noun: String, gender: String) -> String
extern fn de_case_ending(noun: String, gender: String, gram_case: String, number: String) -> String
extern fn de_conjugate_weak(stem: String, tense: String, person: String, number: String) -> String
extern fn de_irregular_present(verb: String, person: String, number: String) -> String
extern fn de_strong_past_stem(verb: String) -> String
extern fn de_norm_number(number: String) -> String
extern fn de_norm_person(person: String) -> String
extern fn de_conjugate(verb: String, tense: String, person: String, number: String) -> String
-634
View File
@@ -1,634 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t egy_str_ends(el_val_t s, el_val_t suf);
el_val_t egy_str_len(el_val_t s);
el_val_t egy_drop(el_val_t s, el_val_t n);
el_val_t egy_last_char(el_val_t s);
el_val_t egy_slot(el_val_t person, el_val_t number);
el_val_t egy_slot_with_gender(el_val_t person, el_val_t gender, el_val_t number);
el_val_t egy_conjugate_pronoun(el_val_t person, el_val_t number);
el_val_t egy_suffix_pronoun(el_val_t slot);
el_val_t egy_is_copula(el_val_t verb);
el_val_t egy_conjugate_copula(el_val_t tense, el_val_t slot);
el_val_t egy_rdi_present(el_val_t slot);
el_val_t egy_rdi_past(el_val_t slot);
el_val_t egy_rdi_future(el_val_t slot);
el_val_t egy_mAA_present(el_val_t slot);
el_val_t egy_mAA_past(el_val_t slot);
el_val_t egy_mAA_future(el_val_t slot);
el_val_t egy_Dd_present(el_val_t slot);
el_val_t egy_Dd_past(el_val_t slot);
el_val_t egy_Dd_future(el_val_t slot);
el_val_t egy_Sm_present(el_val_t slot);
el_val_t egy_Sm_past(el_val_t slot);
el_val_t egy_Sm_future(el_val_t slot);
el_val_t egy_iri_present(el_val_t slot);
el_val_t egy_iri_past(el_val_t slot);
el_val_t egy_iri_future(el_val_t slot);
el_val_t egy_sdm_present(el_val_t slot);
el_val_t egy_sdm_past(el_val_t slot);
el_val_t egy_sdm_future(el_val_t slot);
el_val_t egy_known_verb(el_val_t verb, el_val_t tense, el_val_t slot);
el_val_t egy_regular_present(el_val_t stem, el_val_t slot);
el_val_t egy_regular_past(el_val_t stem, el_val_t slot);
el_val_t egy_regular_future(el_val_t stem, el_val_t slot);
el_val_t egy_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t egy_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t egy_fem(el_val_t noun);
el_val_t egy_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t egy_map_canonical(el_val_t verb);
el_val_t egy_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t egy_str_len(el_val_t s) {
return str_len(s);
return 0;
}
el_val_t egy_drop(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t egy_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t egy_slot(el_val_t person, el_val_t number) {
if (str_eq(number, EL_STR("dual"))) {
return 8;
}
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("plural"))) {
return 5;
}
return 0;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("plural"))) {
return 6;
}
return 1;
}
if (str_eq(number, EL_STR("plural"))) {
return 7;
}
return 3;
return 0;
}
el_val_t egy_slot_with_gender(el_val_t person, el_val_t gender, el_val_t number) {
if (str_eq(number, EL_STR("dual"))) {
return 8;
}
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("plural"))) {
return 5;
}
return 0;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("plural"))) {
return 6;
}
if (str_eq(gender, EL_STR("f"))) {
return 2;
}
return 1;
}
if (str_eq(number, EL_STR("plural"))) {
return 7;
}
if (str_eq(gender, EL_STR("f"))) {
return 4;
}
return 3;
return 0;
}
el_val_t egy_conjugate_pronoun(el_val_t person, el_val_t number) {
el_val_t slot = egy_slot(person, number);
if (slot == 0) {
return EL_STR("=i");
}
if (slot == 1) {
return EL_STR("=k");
}
if (slot == 5) {
return EL_STR("=n");
}
if (slot == 6) {
return EL_STR("=Tn");
}
if (slot == 7) {
return EL_STR("=sn");
}
if (slot == 8) {
return EL_STR("=sny");
}
return EL_STR("=f");
return 0;
}
el_val_t egy_suffix_pronoun(el_val_t slot) {
if (slot == 0) {
return EL_STR("=i");
}
if (slot == 1) {
return EL_STR("=k");
}
if (slot == 2) {
return EL_STR("=T");
}
if (slot == 3) {
return EL_STR("=f");
}
if (slot == 4) {
return EL_STR("=s");
}
if (slot == 5) {
return EL_STR("=n");
}
if (slot == 6) {
return EL_STR("=Tn");
}
if (slot == 7) {
return EL_STR("=sn");
}
return EL_STR("=sny");
return 0;
}
el_val_t egy_is_copula(el_val_t verb) {
if (str_eq(verb, EL_STR("wnn"))) {
return 1;
}
if (str_eq(verb, EL_STR("be"))) {
return 1;
}
return 0;
return 0;
}
el_val_t egy_conjugate_copula(el_val_t tense, el_val_t slot) {
if (str_eq(tense, EL_STR("present"))) {
return EL_STR("");
}
if (str_eq(tense, EL_STR("past"))) {
return el_str_concat(EL_STR("wnn.n"), egy_suffix_pronoun(slot));
}
if (str_eq(tense, EL_STR("future"))) {
return el_str_concat(EL_STR("wnn.xr"), egy_suffix_pronoun(slot));
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("wnn");
}
return EL_STR("");
return 0;
}
el_val_t egy_rdi_present(el_val_t slot) {
return el_str_concat(EL_STR("di"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_rdi_past(el_val_t slot) {
return el_str_concat(EL_STR("di.n"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_rdi_future(el_val_t slot) {
return el_str_concat(EL_STR("di.xr"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_mAA_present(el_val_t slot) {
return el_str_concat(EL_STR("mAA"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_mAA_past(el_val_t slot) {
return el_str_concat(EL_STR("mAA.n"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_mAA_future(el_val_t slot) {
return el_str_concat(EL_STR("mAA.xr"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_Dd_present(el_val_t slot) {
return el_str_concat(EL_STR("Dd"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_Dd_past(el_val_t slot) {
return el_str_concat(EL_STR("Dd.n"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_Dd_future(el_val_t slot) {
return el_str_concat(EL_STR("Dd.xr"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_Sm_present(el_val_t slot) {
return el_str_concat(EL_STR("Sm"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_Sm_past(el_val_t slot) {
return el_str_concat(EL_STR("Sm.n"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_Sm_future(el_val_t slot) {
return el_str_concat(EL_STR("Sm.xr"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_iri_present(el_val_t slot) {
return el_str_concat(EL_STR("ir"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_iri_past(el_val_t slot) {
return el_str_concat(EL_STR("ir.n"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_iri_future(el_val_t slot) {
return el_str_concat(EL_STR("ir.xr"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_sdm_present(el_val_t slot) {
return el_str_concat(EL_STR("sdm"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_sdm_past(el_val_t slot) {
return el_str_concat(EL_STR("sdm.n"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_sdm_future(el_val_t slot) {
return el_str_concat(EL_STR("sdm.xr"), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_known_verb(el_val_t verb, el_val_t tense, el_val_t slot) {
if (str_eq(verb, EL_STR("rdi"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_rdi_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_rdi_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_rdi_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("rdi");
}
return egy_rdi_present(slot);
}
if (str_eq(verb, EL_STR("di"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_rdi_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_rdi_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_rdi_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("rdi");
}
return egy_rdi_present(slot);
}
if (str_eq(verb, EL_STR("give"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_rdi_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_rdi_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_rdi_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("rdi");
}
return egy_rdi_present(slot);
}
if (str_eq(verb, EL_STR("mAA"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_mAA_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_mAA_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_mAA_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("mAA");
}
return egy_mAA_present(slot);
}
if (str_eq(verb, EL_STR("see"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_mAA_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_mAA_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_mAA_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("mAA");
}
return egy_mAA_present(slot);
}
if (str_eq(verb, EL_STR("Dd"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_Dd_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_Dd_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_Dd_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("Dd");
}
return egy_Dd_present(slot);
}
if (str_eq(verb, EL_STR("say"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_Dd_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_Dd_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_Dd_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("Dd");
}
return egy_Dd_present(slot);
}
if (str_eq(verb, EL_STR("Sm"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_Sm_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_Sm_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_Sm_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("Sm");
}
return egy_Sm_present(slot);
}
if (str_eq(verb, EL_STR("go"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_Sm_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_Sm_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_Sm_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("Sm");
}
return egy_Sm_present(slot);
}
if (str_eq(verb, EL_STR("iri"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_iri_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_iri_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_iri_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("iri");
}
return egy_iri_present(slot);
}
if (str_eq(verb, EL_STR("do"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_iri_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_iri_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_iri_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("iri");
}
return egy_iri_present(slot);
}
if (str_eq(verb, EL_STR("make"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_iri_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_iri_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_iri_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("iri");
}
return egy_iri_present(slot);
}
if (str_eq(verb, EL_STR("sdm"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_sdm_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_sdm_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_sdm_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("sdm");
}
return egy_sdm_present(slot);
}
if (str_eq(verb, EL_STR("hear"))) {
if (str_eq(tense, EL_STR("present"))) {
return egy_sdm_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_sdm_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_sdm_future(slot);
}
if (str_eq(tense, EL_STR("infinitive"))) {
return EL_STR("sdm");
}
return egy_sdm_present(slot);
}
return EL_STR("");
return 0;
}
el_val_t egy_regular_present(el_val_t stem, el_val_t slot) {
return el_str_concat(stem, egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_regular_past(el_val_t stem, el_val_t slot) {
return el_str_concat(el_str_concat(stem, EL_STR(".n")), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_regular_future(el_val_t stem, el_val_t slot) {
return el_str_concat(el_str_concat(stem, EL_STR(".xr")), egy_suffix_pronoun(slot));
return 0;
}
el_val_t egy_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t slot = egy_slot(person, number);
if (egy_is_copula(verb)) {
return egy_conjugate_copula(tense, slot);
}
el_val_t known = egy_known_verb(verb, tense, slot);
if (!str_eq(known, EL_STR(""))) {
return known;
}
if (str_eq(tense, EL_STR("infinitive"))) {
return verb;
}
if (str_eq(tense, EL_STR("present"))) {
return egy_regular_present(verb, slot);
}
if (str_eq(tense, EL_STR("past"))) {
return egy_regular_past(verb, slot);
}
if (str_eq(tense, EL_STR("future"))) {
return egy_regular_future(verb, slot);
}
return verb;
return 0;
}
el_val_t egy_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
return noun;
}
if (str_eq(number, EL_STR("dual"))) {
if (egy_str_ends(noun, EL_STR("t"))) {
el_val_t stem = egy_drop(noun, 1);
return el_str_concat(stem, EL_STR("ty"));
}
return el_str_concat(noun, EL_STR("wy"));
}
if (egy_str_ends(noun, EL_STR("t"))) {
return el_str_concat(noun, EL_STR("wt"));
}
return el_str_concat(noun, EL_STR("w"));
return 0;
}
el_val_t egy_fem(el_val_t noun) {
if (egy_str_ends(noun, EL_STR("t"))) {
return noun;
}
return el_str_concat(noun, EL_STR("t"));
return 0;
}
el_val_t egy_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
return egy_decline(noun, gram_case, number);
return 0;
}
el_val_t egy_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("wnn");
}
if (str_eq(verb, EL_STR("give"))) {
return EL_STR("rdi");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("mAA");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("Dd");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("Sm");
}
if (str_eq(verb, EL_STR("do"))) {
return EL_STR("iri");
}
if (str_eq(verb, EL_STR("make"))) {
return EL_STR("iri");
}
if (str_eq(verb, EL_STR("hear"))) {
return EL_STR("sdm");
}
return verb;
return 0;
}
-38
View File
@@ -1,38 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn egy_str_ends(s: String, suf: String) -> Bool
extern fn egy_str_len(s: String) -> Int
extern fn egy_drop(s: String, n: Int) -> String
extern fn egy_last_char(s: String) -> String
extern fn egy_slot(person: String, number: String) -> Int
extern fn egy_slot_with_gender(person: String, gender: String, number: String) -> Int
extern fn egy_conjugate_pronoun(person: String, number: String) -> String
extern fn egy_suffix_pronoun(slot: Int) -> String
extern fn egy_is_copula(verb: String) -> Bool
extern fn egy_conjugate_copula(tense: String, slot: Int) -> String
extern fn egy_rdi_present(slot: Int) -> String
extern fn egy_rdi_past(slot: Int) -> String
extern fn egy_rdi_future(slot: Int) -> String
extern fn egy_mAA_present(slot: Int) -> String
extern fn egy_mAA_past(slot: Int) -> String
extern fn egy_mAA_future(slot: Int) -> String
extern fn egy_Dd_present(slot: Int) -> String
extern fn egy_Dd_past(slot: Int) -> String
extern fn egy_Dd_future(slot: Int) -> String
extern fn egy_Sm_present(slot: Int) -> String
extern fn egy_Sm_past(slot: Int) -> String
extern fn egy_Sm_future(slot: Int) -> String
extern fn egy_iri_present(slot: Int) -> String
extern fn egy_iri_past(slot: Int) -> String
extern fn egy_iri_future(slot: Int) -> String
extern fn egy_sdm_present(slot: Int) -> String
extern fn egy_sdm_past(slot: Int) -> String
extern fn egy_sdm_future(slot: Int) -> String
extern fn egy_known_verb(verb: String, tense: String, slot: Int) -> String
extern fn egy_regular_present(stem: String, slot: Int) -> String
extern fn egy_regular_past(stem: String, slot: Int) -> String
extern fn egy_regular_future(stem: String, slot: Int) -> String
extern fn egy_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn egy_decline(noun: String, gram_case: String, number: String) -> String
extern fn egy_fem(noun: String) -> String
extern fn egy_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
extern fn egy_map_canonical(verb: String) -> String
-633
View File
@@ -1,633 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t enm_str_ends(el_val_t s, el_val_t suf);
el_val_t enm_drop(el_val_t s, el_val_t n);
el_val_t enm_first_char(el_val_t s);
el_val_t enm_slot(el_val_t person, el_val_t number);
el_val_t enm_been_present(el_val_t slot);
el_val_t enm_been_past(el_val_t slot);
el_val_t enm_haven_present(el_val_t slot);
el_val_t enm_haven_past(el_val_t slot);
el_val_t enm_goon_present(el_val_t slot);
el_val_t enm_goon_past(el_val_t slot);
el_val_t enm_seen_present(el_val_t slot);
el_val_t enm_seen_past(el_val_t slot);
el_val_t enm_seyen_present(el_val_t slot);
el_val_t enm_seyen_past(el_val_t slot);
el_val_t enm_comen_present(el_val_t slot);
el_val_t enm_comen_past(el_val_t slot);
el_val_t enm_maken_present(el_val_t slot);
el_val_t enm_maken_past(el_val_t slot);
el_val_t enm_map_canonical(el_val_t verb);
el_val_t enm_weak_stem(el_val_t verb);
el_val_t enm_weak_present(el_val_t stem, el_val_t slot);
el_val_t enm_weak_past(el_val_t stem, el_val_t slot);
el_val_t enm_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t enm_irregular_plural(el_val_t noun);
el_val_t enm_make_plural(el_val_t noun);
el_val_t enm_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t enm_is_vowel_initial(el_val_t s);
el_val_t enm_indef_article(el_val_t noun_phrase);
el_val_t enm_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t enm_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t enm_drop(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t enm_first_char(el_val_t s) {
if (str_len(s) == 0) {
return EL_STR("");
}
return str_slice(s, 0, 1);
return 0;
}
el_val_t enm_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t enm_been_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("am");
}
if (slot == 1) {
return EL_STR("art");
}
if (slot == 2) {
return EL_STR("is");
}
if (slot == 3) {
return EL_STR("aren");
}
if (slot == 4) {
return EL_STR("been");
}
return EL_STR("been");
return 0;
}
el_val_t enm_been_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("was");
}
if (slot == 1) {
return EL_STR("were");
}
if (slot == 2) {
return EL_STR("was");
}
if (slot == 3) {
return EL_STR("were");
}
if (slot == 4) {
return EL_STR("were");
}
return EL_STR("were");
return 0;
}
el_val_t enm_haven_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("have");
}
if (slot == 1) {
return EL_STR("hast");
}
if (slot == 2) {
return EL_STR("hath");
}
if (slot == 3) {
return EL_STR("have");
}
if (slot == 4) {
return EL_STR("have");
}
return EL_STR("have");
return 0;
}
el_val_t enm_haven_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("hadde");
}
if (slot == 1) {
return EL_STR("haddest");
}
if (slot == 2) {
return EL_STR("hadde");
}
if (slot == 3) {
return EL_STR("hadden");
}
if (slot == 4) {
return EL_STR("hadden");
}
return EL_STR("hadden");
return 0;
}
el_val_t enm_goon_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("go");
}
if (slot == 1) {
return EL_STR("goost");
}
if (slot == 2) {
return EL_STR("gooth");
}
if (slot == 3) {
return EL_STR("goon");
}
if (slot == 4) {
return EL_STR("goon");
}
return EL_STR("goon");
return 0;
}
el_val_t enm_goon_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("wente");
}
if (slot == 1) {
return EL_STR("wentest");
}
if (slot == 2) {
return EL_STR("wente");
}
if (slot == 3) {
return EL_STR("wenten");
}
if (slot == 4) {
return EL_STR("wenten");
}
return EL_STR("wenten");
return 0;
}
el_val_t enm_seen_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("see");
}
if (slot == 1) {
return EL_STR("seest");
}
if (slot == 2) {
return EL_STR("seeth");
}
if (slot == 3) {
return EL_STR("seen");
}
if (slot == 4) {
return EL_STR("seen");
}
return EL_STR("seen");
return 0;
}
el_val_t enm_seen_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("saugh");
}
if (slot == 1) {
return EL_STR("sawest");
}
if (slot == 2) {
return EL_STR("saugh");
}
if (slot == 3) {
return EL_STR("sawen");
}
if (slot == 4) {
return EL_STR("sawen");
}
return EL_STR("sawen");
return 0;
}
el_val_t enm_seyen_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("seye");
}
if (slot == 1) {
return EL_STR("seyst");
}
if (slot == 2) {
return EL_STR("seith");
}
if (slot == 3) {
return EL_STR("seyen");
}
if (slot == 4) {
return EL_STR("seyen");
}
return EL_STR("seyen");
return 0;
}
el_val_t enm_seyen_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("seide");
}
if (slot == 1) {
return EL_STR("seidest");
}
if (slot == 2) {
return EL_STR("seide");
}
if (slot == 3) {
return EL_STR("seiden");
}
if (slot == 4) {
return EL_STR("seiden");
}
return EL_STR("seiden");
return 0;
}
el_val_t enm_comen_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("come");
}
if (slot == 1) {
return EL_STR("comest");
}
if (slot == 2) {
return EL_STR("cometh");
}
if (slot == 3) {
return EL_STR("comen");
}
if (slot == 4) {
return EL_STR("comen");
}
return EL_STR("comen");
return 0;
}
el_val_t enm_comen_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("cam");
}
if (slot == 1) {
return EL_STR("come");
}
if (slot == 2) {
return EL_STR("cam");
}
if (slot == 3) {
return EL_STR("comen");
}
if (slot == 4) {
return EL_STR("comen");
}
return EL_STR("comen");
return 0;
}
el_val_t enm_maken_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("make");
}
if (slot == 1) {
return EL_STR("makest");
}
if (slot == 2) {
return EL_STR("maketh");
}
if (slot == 3) {
return EL_STR("maken");
}
if (slot == 4) {
return EL_STR("maken");
}
return EL_STR("maken");
return 0;
}
el_val_t enm_maken_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("made");
}
if (slot == 1) {
return EL_STR("madest");
}
if (slot == 2) {
return EL_STR("made");
}
if (slot == 3) {
return EL_STR("maden");
}
if (slot == 4) {
return EL_STR("maden");
}
return EL_STR("maden");
return 0;
}
el_val_t enm_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("been");
}
if (str_eq(verb, EL_STR("have"))) {
return EL_STR("haven");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("goon");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("seen");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("seyen");
}
if (str_eq(verb, EL_STR("come"))) {
return EL_STR("comen");
}
if (str_eq(verb, EL_STR("make"))) {
return EL_STR("maken");
}
return verb;
return 0;
}
el_val_t enm_weak_stem(el_val_t verb) {
if (enm_str_ends(verb, EL_STR("en"))) {
return enm_drop(verb, 2);
}
if (enm_str_ends(verb, EL_STR("e"))) {
return enm_drop(verb, 1);
}
return verb;
return 0;
}
el_val_t enm_weak_present(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("e"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("est"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("eth"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("en"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("en"));
}
return el_str_concat(stem, EL_STR("en"));
return 0;
}
el_val_t enm_weak_past(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("ede"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("edest"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("ede"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("eden"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("eden"));
}
return el_str_concat(stem, EL_STR("eden"));
return 0;
}
el_val_t enm_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = enm_map_canonical(verb);
el_val_t slot = enm_slot(person, number);
if (str_eq(v, EL_STR("been"))) {
if (str_eq(tense, EL_STR("present"))) {
return enm_been_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return enm_been_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("haven"))) {
if (str_eq(tense, EL_STR("present"))) {
return enm_haven_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return enm_haven_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("goon"))) {
if (str_eq(tense, EL_STR("present"))) {
return enm_goon_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return enm_goon_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("seen"))) {
if (str_eq(tense, EL_STR("present"))) {
return enm_seen_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return enm_seen_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("seyen"))) {
if (str_eq(tense, EL_STR("present"))) {
return enm_seyen_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return enm_seyen_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("comen"))) {
if (str_eq(tense, EL_STR("present"))) {
return enm_comen_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return enm_comen_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("maken"))) {
if (str_eq(tense, EL_STR("present"))) {
return enm_maken_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return enm_maken_past(slot);
}
return v;
}
el_val_t stem = enm_weak_stem(v);
if (str_eq(tense, EL_STR("present"))) {
return enm_weak_present(stem, slot);
}
if (str_eq(tense, EL_STR("past"))) {
return enm_weak_past(stem, slot);
}
return v;
return 0;
}
el_val_t enm_irregular_plural(el_val_t noun) {
if (str_eq(noun, EL_STR("man"))) {
return EL_STR("men");
}
if (str_eq(noun, EL_STR("woman"))) {
return EL_STR("wommen");
}
if (str_eq(noun, EL_STR("child"))) {
return EL_STR("children");
}
if (str_eq(noun, EL_STR("ox"))) {
return EL_STR("oxen");
}
if (str_eq(noun, EL_STR("foot"))) {
return EL_STR("feet");
}
if (str_eq(noun, EL_STR("tooth"))) {
return EL_STR("teeth");
}
if (str_eq(noun, EL_STR("goose"))) {
return EL_STR("gees");
}
if (str_eq(noun, EL_STR("mouse"))) {
return EL_STR("mees");
}
if (str_eq(noun, EL_STR("louse"))) {
return EL_STR("lees");
}
return EL_STR("");
return 0;
}
el_val_t enm_make_plural(el_val_t noun) {
el_val_t irreg = enm_irregular_plural(noun);
if (!str_eq(irreg, EL_STR(""))) {
return irreg;
}
if (enm_str_ends(noun, EL_STR("e"))) {
return el_str_concat(noun, EL_STR("s"));
}
return el_str_concat(noun, EL_STR("es"));
return 0;
}
el_val_t enm_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("plural"))) {
return enm_make_plural(noun);
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("es"));
}
return noun;
return 0;
}
el_val_t enm_is_vowel_initial(el_val_t s) {
el_val_t c = enm_first_char(s);
if (str_eq(c, EL_STR("a"))) {
return 1;
}
if (str_eq(c, EL_STR("e"))) {
return 1;
}
if (str_eq(c, EL_STR("i"))) {
return 1;
}
if (str_eq(c, EL_STR("o"))) {
return 1;
}
if (str_eq(c, EL_STR("u"))) {
return 1;
}
return 0;
return 0;
}
el_val_t enm_indef_article(el_val_t noun_phrase) {
if (enm_is_vowel_initial(noun_phrase)) {
return EL_STR("an");
}
return EL_STR("a");
return 0;
}
el_val_t enm_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
el_val_t form = enm_decline(noun, gram_case, number);
if (str_eq(definite, EL_STR("true"))) {
return el_str_concat(EL_STR("the "), form);
}
if (str_eq(number, EL_STR("plural"))) {
return form;
}
el_val_t art = enm_indef_article(form);
return el_str_concat(el_str_concat(art, EL_STR(" ")), form);
return 0;
}
-30
View File
@@ -1,30 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn enm_str_ends(s: String, suf: String) -> Bool
extern fn enm_drop(s: String, n: Int) -> String
extern fn enm_first_char(s: String) -> String
extern fn enm_slot(person: String, number: String) -> Int
extern fn enm_been_present(slot: Int) -> String
extern fn enm_been_past(slot: Int) -> String
extern fn enm_haven_present(slot: Int) -> String
extern fn enm_haven_past(slot: Int) -> String
extern fn enm_goon_present(slot: Int) -> String
extern fn enm_goon_past(slot: Int) -> String
extern fn enm_seen_present(slot: Int) -> String
extern fn enm_seen_past(slot: Int) -> String
extern fn enm_seyen_present(slot: Int) -> String
extern fn enm_seyen_past(slot: Int) -> String
extern fn enm_comen_present(slot: Int) -> String
extern fn enm_comen_past(slot: Int) -> String
extern fn enm_maken_present(slot: Int) -> String
extern fn enm_maken_past(slot: Int) -> String
extern fn enm_map_canonical(verb: String) -> String
extern fn enm_weak_stem(verb: String) -> String
extern fn enm_weak_present(stem: String, slot: Int) -> String
extern fn enm_weak_past(stem: String, slot: Int) -> String
extern fn enm_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn enm_irregular_plural(noun: String) -> String
extern fn enm_make_plural(noun: String) -> String
extern fn enm_decline(noun: String, gram_case: String, number: String) -> String
extern fn enm_is_vowel_initial(s: String) -> Bool
extern fn enm_indef_article(noun_phrase: String) -> String
extern fn enm_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-1054
View File
File diff suppressed because it is too large Load Diff
-23
View File
@@ -1,23 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn es_str_ends(s: String, suf: String) -> Bool
extern fn es_str_drop_last(s: String, n: Int) -> String
extern fn es_str_last_char(s: String) -> String
extern fn es_str_last2(s: String) -> String
extern fn es_str_last3(s: String) -> String
extern fn es_verb_class(base: String) -> String
extern fn es_stem(base: String) -> String
extern fn es_slot(person: String, number: String) -> Int
extern fn es_irregular_present(verb: String, person: String, number: String) -> String
extern fn es_irregular_preterite(verb: String, person: String, number: String) -> String
extern fn es_irregular_imperfect(verb: String, person: String, number: String) -> String
extern fn es_regular_present(stem: String, vclass: String, slot: Int) -> String
extern fn es_regular_preterite(stem: String, vclass: String, slot: Int) -> String
extern fn es_regular_future(base: String, slot: Int) -> String
extern fn es_irregular_future_stem(verb: String) -> String
extern fn es_regular_imperfect(stem: String, vclass: String, slot: Int) -> String
extern fn es_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn es_gender(noun: String) -> String
extern fn es_invariant_plural(noun: String) -> String
extern fn es_pluralize(noun: String) -> String
extern fn es_starts_with_stressed_a(noun: String) -> Bool
extern fn es_agree_article(noun: String, definite: String, number: String) -> String
-560
View File
@@ -1,560 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t fi_harmony(el_val_t word);
el_val_t fi_suffix(el_val_t base, el_val_t harmony);
el_val_t fi_noun_case(el_val_t stem, el_val_t gram_case, el_val_t number, el_val_t harmony);
el_val_t fi_str_last_char(el_val_t s);
el_val_t fi_apply_case(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t fi_verb_stem(el_val_t dict_form);
el_val_t fi_irregular_verb(el_val_t dict_form);
el_val_t fi_present_ending(el_val_t stem, el_val_t person, el_val_t number, el_val_t harmony);
el_val_t fi_past_stem(el_val_t stem);
el_val_t fi_past_ending(el_val_t stem, el_val_t person, el_val_t number, el_val_t harmony);
el_val_t fi_neg_aux(el_val_t person, el_val_t number);
el_val_t fi_negative(el_val_t verb, el_val_t person, el_val_t number);
el_val_t fi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t fi_question_suffix(el_val_t harmony);
el_val_t fi_make_question(el_val_t verb_form, el_val_t harmony);
el_val_t fi_full_paradigm(el_val_t noun);
el_val_t fi_harmony(el_val_t word) {
el_val_t n = str_len(word);
el_val_t i = (n - 1);
while (i >= 0) {
el_val_t c = str_slice(word, i, (i + 1));
if (str_eq(c, EL_STR("a"))) {
return EL_STR("back");
}
if (str_eq(c, EL_STR("o"))) {
return EL_STR("back");
}
if (str_eq(c, EL_STR("u"))) {
return EL_STR("back");
}
if (str_eq(c, EL_STR("\xc3\xa4"))) {
return EL_STR("front");
}
if (str_eq(c, EL_STR("\xc3\xb6"))) {
return EL_STR("front");
}
if (str_eq(c, EL_STR("y"))) {
return EL_STR("front");
}
i = (i - 1);
}
return EL_STR("front");
return 0;
}
el_val_t fi_suffix(el_val_t base, el_val_t harmony) {
if (str_eq(harmony, EL_STR("front"))) {
if (str_eq(base, EL_STR("a"))) {
return EL_STR("\xc3\xa4");
}
if (str_eq(base, EL_STR("ssa"))) {
return EL_STR("ss\xc3\xa4");
}
if (str_eq(base, EL_STR("sta"))) {
return EL_STR("st\xc3\xa4");
}
if (str_eq(base, EL_STR("an"))) {
return EL_STR("\xc3\xa4n");
}
if (str_eq(base, EL_STR("aan"))) {
return EL_STR("\xc3\xa4\xc3\xa4n");
}
if (str_eq(base, EL_STR("lla"))) {
return EL_STR("ll\xc3\xa4");
}
if (str_eq(base, EL_STR("lta"))) {
return EL_STR("lt\xc3\xa4");
}
if (str_eq(base, EL_STR("lle"))) {
return EL_STR("lle");
}
if (str_eq(base, EL_STR("na"))) {
return EL_STR("n\xc3\xa4");
}
if (str_eq(base, EL_STR("ksi"))) {
return EL_STR("ksi");
}
if (str_eq(base, EL_STR("tta"))) {
return EL_STR("tt\xc3\xa4");
}
if (str_eq(base, EL_STR("ta"))) {
return EL_STR("t\xc3\xa4");
}
if (str_eq(base, EL_STR("ja"))) {
return EL_STR("j\xc3\xa4");
}
if (str_eq(base, EL_STR("oja"))) {
return EL_STR("\xc3\xb6j\xc3\xa4");
}
if (str_eq(base, EL_STR("issa"))) {
return EL_STR("iss\xc3\xa4");
}
if (str_eq(base, EL_STR("ista"))) {
return EL_STR("ist\xc3\xa4");
}
if (str_eq(base, EL_STR("ihin"))) {
return EL_STR("ihin");
}
if (str_eq(base, EL_STR("illa"))) {
return EL_STR("ill\xc3\xa4");
}
if (str_eq(base, EL_STR("ilta"))) {
return EL_STR("ilt\xc3\xa4");
}
if (str_eq(base, EL_STR("ille"))) {
return EL_STR("ille");
}
if (str_eq(base, EL_STR("ina"))) {
return EL_STR("in\xc3\xa4");
}
if (str_eq(base, EL_STR("itta"))) {
return EL_STR("itt\xc3\xa4");
}
if (str_eq(base, EL_STR("ko"))) {
return EL_STR("k\xc3\xb6");
}
if (str_eq(base, EL_STR("pa"))) {
return EL_STR("p\xc3\xa4");
}
if (str_eq(base, EL_STR("va"))) {
return EL_STR("v\xc3\xa4");
}
if (str_eq(base, EL_STR("ma"))) {
return EL_STR("m\xc3\xa4");
}
if (str_eq(base, EL_STR("han"))) {
return EL_STR("h\xc3\xa4n");
}
if (str_eq(base, EL_STR("lla"))) {
return EL_STR("ll\xc3\xa4");
}
return base;
}
return base;
return 0;
}
el_val_t fi_noun_case(el_val_t stem, el_val_t gram_case, el_val_t number, el_val_t harmony) {
el_val_t sg = str_eq(number, EL_STR("singular"));
if (str_eq(gram_case, EL_STR("nominative"))) {
if (sg) {
return stem;
}
return el_str_concat(stem, EL_STR("t"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
if (sg) {
return el_str_concat(stem, EL_STR("n"));
}
return el_str_concat(stem, EL_STR("jen"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
if (sg) {
return el_str_concat(stem, EL_STR("n"));
}
return el_str_concat(stem, EL_STR("t"));
}
if (str_eq(gram_case, EL_STR("partitive"))) {
if (sg) {
return el_str_concat(stem, fi_suffix(EL_STR("a"), harmony));
}
return el_str_concat(stem, fi_suffix(EL_STR("ja"), harmony));
}
if (str_eq(gram_case, EL_STR("inessive"))) {
if (sg) {
return el_str_concat(stem, fi_suffix(EL_STR("ssa"), harmony));
}
return el_str_concat(stem, fi_suffix(EL_STR("issa"), harmony));
}
if (str_eq(gram_case, EL_STR("elative"))) {
if (sg) {
return el_str_concat(stem, fi_suffix(EL_STR("sta"), harmony));
}
return el_str_concat(stem, fi_suffix(EL_STR("ista"), harmony));
}
if (str_eq(gram_case, EL_STR("illative"))) {
if (sg) {
el_val_t last = fi_str_last_char(stem);
return el_str_concat(el_str_concat(stem, last), EL_STR("n"));
}
return el_str_concat(stem, fi_suffix(EL_STR("ihin"), harmony));
}
if (str_eq(gram_case, EL_STR("adessive"))) {
if (sg) {
return el_str_concat(stem, fi_suffix(EL_STR("lla"), harmony));
}
return el_str_concat(stem, fi_suffix(EL_STR("illa"), harmony));
}
if (str_eq(gram_case, EL_STR("ablative"))) {
if (sg) {
return el_str_concat(stem, fi_suffix(EL_STR("lta"), harmony));
}
return el_str_concat(stem, fi_suffix(EL_STR("ilta"), harmony));
}
if (str_eq(gram_case, EL_STR("allative"))) {
if (sg) {
return el_str_concat(stem, EL_STR("lle"));
}
return el_str_concat(stem, EL_STR("ille"));
}
if (str_eq(gram_case, EL_STR("essive"))) {
if (sg) {
return el_str_concat(stem, fi_suffix(EL_STR("na"), harmony));
}
return el_str_concat(stem, fi_suffix(EL_STR("ina"), harmony));
}
if (str_eq(gram_case, EL_STR("translative"))) {
if (sg) {
return el_str_concat(stem, EL_STR("ksi"));
}
return el_str_concat(stem, EL_STR("iksi"));
}
if (str_eq(gram_case, EL_STR("instructive"))) {
return el_str_concat(stem, EL_STR("in"));
}
if (str_eq(gram_case, EL_STR("abessive"))) {
if (sg) {
return el_str_concat(stem, fi_suffix(EL_STR("tta"), harmony));
}
return el_str_concat(stem, fi_suffix(EL_STR("itta"), harmony));
}
if (str_eq(gram_case, EL_STR("comitative"))) {
return el_str_concat(stem, EL_STR("ineen"));
}
return stem;
return 0;
}
el_val_t fi_str_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t fi_apply_case(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t harmony = fi_harmony(noun);
if (str_eq(gram_case, EL_STR("nominative"))) {
if (str_eq(number, EL_STR("singular"))) {
return noun;
}
return el_str_concat(noun, EL_STR("t"));
}
return fi_noun_case(noun, gram_case, number, harmony);
return 0;
}
el_val_t fi_verb_stem(el_val_t dict_form) {
if (str_ends_with(dict_form, EL_STR("da"))) {
return str_drop_last(dict_form, 2);
}
if (str_ends_with(dict_form, EL_STR("d\xc3\xa4"))) {
return str_drop_last(dict_form, 2);
}
if (str_ends_with(dict_form, EL_STR("lla"))) {
return str_drop_last(dict_form, 2);
}
if (str_ends_with(dict_form, EL_STR("ll\xc3\xa4"))) {
return str_drop_last(dict_form, 2);
}
if (str_ends_with(dict_form, EL_STR("rra"))) {
return str_drop_last(dict_form, 2);
}
if (str_ends_with(dict_form, EL_STR("nna"))) {
return str_drop_last(dict_form, 2);
}
if (str_ends_with(dict_form, EL_STR("a"))) {
return str_drop_last(dict_form, 1);
}
if (str_ends_with(dict_form, EL_STR("\xc3\xa4"))) {
return str_drop_last(dict_form, 1);
}
return dict_form;
return 0;
}
el_val_t fi_irregular_verb(el_val_t dict_form) {
el_val_t empty = el_list_empty();
if (str_eq(dict_form, EL_STR("olla"))) {
el_val_t r = el_list_new(18, EL_STR("olla"), EL_STR("olen"), EL_STR("olet"), EL_STR("on"), EL_STR("olemme"), EL_STR("olette"), EL_STR("ovat"), EL_STR("olin"), EL_STR("olit"), EL_STR("oli"), EL_STR("olimme"), EL_STR("olitte"), EL_STR("olivat"), EL_STR("ole"), EL_STR("olis"), EL_STR("ole"), EL_STR("oleva"), EL_STR("ollut"));
return r;
}
if (str_eq(dict_form, EL_STR("voida"))) {
el_val_t r = el_list_new(18, EL_STR("voida"), EL_STR("voin"), EL_STR("voit"), EL_STR("voi"), EL_STR("voimme"), EL_STR("voitte"), EL_STR("voivat"), EL_STR("voin"), EL_STR("voit"), EL_STR("voi"), EL_STR("voimme"), EL_STR("voitte"), EL_STR("voivat"), EL_STR("voi"), EL_STR("vois"), EL_STR("voi"), EL_STR("voiva"), EL_STR("voinut"));
return r;
}
if (str_eq(dict_form, EL_STR("menn\xc3\xa4"))) {
el_val_t r = el_list_new(18, EL_STR("menn\xc3\xa4"), EL_STR("menen"), EL_STR("menet"), EL_STR("menee"), EL_STR("menemme"), EL_STR("menette"), EL_STR("menev\xc3\xa4t"), EL_STR("menin"), EL_STR("menit"), EL_STR("meni"), EL_STR("menimme"), EL_STR("menitte"), EL_STR("meniv\xc3\xa4t"), EL_STR("mene"), EL_STR("menis"), EL_STR("mene"), EL_STR("menev\xc3\xa4"), EL_STR("mennyt"));
return r;
}
if (str_eq(dict_form, EL_STR("tulla"))) {
el_val_t r = el_list_new(18, EL_STR("tulla"), EL_STR("tulen"), EL_STR("tulet"), EL_STR("tulee"), EL_STR("tulemme"), EL_STR("tulette"), EL_STR("tulevat"), EL_STR("tulin"), EL_STR("tulit"), EL_STR("tuli"), EL_STR("tulimme"), EL_STR("tulitte"), EL_STR("tulivat"), EL_STR("tule"), EL_STR("tulis"), EL_STR("tule"), EL_STR("tuleva"), EL_STR("tullut"));
return r;
}
if (str_eq(dict_form, EL_STR("tehd\xc3\xa4"))) {
el_val_t r = el_list_new(18, EL_STR("tehd\xc3\xa4"), EL_STR("teen"), EL_STR("teet"), EL_STR("tekee"), EL_STR("teemme"), EL_STR("teette"), EL_STR("tekev\xc3\xa4t"), EL_STR("tein"), EL_STR("teit"), EL_STR("teki"), EL_STR("teimme"), EL_STR("teitte"), EL_STR("tekiv\xc3\xa4t"), EL_STR("tee"), EL_STR("tekis"), EL_STR("tee"), EL_STR("tekev\xc3\xa4"), EL_STR("tehnyt"));
return r;
}
if (str_eq(dict_form, EL_STR("n\xc3\xa4hd\xc3\xa4"))) {
el_val_t r = el_list_new(18, EL_STR("n\xc3\xa4hd\xc3\xa4"), EL_STR("n\xc3\xa4""en"), EL_STR("n\xc3\xa4""et"), EL_STR("n\xc3\xa4kee"), EL_STR("n\xc3\xa4""emme"), EL_STR("n\xc3\xa4""ette"), EL_STR("n\xc3\xa4kev\xc3\xa4t"), EL_STR("n\xc3\xa4in"), EL_STR("n\xc3\xa4it"), EL_STR("n\xc3\xa4ki"), EL_STR("n\xc3\xa4imme"), EL_STR("n\xc3\xa4itte"), EL_STR("n\xc3\xa4kiv\xc3\xa4t"), EL_STR("n\xc3\xa4""e"), EL_STR("n\xc3\xa4kis"), EL_STR("n\xc3\xa4""e"), EL_STR("n\xc3\xa4kev\xc3\xa4"), EL_STR("n\xc3\xa4hnyt"));
return r;
}
if (str_eq(dict_form, EL_STR("saada"))) {
el_val_t r = el_list_new(18, EL_STR("saada"), EL_STR("saan"), EL_STR("saat"), EL_STR("saa"), EL_STR("saamme"), EL_STR("saatte"), EL_STR("saavat"), EL_STR("sain"), EL_STR("sait"), EL_STR("sai"), EL_STR("saimme"), EL_STR("saitte"), EL_STR("saivat"), EL_STR("saa"), EL_STR("sais"), EL_STR("saa"), EL_STR("saava"), EL_STR("saanut"));
return r;
}
if (str_eq(dict_form, EL_STR("pit\xc3\xa4\xc3\xa4"))) {
el_val_t r = el_list_new(18, EL_STR("pit\xc3\xa4\xc3\xa4"), EL_STR("pid\xc3\xa4n"), EL_STR("pid\xc3\xa4t"), EL_STR("pit\xc3\xa4\xc3\xa4"), EL_STR("pid\xc3\xa4mme"), EL_STR("pid\xc3\xa4tte"), EL_STR("pit\xc3\xa4v\xc3\xa4t"), EL_STR("pidin"), EL_STR("pidit"), EL_STR("piti"), EL_STR("pidimme"), EL_STR("piditte"), EL_STR("pitiv\xc3\xa4t"), EL_STR("pid\xc3\xa4"), EL_STR("pit\xc3\xa4is"), EL_STR("pid\xc3\xa4"), EL_STR("pit\xc3\xa4v\xc3\xa4"), EL_STR("pit\xc3\xa4nyt"));
return r;
}
if (str_eq(dict_form, EL_STR("tiet\xc3\xa4\xc3\xa4"))) {
el_val_t r = el_list_new(18, EL_STR("tiet\xc3\xa4\xc3\xa4"), EL_STR("tied\xc3\xa4n"), EL_STR("tied\xc3\xa4t"), EL_STR("tiet\xc3\xa4\xc3\xa4"), EL_STR("tied\xc3\xa4mme"), EL_STR("tied\xc3\xa4tte"), EL_STR("tiet\xc3\xa4v\xc3\xa4t"), EL_STR("tiesin"), EL_STR("tiesit"), EL_STR("tiesi"), EL_STR("tiesimme"), EL_STR("tiesitte"), EL_STR("tiesiv\xc3\xa4t"), EL_STR("tied\xc3\xa4"), EL_STR("tiet\xc3\xa4is"), EL_STR("tied\xc3\xa4"), EL_STR("tiet\xc3\xa4v\xc3\xa4"), EL_STR("tiennyt"));
return r;
}
return empty;
return 0;
}
el_val_t fi_present_ending(el_val_t stem, el_val_t person, el_val_t number, el_val_t harmony) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(person, EL_STR("first"))) {
return el_str_concat(stem, EL_STR("n"));
}
if (str_eq(person, EL_STR("second"))) {
return el_str_concat(stem, EL_STR("t"));
}
if (str_eq(person, EL_STR("third"))) {
el_val_t last = fi_str_last_char(stem);
return el_str_concat(stem, last);
}
}
if (str_eq(number, EL_STR("plural"))) {
if (str_eq(person, EL_STR("first"))) {
return el_str_concat(stem, EL_STR("mme"));
}
if (str_eq(person, EL_STR("second"))) {
return el_str_concat(stem, EL_STR("tte"));
}
if (str_eq(person, EL_STR("third"))) {
return el_str_concat(stem, fi_suffix(EL_STR("vat"), harmony));
}
}
return stem;
return 0;
}
el_val_t fi_past_stem(el_val_t stem) {
el_val_t last = fi_str_last_char(stem);
if (str_eq(last, EL_STR("a"))) {
return el_str_concat(str_drop_last(stem, 1), EL_STR("oi"));
}
if (str_eq(last, EL_STR("\xc3\xa4"))) {
return el_str_concat(str_drop_last(stem, 1), EL_STR("\xc3\xb6i"));
}
return el_str_concat(stem, EL_STR("i"));
return 0;
}
el_val_t fi_past_ending(el_val_t stem, el_val_t person, el_val_t number, el_val_t harmony) {
el_val_t pstem = fi_past_stem(stem);
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(person, EL_STR("first"))) {
return el_str_concat(pstem, EL_STR("n"));
}
if (str_eq(person, EL_STR("second"))) {
return el_str_concat(pstem, EL_STR("t"));
}
if (str_eq(person, EL_STR("third"))) {
return str_drop_last(pstem, 1);
}
}
if (str_eq(number, EL_STR("plural"))) {
if (str_eq(person, EL_STR("first"))) {
return el_str_concat(pstem, EL_STR("mme"));
}
if (str_eq(person, EL_STR("second"))) {
return el_str_concat(pstem, EL_STR("tte"));
}
if (str_eq(person, EL_STR("third"))) {
return el_str_concat(pstem, fi_suffix(EL_STR("vat"), harmony));
}
}
return pstem;
return 0;
}
el_val_t fi_neg_aux(el_val_t person, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(person, EL_STR("first"))) {
return EL_STR("en");
}
if (str_eq(person, EL_STR("second"))) {
return EL_STR("et");
}
if (str_eq(person, EL_STR("third"))) {
return EL_STR("ei");
}
}
if (str_eq(number, EL_STR("plural"))) {
if (str_eq(person, EL_STR("first"))) {
return EL_STR("emme");
}
if (str_eq(person, EL_STR("second"))) {
return EL_STR("ette");
}
if (str_eq(person, EL_STR("third"))) {
return EL_STR("eiv\xc3\xa4t");
}
}
return EL_STR("ei");
return 0;
}
el_val_t fi_negative(el_val_t verb, el_val_t person, el_val_t number) {
el_val_t irreg = fi_irregular_verb(verb);
el_val_t aux = fi_neg_aux(person, number);
if (native_list_len(irreg) > 0) {
el_val_t neg_stem = native_list_get(irreg, 13);
return el_str_concat(el_str_concat(aux, EL_STR(" ")), neg_stem);
}
el_val_t stem = fi_verb_stem(verb);
return el_str_concat(el_str_concat(aux, EL_STR(" ")), stem);
return 0;
}
el_val_t fi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t harmony = fi_harmony(verb);
el_val_t irreg = fi_irregular_verb(verb);
if (native_list_len(irreg) > 0) {
if (str_eq(tense, EL_STR("present"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(person, EL_STR("first"))) {
return native_list_get(irreg, 1);
}
if (str_eq(person, EL_STR("second"))) {
return native_list_get(irreg, 2);
}
if (str_eq(person, EL_STR("third"))) {
return native_list_get(irreg, 3);
}
}
if (str_eq(number, EL_STR("plural"))) {
if (str_eq(person, EL_STR("first"))) {
return native_list_get(irreg, 4);
}
if (str_eq(person, EL_STR("second"))) {
return native_list_get(irreg, 5);
}
if (str_eq(person, EL_STR("third"))) {
return native_list_get(irreg, 6);
}
}
}
if (str_eq(tense, EL_STR("past"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(person, EL_STR("first"))) {
return native_list_get(irreg, 7);
}
if (str_eq(person, EL_STR("second"))) {
return native_list_get(irreg, 8);
}
if (str_eq(person, EL_STR("third"))) {
return native_list_get(irreg, 9);
}
}
if (str_eq(number, EL_STR("plural"))) {
if (str_eq(person, EL_STR("first"))) {
return native_list_get(irreg, 10);
}
if (str_eq(person, EL_STR("second"))) {
return native_list_get(irreg, 11);
}
if (str_eq(person, EL_STR("third"))) {
return native_list_get(irreg, 12);
}
}
}
}
el_val_t stem = fi_verb_stem(verb);
if (str_eq(tense, EL_STR("present"))) {
return fi_present_ending(stem, person, number, harmony);
}
if (str_eq(tense, EL_STR("past"))) {
return fi_past_ending(stem, person, number, harmony);
}
return stem;
return 0;
}
el_val_t fi_question_suffix(el_val_t harmony) {
if (str_eq(harmony, EL_STR("front"))) {
return EL_STR("k\xc3\xb6");
}
return EL_STR("ko");
return 0;
}
el_val_t fi_make_question(el_val_t verb_form, el_val_t harmony) {
return el_str_concat(verb_form, fi_question_suffix(harmony));
return 0;
}
el_val_t fi_full_paradigm(el_val_t noun) {
el_val_t harmony = fi_harmony(noun);
el_val_t r = el_list_empty();
el_val_t cases = el_list_new(15, EL_STR("nominative"), EL_STR("genitive"), EL_STR("accusative"), EL_STR("partitive"), EL_STR("inessive"), EL_STR("elative"), EL_STR("illative"), EL_STR("adessive"), EL_STR("ablative"), EL_STR("allative"), EL_STR("essive"), EL_STR("translative"), EL_STR("instructive"), EL_STR("abessive"), EL_STR("comitative"));
el_val_t n = native_list_len(cases);
el_val_t i = 0;
while (i < n) {
el_val_t c = native_list_get(cases, i);
r = native_list_append(r, c);
if (str_eq(c, EL_STR("instructive"))) {
r = native_list_append(r, EL_STR(""));
} else {
if (str_eq(c, EL_STR("comitative"))) {
r = native_list_append(r, EL_STR(""));
} else {
r = native_list_append(r, fi_noun_case(noun, c, EL_STR("singular"), harmony));
}
}
r = native_list_append(r, fi_noun_case(noun, c, EL_STR("plural"), harmony));
i = (i + 1);
}
return r;
return 0;
}
-17
View File
@@ -1,17 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn fi_harmony(word: String) -> String
extern fn fi_suffix(base: String, harmony: String) -> String
extern fn fi_noun_case(stem: String, gram_case: String, number: String, harmony: String) -> String
extern fn fi_str_last_char(s: String) -> String
extern fn fi_apply_case(noun: String, gram_case: String, number: String) -> String
extern fn fi_verb_stem(dict_form: String) -> String
extern fn fi_irregular_verb(dict_form: String) -> [String]
extern fn fi_present_ending(stem: String, person: String, number: String, harmony: String) -> String
extern fn fi_past_stem(stem: String) -> String
extern fn fi_past_ending(stem: String, person: String, number: String, harmony: String) -> String
extern fn fi_neg_aux(person: String, number: String) -> String
extern fn fi_negative(verb: String, person: String, number: String) -> String
extern fn fi_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn fi_question_suffix(harmony: String) -> String
extern fn fi_make_question(verb_form: String, harmony: String) -> String
extern fn fi_full_paradigm(noun: String) -> [String]
-975
View File
@@ -1,975 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t fr_str_ends(el_val_t s, el_val_t suf);
el_val_t fr_str_drop_last(el_val_t s, el_val_t n);
el_val_t fr_str_last_char(el_val_t s);
el_val_t fr_str_last2(el_val_t s);
el_val_t fr_is_vowel_start(el_val_t s);
el_val_t fr_is_known_irregular(el_val_t verb);
el_val_t fr_verb_group(el_val_t base);
el_val_t fr_stem(el_val_t base);
el_val_t fr_slot(el_val_t person, el_val_t number);
el_val_t fr_irregular_present(el_val_t verb, el_val_t person, el_val_t number);
el_val_t fr_regular_present(el_val_t stem, el_val_t vgroup, el_val_t slot);
el_val_t fr_future_stem(el_val_t base, el_val_t vgroup);
el_val_t fr_regular_future(el_val_t fstem, el_val_t slot);
el_val_t fr_irregular_future_stem(el_val_t verb);
el_val_t fr_imperfect_stem(el_val_t base, el_val_t vgroup);
el_val_t fr_regular_imperfect(el_val_t istem, el_val_t slot);
el_val_t fr_uses_etre(el_val_t verb);
el_val_t fr_past_participle(el_val_t verb);
el_val_t fr_avoir_present(el_val_t slot);
el_val_t fr_etre_present(el_val_t slot);
el_val_t fr_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t fr_gender(el_val_t noun);
el_val_t fr_invariant_plural(el_val_t noun);
el_val_t fr_pluralize(el_val_t noun);
el_val_t fr_agree_article(el_val_t noun, el_val_t definite, el_val_t number);
el_val_t fr_subject_starts_vowel(el_val_t subject);
el_val_t fr_verb_ends_vowel(el_val_t verb_form);
el_val_t fr_question_inversion(el_val_t subject, el_val_t verb_form);
el_val_t fr_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t fr_str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t fr_str_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t fr_str_last2(el_val_t s) {
el_val_t n = str_len(s);
if (n < 2) {
return s;
}
return str_slice(s, (n - 2), n);
return 0;
}
el_val_t fr_is_vowel_start(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return 0;
}
el_val_t c = str_slice(s, 0, 1);
if (str_eq(c, EL_STR("a"))) {
return 1;
}
if (str_eq(c, EL_STR("e"))) {
return 1;
}
if (str_eq(c, EL_STR("\xc3\xa9"))) {
return 1;
}
if (str_eq(c, EL_STR("\xc3\xa8"))) {
return 1;
}
if (str_eq(c, EL_STR("\xc3\xaa"))) {
return 1;
}
if (str_eq(c, EL_STR("i"))) {
return 1;
}
if (str_eq(c, EL_STR("\xc3\xae"))) {
return 1;
}
if (str_eq(c, EL_STR("o"))) {
return 1;
}
if (str_eq(c, EL_STR("\xc3\xb4"))) {
return 1;
}
if (str_eq(c, EL_STR("u"))) {
return 1;
}
if (str_eq(c, EL_STR("\xc3\xbb"))) {
return 1;
}
if (str_eq(c, EL_STR("h"))) {
return 1;
}
return 0;
return 0;
}
el_val_t fr_is_known_irregular(el_val_t verb) {
if (str_eq(verb, EL_STR("\xc3\xaatre"))) {
return 1;
}
if (str_eq(verb, EL_STR("avoir"))) {
return 1;
}
if (str_eq(verb, EL_STR("aller"))) {
return 1;
}
if (str_eq(verb, EL_STR("faire"))) {
return 1;
}
if (str_eq(verb, EL_STR("pouvoir"))) {
return 1;
}
if (str_eq(verb, EL_STR("vouloir"))) {
return 1;
}
if (str_eq(verb, EL_STR("venir"))) {
return 1;
}
if (str_eq(verb, EL_STR("dire"))) {
return 1;
}
if (str_eq(verb, EL_STR("voir"))) {
return 1;
}
if (str_eq(verb, EL_STR("prendre"))) {
return 1;
}
if (str_eq(verb, EL_STR("mettre"))) {
return 1;
}
if (str_eq(verb, EL_STR("savoir"))) {
return 1;
}
return 0;
return 0;
}
el_val_t fr_verb_group(el_val_t base) {
if (fr_is_known_irregular(base)) {
return EL_STR("irregular");
}
if (fr_str_ends(base, EL_STR("er"))) {
return EL_STR("er");
}
if (fr_str_ends(base, EL_STR("ir"))) {
return EL_STR("ir");
}
if (fr_str_ends(base, EL_STR("re"))) {
return EL_STR("re");
}
return EL_STR("er");
return 0;
}
el_val_t fr_stem(el_val_t base) {
return fr_str_drop_last(base, 2);
return 0;
}
el_val_t fr_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t fr_irregular_present(el_val_t verb, el_val_t person, el_val_t number) {
el_val_t slot = fr_slot(person, number);
if (str_eq(verb, EL_STR("\xc3\xaatre"))) {
if (slot == 0) {
return EL_STR("suis");
}
if (slot == 1) {
return EL_STR("es");
}
if (slot == 2) {
return EL_STR("est");
}
if (slot == 3) {
return EL_STR("sommes");
}
if (slot == 4) {
return EL_STR("etes");
}
return EL_STR("sont");
}
if (str_eq(verb, EL_STR("etre"))) {
if (slot == 0) {
return EL_STR("suis");
}
if (slot == 1) {
return EL_STR("es");
}
if (slot == 2) {
return EL_STR("est");
}
if (slot == 3) {
return EL_STR("sommes");
}
if (slot == 4) {
return EL_STR("etes");
}
return EL_STR("sont");
}
if (str_eq(verb, EL_STR("avoir"))) {
if (slot == 0) {
return EL_STR("ai");
}
if (slot == 1) {
return EL_STR("as");
}
if (slot == 2) {
return EL_STR("a");
}
if (slot == 3) {
return EL_STR("avons");
}
if (slot == 4) {
return EL_STR("avez");
}
return EL_STR("ont");
}
if (str_eq(verb, EL_STR("aller"))) {
if (slot == 0) {
return EL_STR("vais");
}
if (slot == 1) {
return EL_STR("vas");
}
if (slot == 2) {
return EL_STR("va");
}
if (slot == 3) {
return EL_STR("allons");
}
if (slot == 4) {
return EL_STR("allez");
}
return EL_STR("vont");
}
if (str_eq(verb, EL_STR("faire"))) {
if (slot == 0) {
return EL_STR("fais");
}
if (slot == 1) {
return EL_STR("fais");
}
if (slot == 2) {
return EL_STR("fait");
}
if (slot == 3) {
return EL_STR("faisons");
}
if (slot == 4) {
return EL_STR("faites");
}
return EL_STR("font");
}
if (str_eq(verb, EL_STR("pouvoir"))) {
if (slot == 0) {
return EL_STR("peux");
}
if (slot == 1) {
return EL_STR("peux");
}
if (slot == 2) {
return EL_STR("peut");
}
if (slot == 3) {
return EL_STR("pouvons");
}
if (slot == 4) {
return EL_STR("pouvez");
}
return EL_STR("peuvent");
}
if (str_eq(verb, EL_STR("vouloir"))) {
if (slot == 0) {
return EL_STR("veux");
}
if (slot == 1) {
return EL_STR("veux");
}
if (slot == 2) {
return EL_STR("veut");
}
if (slot == 3) {
return EL_STR("voulons");
}
if (slot == 4) {
return EL_STR("voulez");
}
return EL_STR("veulent");
}
if (str_eq(verb, EL_STR("venir"))) {
if (slot == 0) {
return EL_STR("viens");
}
if (slot == 1) {
return EL_STR("viens");
}
if (slot == 2) {
return EL_STR("vient");
}
if (slot == 3) {
return EL_STR("venons");
}
if (slot == 4) {
return EL_STR("venez");
}
return EL_STR("viennent");
}
if (str_eq(verb, EL_STR("dire"))) {
if (slot == 0) {
return EL_STR("dis");
}
if (slot == 1) {
return EL_STR("dis");
}
if (slot == 2) {
return EL_STR("dit");
}
if (slot == 3) {
return EL_STR("disons");
}
if (slot == 4) {
return EL_STR("dites");
}
return EL_STR("disent");
}
if (str_eq(verb, EL_STR("voir"))) {
if (slot == 0) {
return EL_STR("vois");
}
if (slot == 1) {
return EL_STR("vois");
}
if (slot == 2) {
return EL_STR("voit");
}
if (slot == 3) {
return EL_STR("voyons");
}
if (slot == 4) {
return EL_STR("voyez");
}
return EL_STR("voient");
}
if (str_eq(verb, EL_STR("prendre"))) {
if (slot == 0) {
return EL_STR("prends");
}
if (slot == 1) {
return EL_STR("prends");
}
if (slot == 2) {
return EL_STR("prend");
}
if (slot == 3) {
return EL_STR("prenons");
}
if (slot == 4) {
return EL_STR("prenez");
}
return EL_STR("prennent");
}
if (str_eq(verb, EL_STR("mettre"))) {
if (slot == 0) {
return EL_STR("mets");
}
if (slot == 1) {
return EL_STR("mets");
}
if (slot == 2) {
return EL_STR("met");
}
if (slot == 3) {
return EL_STR("mettons");
}
if (slot == 4) {
return EL_STR("mettez");
}
return EL_STR("mettent");
}
if (str_eq(verb, EL_STR("savoir"))) {
if (slot == 0) {
return EL_STR("sais");
}
if (slot == 1) {
return EL_STR("sais");
}
if (slot == 2) {
return EL_STR("sait");
}
if (slot == 3) {
return EL_STR("savons");
}
if (slot == 4) {
return EL_STR("savez");
}
return EL_STR("savent");
}
return EL_STR("");
return 0;
}
el_val_t fr_regular_present(el_val_t stem, el_val_t vgroup, el_val_t slot) {
if (str_eq(vgroup, EL_STR("er"))) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("e"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("es"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("e"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("ons"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("ez"));
}
return el_str_concat(stem, EL_STR("ent"));
}
if (str_eq(vgroup, EL_STR("ir"))) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("is"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("is"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("it"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("issons"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("issez"));
}
return el_str_concat(stem, EL_STR("issent"));
}
if (slot == 0) {
return el_str_concat(stem, EL_STR("s"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("s"));
}
if (slot == 2) {
return stem;
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("ons"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("ez"));
}
return el_str_concat(stem, EL_STR("ent"));
return 0;
}
el_val_t fr_future_stem(el_val_t base, el_val_t vgroup) {
if (str_eq(vgroup, EL_STR("re"))) {
return fr_str_drop_last(base, 1);
}
return base;
return 0;
}
el_val_t fr_regular_future(el_val_t fstem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(fstem, EL_STR("ai"));
}
if (slot == 1) {
return el_str_concat(fstem, EL_STR("as"));
}
if (slot == 2) {
return el_str_concat(fstem, EL_STR("a"));
}
if (slot == 3) {
return el_str_concat(fstem, EL_STR("ons"));
}
if (slot == 4) {
return el_str_concat(fstem, EL_STR("ez"));
}
return el_str_concat(fstem, EL_STR("ont"));
return 0;
}
el_val_t fr_irregular_future_stem(el_val_t verb) {
if (str_eq(verb, EL_STR("\xc3\xaatre"))) {
return EL_STR("ser");
}
if (str_eq(verb, EL_STR("avoir"))) {
return EL_STR("aur");
}
if (str_eq(verb, EL_STR("aller"))) {
return EL_STR("ir");
}
if (str_eq(verb, EL_STR("faire"))) {
return EL_STR("fer");
}
if (str_eq(verb, EL_STR("pouvoir"))) {
return EL_STR("pourr");
}
if (str_eq(verb, EL_STR("vouloir"))) {
return EL_STR("voudr");
}
if (str_eq(verb, EL_STR("venir"))) {
return EL_STR("viendr");
}
if (str_eq(verb, EL_STR("voir"))) {
return EL_STR("verr");
}
if (str_eq(verb, EL_STR("savoir"))) {
return EL_STR("saur");
}
return EL_STR("");
return 0;
}
el_val_t fr_imperfect_stem(el_val_t base, el_val_t vgroup) {
if (str_eq(base, EL_STR("\xc3\xaatre"))) {
return EL_STR("\xc3\xa9t");
}
return fr_stem(base);
return 0;
}
el_val_t fr_regular_imperfect(el_val_t istem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(istem, EL_STR("ais"));
}
if (slot == 1) {
return el_str_concat(istem, EL_STR("ais"));
}
if (slot == 2) {
return el_str_concat(istem, EL_STR("ait"));
}
if (slot == 3) {
return el_str_concat(istem, EL_STR("ions"));
}
if (slot == 4) {
return el_str_concat(istem, EL_STR("iez"));
}
return el_str_concat(istem, EL_STR("aient"));
return 0;
}
el_val_t fr_uses_etre(el_val_t verb) {
if (str_eq(verb, EL_STR("aller"))) {
return 1;
}
if (str_eq(verb, EL_STR("venir"))) {
return 1;
}
if (str_eq(verb, EL_STR("partir"))) {
return 1;
}
if (str_eq(verb, EL_STR("arriver"))) {
return 1;
}
if (str_eq(verb, EL_STR("entrer"))) {
return 1;
}
if (str_eq(verb, EL_STR("sortir"))) {
return 1;
}
if (str_eq(verb, EL_STR("na\xc3\xaetre"))) {
return 1;
}
if (str_eq(verb, EL_STR("mourir"))) {
return 1;
}
if (str_eq(verb, EL_STR("rester"))) {
return 1;
}
if (str_eq(verb, EL_STR("tomber"))) {
return 1;
}
if (str_eq(verb, EL_STR("monter"))) {
return 1;
}
if (str_eq(verb, EL_STR("descendre"))) {
return 1;
}
if (str_eq(verb, EL_STR("rentrer"))) {
return 1;
}
if (str_eq(verb, EL_STR("retourner"))) {
return 1;
}
if (str_eq(verb, EL_STR("passer"))) {
return 1;
}
return 0;
return 0;
}
el_val_t fr_past_participle(el_val_t verb) {
if (str_eq(verb, EL_STR("\xc3\xaatre"))) {
return EL_STR("\xc3\xa9t\xc3\xa9");
}
if (str_eq(verb, EL_STR("avoir"))) {
return EL_STR("eu");
}
if (str_eq(verb, EL_STR("aller"))) {
return EL_STR("all\xc3\xa9");
}
if (str_eq(verb, EL_STR("faire"))) {
return EL_STR("fait");
}
if (str_eq(verb, EL_STR("pouvoir"))) {
return EL_STR("pu");
}
if (str_eq(verb, EL_STR("vouloir"))) {
return EL_STR("voulu");
}
if (str_eq(verb, EL_STR("venir"))) {
return EL_STR("venu");
}
if (str_eq(verb, EL_STR("dire"))) {
return EL_STR("dit");
}
if (str_eq(verb, EL_STR("voir"))) {
return EL_STR("vu");
}
if (str_eq(verb, EL_STR("prendre"))) {
return EL_STR("pris");
}
if (str_eq(verb, EL_STR("mettre"))) {
return EL_STR("mis");
}
if (str_eq(verb, EL_STR("savoir"))) {
return EL_STR("su");
}
if (str_eq(verb, EL_STR("na\xc3\xaetre"))) {
return EL_STR("n\xc3\xa9");
}
if (str_eq(verb, EL_STR("mourir"))) {
return EL_STR("mort");
}
el_val_t vgroup = fr_verb_group(verb);
if (str_eq(vgroup, EL_STR("er"))) {
return el_str_concat(fr_str_drop_last(verb, 2), EL_STR("\xc3\xa9"));
}
if (str_eq(vgroup, EL_STR("ir"))) {
return el_str_concat(fr_str_drop_last(verb, 2), EL_STR("i"));
}
return el_str_concat(fr_str_drop_last(verb, 2), EL_STR("u"));
return 0;
}
el_val_t fr_avoir_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("ai");
}
if (slot == 1) {
return EL_STR("as");
}
if (slot == 2) {
return EL_STR("a");
}
if (slot == 3) {
return EL_STR("avons");
}
if (slot == 4) {
return EL_STR("avez");
}
return EL_STR("ont");
return 0;
}
el_val_t fr_etre_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("suis");
}
if (slot == 1) {
return EL_STR("es");
}
if (slot == 2) {
return EL_STR("est");
}
if (slot == 3) {
return EL_STR("sommes");
}
if (slot == 4) {
return EL_STR("\xc3\xaates");
}
return EL_STR("sont");
return 0;
}
el_val_t fr_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t slot = fr_slot(person, number);
if (str_eq(tense, EL_STR("present"))) {
el_val_t irreg = fr_irregular_present(verb, person, number);
if (!str_eq(irreg, EL_STR(""))) {
return irreg;
}
el_val_t vgroup = fr_verb_group(verb);
el_val_t stem = fr_stem(verb);
return fr_regular_present(stem, vgroup, slot);
}
if (str_eq(tense, EL_STR("future"))) {
el_val_t irreg_stem = fr_irregular_future_stem(verb);
if (!str_eq(irreg_stem, EL_STR(""))) {
return fr_regular_future(irreg_stem, slot);
}
el_val_t vgroup = fr_verb_group(verb);
el_val_t fstem = fr_future_stem(verb, vgroup);
return fr_regular_future(fstem, slot);
}
if (str_eq(tense, EL_STR("imperfect"))) {
el_val_t vgroup = fr_verb_group(verb);
el_val_t istem = fr_imperfect_stem(verb, vgroup);
return fr_regular_imperfect(istem, slot);
}
if (str_eq(tense, EL_STR("past"))) {
el_val_t pp = fr_past_participle(verb);
if (fr_uses_etre(verb)) {
el_val_t aux = fr_etre_present(slot);
return el_str_concat(el_str_concat(aux, EL_STR(" ")), pp);
}
el_val_t aux = fr_avoir_present(slot);
return el_str_concat(el_str_concat(aux, EL_STR(" ")), pp);
}
return verb;
return 0;
}
el_val_t fr_gender(el_val_t noun) {
if (fr_str_ends(noun, EL_STR("tion"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("sion"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("xion"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("ure"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("ette"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("ance"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("ence"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("it\xc3\xa9"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("t\xc3\xa9"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("ti\xc3\xa9"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("ude"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("ade"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("\xc3\xa9""e"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("ie"))) {
return EL_STR("f");
}
if (fr_str_ends(noun, EL_STR("ment"))) {
return EL_STR("m");
}
if (fr_str_ends(noun, EL_STR("age"))) {
return EL_STR("m");
}
if (fr_str_ends(noun, EL_STR("isme"))) {
return EL_STR("m");
}
if (fr_str_ends(noun, EL_STR("eau"))) {
return EL_STR("m");
}
if (fr_str_ends(noun, EL_STR("eur"))) {
return EL_STR("m");
}
if (fr_str_ends(noun, EL_STR("er"))) {
return EL_STR("m");
}
if (fr_str_ends(noun, EL_STR("\xc3\xa9"))) {
return EL_STR("m");
}
return EL_STR("unknown");
return 0;
}
el_val_t fr_invariant_plural(el_val_t noun) {
el_val_t last = fr_str_last_char(noun);
if (str_eq(last, EL_STR("s"))) {
return noun;
}
if (str_eq(last, EL_STR("x"))) {
return noun;
}
if (str_eq(last, EL_STR("z"))) {
return noun;
}
return EL_STR("");
return 0;
}
el_val_t fr_pluralize(el_val_t noun) {
el_val_t inv = fr_invariant_plural(noun);
if (!str_eq(inv, EL_STR(""))) {
return inv;
}
if (fr_str_ends(noun, EL_STR("eau"))) {
return el_str_concat(noun, EL_STR("x"));
}
if (fr_str_ends(noun, EL_STR("eu"))) {
return el_str_concat(noun, EL_STR("x"));
}
if (fr_str_ends(noun, EL_STR("al"))) {
return el_str_concat(fr_str_drop_last(noun, 2), EL_STR("aux"));
}
if (fr_str_ends(noun, EL_STR("ail"))) {
return el_str_concat(fr_str_drop_last(noun, 3), EL_STR("aux"));
}
return el_str_concat(noun, EL_STR("s"));
return 0;
}
el_val_t fr_agree_article(el_val_t noun, el_val_t definite, el_val_t number) {
el_val_t gender = fr_gender(noun);
el_val_t is_plural = str_eq(number, EL_STR("plural"));
el_val_t is_def = str_eq(definite, EL_STR("true"));
el_val_t vowel_start = fr_is_vowel_start(noun);
if (is_def) {
if (is_plural) {
return EL_STR("les");
}
if (vowel_start) {
return EL_STR("l'");
}
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("la");
}
return EL_STR("le");
}
if (is_plural) {
return EL_STR("des");
}
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("une");
}
return EL_STR("un");
return 0;
}
el_val_t fr_subject_starts_vowel(el_val_t subject) {
if (str_eq(subject, EL_STR("il"))) {
return 1;
}
if (str_eq(subject, EL_STR("elle"))) {
return 1;
}
if (str_eq(subject, EL_STR("ils"))) {
return 1;
}
if (str_eq(subject, EL_STR("elles"))) {
return 1;
}
return 0;
return 0;
}
el_val_t fr_verb_ends_vowel(el_val_t verb_form) {
el_val_t last = fr_str_last_char(verb_form);
if (str_eq(last, EL_STR("a"))) {
return 1;
}
if (str_eq(last, EL_STR("e"))) {
return 1;
}
if (str_eq(last, EL_STR("\xc3\xa9"))) {
return 1;
}
if (str_eq(last, EL_STR("i"))) {
return 1;
}
if (str_eq(last, EL_STR("o"))) {
return 1;
}
if (str_eq(last, EL_STR("u"))) {
return 1;
}
return 0;
return 0;
}
el_val_t fr_question_inversion(el_val_t subject, el_val_t verb_form) {
if (str_eq(subject, EL_STR("je"))) {
return el_str_concat(el_str_concat(EL_STR("est-ce que je "), verb_form), EL_STR(" ?"));
}
el_val_t need_t = 0;
if (fr_verb_ends_vowel(verb_form)) {
if (fr_subject_starts_vowel(subject)) {
need_t = 1;
}
}
if (need_t) {
return el_str_concat(el_str_concat(el_str_concat(verb_form, EL_STR("-t-")), subject), EL_STR(" ?"));
}
return el_str_concat(el_str_concat(el_str_concat(verb_form, EL_STR("-")), subject), EL_STR(" ?"));
return 0;
}
-29
View File
@@ -1,29 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn fr_str_ends(s: String, suf: String) -> Bool
extern fn fr_str_drop_last(s: String, n: Int) -> String
extern fn fr_str_last_char(s: String) -> String
extern fn fr_str_last2(s: String) -> String
extern fn fr_is_vowel_start(s: String) -> Bool
extern fn fr_is_known_irregular(verb: String) -> Bool
extern fn fr_verb_group(base: String) -> String
extern fn fr_stem(base: String) -> String
extern fn fr_slot(person: String, number: String) -> Int
extern fn fr_irregular_present(verb: String, person: String, number: String) -> String
extern fn fr_regular_present(stem: String, vgroup: String, slot: Int) -> String
extern fn fr_future_stem(base: String, vgroup: String) -> String
extern fn fr_regular_future(fstem: String, slot: Int) -> String
extern fn fr_irregular_future_stem(verb: String) -> String
extern fn fr_imperfect_stem(base: String, vgroup: String) -> String
extern fn fr_regular_imperfect(istem: String, slot: Int) -> String
extern fn fr_uses_etre(verb: String) -> Bool
extern fn fr_past_participle(verb: String) -> String
extern fn fr_avoir_present(slot: Int) -> String
extern fn fr_etre_present(slot: Int) -> String
extern fn fr_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn fr_gender(noun: String) -> String
extern fn fr_invariant_plural(noun: String) -> String
extern fn fr_pluralize(noun: String) -> String
extern fn fr_agree_article(noun: String, definite: String, number: String) -> String
extern fn fr_subject_starts_vowel(subject: String) -> Bool
extern fn fr_verb_ends_vowel(verb_form: String) -> Bool
extern fn fr_question_inversion(subject: String, verb_form: String) -> String
-811
View File
@@ -1,811 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t fro_str_ends(el_val_t s, el_val_t suf);
el_val_t fro_drop(el_val_t s, el_val_t n);
el_val_t fro_slot(el_val_t person, el_val_t number);
el_val_t fro_map_canonical(el_val_t verb);
el_val_t fro_estre_present(el_val_t slot);
el_val_t fro_estre_past(el_val_t slot);
el_val_t fro_estre_future(el_val_t slot);
el_val_t fro_avoir_present(el_val_t slot);
el_val_t fro_avoir_past(el_val_t slot);
el_val_t fro_avoir_future(el_val_t slot);
el_val_t fro_aler_present(el_val_t slot);
el_val_t fro_aler_past(el_val_t slot);
el_val_t fro_aler_future(el_val_t slot);
el_val_t fro_venir_present(el_val_t slot);
el_val_t fro_venir_past(el_val_t slot);
el_val_t fro_venir_future(el_val_t slot);
el_val_t fro_faire_present(el_val_t slot);
el_val_t fro_faire_past(el_val_t slot);
el_val_t fro_faire_future(el_val_t slot);
el_val_t fro_verb_class(el_val_t verb);
el_val_t fro_verb_stem(el_val_t verb, el_val_t vclass);
el_val_t fro_conj1_present(el_val_t stem, el_val_t slot);
el_val_t fro_conj1_past(el_val_t stem, el_val_t slot);
el_val_t fro_conj1_future(el_val_t verb, el_val_t slot);
el_val_t fro_conj2_present(el_val_t stem, el_val_t slot);
el_val_t fro_conj2_past(el_val_t stem, el_val_t slot);
el_val_t fro_conj2_future(el_val_t verb, el_val_t slot);
el_val_t fro_conj3_present(el_val_t stem, el_val_t slot);
el_val_t fro_conj3_past(el_val_t stem, el_val_t slot);
el_val_t fro_conj3_future(el_val_t verb, el_val_t slot);
el_val_t fro_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t fro_gender(el_val_t noun);
el_val_t fro_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t fro_decline_fem(el_val_t noun, el_val_t number);
el_val_t fro_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t fro_article(el_val_t gender, el_val_t gram_case, el_val_t number);
el_val_t fro_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t fro_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t fro_drop(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t fro_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t fro_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("estre");
}
if (str_eq(verb, EL_STR("have"))) {
return EL_STR("avoir");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("aler");
}
if (str_eq(verb, EL_STR("come"))) {
return EL_STR("venir");
}
if (str_eq(verb, EL_STR("do"))) {
return EL_STR("faire");
}
if (str_eq(verb, EL_STR("make"))) {
return EL_STR("faire");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("dire");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("veoir");
}
if (str_eq(verb, EL_STR("want"))) {
return EL_STR("vouloir");
}
if (str_eq(verb, EL_STR("can"))) {
return EL_STR("pooir");
}
return verb;
return 0;
}
el_val_t fro_estre_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("sui");
}
if (slot == 1) {
return EL_STR("es");
}
if (slot == 2) {
return EL_STR("est");
}
if (slot == 3) {
return EL_STR("somes");
}
if (slot == 4) {
return EL_STR("estes");
}
return EL_STR("sont");
return 0;
}
el_val_t fro_estre_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("fui");
}
if (slot == 1) {
return EL_STR("fus");
}
if (slot == 2) {
return EL_STR("fu");
}
if (slot == 3) {
return EL_STR("fumes");
}
if (slot == 4) {
return EL_STR("fustes");
}
return EL_STR("furent");
return 0;
}
el_val_t fro_estre_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("esterai");
}
if (slot == 1) {
return EL_STR("esteras");
}
if (slot == 2) {
return EL_STR("estera");
}
if (slot == 3) {
return EL_STR("esterons");
}
if (slot == 4) {
return EL_STR("esterez");
}
return EL_STR("esteront");
return 0;
}
el_val_t fro_avoir_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("ai");
}
if (slot == 1) {
return EL_STR("as");
}
if (slot == 2) {
return EL_STR("a");
}
if (slot == 3) {
return EL_STR("avons");
}
if (slot == 4) {
return EL_STR("avez");
}
return EL_STR("ont");
return 0;
}
el_val_t fro_avoir_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("oi");
}
if (slot == 1) {
return EL_STR("os");
}
if (slot == 2) {
return EL_STR("ot");
}
if (slot == 3) {
return EL_STR("eumes");
}
if (slot == 4) {
return EL_STR("eustes");
}
return EL_STR("orent");
return 0;
}
el_val_t fro_avoir_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("avrai");
}
if (slot == 1) {
return EL_STR("avras");
}
if (slot == 2) {
return EL_STR("avra");
}
if (slot == 3) {
return EL_STR("avrons");
}
if (slot == 4) {
return EL_STR("avrez");
}
return EL_STR("avront");
return 0;
}
el_val_t fro_aler_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("vois");
}
if (slot == 1) {
return EL_STR("vas");
}
if (slot == 2) {
return EL_STR("va");
}
if (slot == 3) {
return EL_STR("alons");
}
if (slot == 4) {
return EL_STR("alez");
}
return EL_STR("vont");
return 0;
}
el_val_t fro_aler_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("alai");
}
if (slot == 1) {
return EL_STR("alas");
}
if (slot == 2) {
return EL_STR("ala");
}
if (slot == 3) {
return EL_STR("alames");
}
if (slot == 4) {
return EL_STR("alastes");
}
return EL_STR("alerent");
return 0;
}
el_val_t fro_aler_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("irai");
}
if (slot == 1) {
return EL_STR("iras");
}
if (slot == 2) {
return EL_STR("ira");
}
if (slot == 3) {
return EL_STR("irons");
}
if (slot == 4) {
return EL_STR("irez");
}
return EL_STR("iront");
return 0;
}
el_val_t fro_venir_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("vieng");
}
if (slot == 1) {
return EL_STR("viens");
}
if (slot == 2) {
return EL_STR("vient");
}
if (slot == 3) {
return EL_STR("venons");
}
if (slot == 4) {
return EL_STR("venez");
}
return EL_STR("vienent");
return 0;
}
el_val_t fro_venir_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("ving");
}
if (slot == 1) {
return EL_STR("vins");
}
if (slot == 2) {
return EL_STR("vint");
}
if (slot == 3) {
return EL_STR("vinsmes");
}
if (slot == 4) {
return EL_STR("vinstes");
}
return EL_STR("vindrent");
return 0;
}
el_val_t fro_venir_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("venrai");
}
if (slot == 1) {
return EL_STR("venras");
}
if (slot == 2) {
return EL_STR("venra");
}
if (slot == 3) {
return EL_STR("venrons");
}
if (slot == 4) {
return EL_STR("venrez");
}
return EL_STR("venront");
return 0;
}
el_val_t fro_faire_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("faz");
}
if (slot == 1) {
return EL_STR("fais");
}
if (slot == 2) {
return EL_STR("fait");
}
if (slot == 3) {
return EL_STR("faisons");
}
if (slot == 4) {
return EL_STR("faites");
}
return EL_STR("font");
return 0;
}
el_val_t fro_faire_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("fis");
}
if (slot == 1) {
return EL_STR("fis");
}
if (slot == 2) {
return EL_STR("fist");
}
if (slot == 3) {
return EL_STR("fimes");
}
if (slot == 4) {
return EL_STR("fistes");
}
return EL_STR("firent");
return 0;
}
el_val_t fro_faire_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("ferai");
}
if (slot == 1) {
return EL_STR("feras");
}
if (slot == 2) {
return EL_STR("fera");
}
if (slot == 3) {
return EL_STR("ferons");
}
if (slot == 4) {
return EL_STR("ferez");
}
return EL_STR("feront");
return 0;
}
el_val_t fro_verb_class(el_val_t verb) {
if (fro_str_ends(verb, EL_STR("er"))) {
return EL_STR("1");
}
if (fro_str_ends(verb, EL_STR("ir"))) {
return EL_STR("2");
}
if (fro_str_ends(verb, EL_STR("re"))) {
return EL_STR("3");
}
return EL_STR("1");
return 0;
}
el_val_t fro_verb_stem(el_val_t verb, el_val_t vclass) {
return fro_drop(verb, 2);
return 0;
}
el_val_t fro_conj1_present(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("e"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("es"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("e"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("ons"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("ez"));
}
return el_str_concat(stem, EL_STR("ent"));
return 0;
}
el_val_t fro_conj1_past(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("ai"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("as"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("a"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("ames"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("astes"));
}
return el_str_concat(stem, EL_STR("erent"));
return 0;
}
el_val_t fro_conj1_future(el_val_t verb, el_val_t slot) {
el_val_t base = fro_drop(verb, 1);
if (slot == 0) {
return el_str_concat(base, EL_STR("rai"));
}
if (slot == 1) {
return el_str_concat(base, EL_STR("ras"));
}
if (slot == 2) {
return el_str_concat(base, EL_STR("ra"));
}
if (slot == 3) {
return el_str_concat(base, EL_STR("rons"));
}
if (slot == 4) {
return el_str_concat(base, EL_STR("rez"));
}
return el_str_concat(base, EL_STR("ront"));
return 0;
}
el_val_t fro_conj2_present(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("is"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("is"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("it"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("issons"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("issiez"));
}
return el_str_concat(stem, EL_STR("issent"));
return 0;
}
el_val_t fro_conj2_past(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("is"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("is"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("it"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("imes"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("istes"));
}
return el_str_concat(stem, EL_STR("irent"));
return 0;
}
el_val_t fro_conj2_future(el_val_t verb, el_val_t slot) {
el_val_t base = fro_drop(verb, 1);
if (slot == 0) {
return el_str_concat(base, EL_STR("rai"));
}
if (slot == 1) {
return el_str_concat(base, EL_STR("ras"));
}
if (slot == 2) {
return el_str_concat(base, EL_STR("ra"));
}
if (slot == 3) {
return el_str_concat(base, EL_STR("rons"));
}
if (slot == 4) {
return el_str_concat(base, EL_STR("rez"));
}
return el_str_concat(base, EL_STR("ront"));
return 0;
}
el_val_t fro_conj3_present(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return stem;
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("s"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("t"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("ons"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("ez"));
}
return el_str_concat(stem, EL_STR("ent"));
return 0;
}
el_val_t fro_conj3_past(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("is"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("is"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("it"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("imes"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("istes"));
}
return el_str_concat(stem, EL_STR("irent"));
return 0;
}
el_val_t fro_conj3_future(el_val_t verb, el_val_t slot) {
el_val_t base = fro_drop(verb, 2);
if (slot == 0) {
return el_str_concat(base, EL_STR("rai"));
}
if (slot == 1) {
return el_str_concat(base, EL_STR("ras"));
}
if (slot == 2) {
return el_str_concat(base, EL_STR("ra"));
}
if (slot == 3) {
return el_str_concat(base, EL_STR("rons"));
}
if (slot == 4) {
return el_str_concat(base, EL_STR("rez"));
}
return el_str_concat(base, EL_STR("ront"));
return 0;
}
el_val_t fro_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = fro_map_canonical(verb);
el_val_t slot = fro_slot(person, number);
if (str_eq(v, EL_STR("estre"))) {
if (str_eq(tense, EL_STR("present"))) {
return fro_estre_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return fro_estre_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return fro_estre_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("avoir"))) {
if (str_eq(tense, EL_STR("present"))) {
return fro_avoir_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return fro_avoir_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return fro_avoir_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("aler"))) {
if (str_eq(tense, EL_STR("present"))) {
return fro_aler_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return fro_aler_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return fro_aler_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("venir"))) {
if (str_eq(tense, EL_STR("present"))) {
return fro_venir_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return fro_venir_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return fro_venir_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("faire"))) {
if (str_eq(tense, EL_STR("present"))) {
return fro_faire_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return fro_faire_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return fro_faire_future(slot);
}
return v;
}
el_val_t vclass = fro_verb_class(v);
el_val_t stem = fro_verb_stem(v, vclass);
if (str_eq(vclass, EL_STR("1"))) {
if (str_eq(tense, EL_STR("present"))) {
return fro_conj1_present(stem, slot);
}
if (str_eq(tense, EL_STR("past"))) {
return fro_conj1_past(stem, slot);
}
if (str_eq(tense, EL_STR("future"))) {
return fro_conj1_future(v, slot);
}
return v;
}
if (str_eq(vclass, EL_STR("2"))) {
if (str_eq(tense, EL_STR("present"))) {
return fro_conj2_present(stem, slot);
}
if (str_eq(tense, EL_STR("past"))) {
return fro_conj2_past(stem, slot);
}
if (str_eq(tense, EL_STR("future"))) {
return fro_conj2_future(v, slot);
}
return v;
}
if (str_eq(vclass, EL_STR("3"))) {
if (str_eq(tense, EL_STR("present"))) {
return fro_conj3_present(stem, slot);
}
if (str_eq(tense, EL_STR("past"))) {
return fro_conj3_past(stem, slot);
}
if (str_eq(tense, EL_STR("future"))) {
return fro_conj3_future(v, slot);
}
return v;
}
return v;
return 0;
}
el_val_t fro_gender(el_val_t noun) {
if (fro_str_ends(noun, EL_STR("e"))) {
return EL_STR("fem");
}
return EL_STR("masc");
return 0;
}
el_val_t fro_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("s"));
}
return noun;
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return noun;
}
return el_str_concat(noun, EL_STR("s"));
return 0;
}
el_val_t fro_decline_fem(el_val_t noun, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
return noun;
}
return el_str_concat(noun, EL_STR("s"));
return 0;
}
el_val_t fro_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t gender = fro_gender(noun);
if (str_eq(gender, EL_STR("masc"))) {
return fro_decline_masc(noun, gram_case, number);
}
return fro_decline_fem(noun, number);
return 0;
}
el_val_t fro_article(el_val_t gender, el_val_t gram_case, el_val_t number) {
if (str_eq(gender, EL_STR("masc"))) {
if (str_eq(number, EL_STR("plural"))) {
return EL_STR("les");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("li");
}
return EL_STR("le");
}
if (str_eq(number, EL_STR("plural"))) {
return EL_STR("les");
}
return EL_STR("la");
return 0;
}
el_val_t fro_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
el_val_t gender = fro_gender(noun);
el_val_t declined = fro_decline(noun, gram_case, number);
if (str_eq(definite, EL_STR("true"))) {
el_val_t art = fro_article(gender, gram_case, number);
return el_str_concat(el_str_concat(art, EL_STR(" ")), declined);
}
return declined;
return 0;
}
-38
View File
@@ -1,38 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn fro_str_ends(s: String, suf: String) -> Bool
extern fn fro_drop(s: String, n: Int) -> String
extern fn fro_slot(person: String, number: String) -> Int
extern fn fro_map_canonical(verb: String) -> String
extern fn fro_estre_present(slot: Int) -> String
extern fn fro_estre_past(slot: Int) -> String
extern fn fro_estre_future(slot: Int) -> String
extern fn fro_avoir_present(slot: Int) -> String
extern fn fro_avoir_past(slot: Int) -> String
extern fn fro_avoir_future(slot: Int) -> String
extern fn fro_aler_present(slot: Int) -> String
extern fn fro_aler_past(slot: Int) -> String
extern fn fro_aler_future(slot: Int) -> String
extern fn fro_venir_present(slot: Int) -> String
extern fn fro_venir_past(slot: Int) -> String
extern fn fro_venir_future(slot: Int) -> String
extern fn fro_faire_present(slot: Int) -> String
extern fn fro_faire_past(slot: Int) -> String
extern fn fro_faire_future(slot: Int) -> String
extern fn fro_verb_class(verb: String) -> String
extern fn fro_verb_stem(verb: String, vclass: String) -> String
extern fn fro_conj1_present(stem: String, slot: Int) -> String
extern fn fro_conj1_past(stem: String, slot: Int) -> String
extern fn fro_conj1_future(verb: String, slot: Int) -> String
extern fn fro_conj2_present(stem: String, slot: Int) -> String
extern fn fro_conj2_past(stem: String, slot: Int) -> String
extern fn fro_conj2_future(verb: String, slot: Int) -> String
extern fn fro_conj3_present(stem: String, slot: Int) -> String
extern fn fro_conj3_past(stem: String, slot: Int) -> String
extern fn fro_conj3_future(verb: String, slot: Int) -> String
extern fn fro_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn fro_gender(noun: String) -> String
extern fn fro_decline_masc(noun: String, gram_case: String, number: String) -> String
extern fn fro_decline_fem(noun: String, number: String) -> String
extern fn fro_decline(noun: String, gram_case: String, number: String) -> String
extern fn fro_article(gender: String, gram_case: String, number: String) -> String
extern fn fro_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-605
View File
@@ -1,605 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t gez_str_ends(el_val_t s, el_val_t suf);
el_val_t gez_str_len(el_val_t s);
el_val_t gez_str_drop_last(el_val_t s, el_val_t n);
el_val_t gez_slot(el_val_t person, el_val_t number);
el_val_t gez_slot_g(el_val_t person, el_val_t gender, el_val_t number);
el_val_t gez_kwn_perfect(el_val_t slot);
el_val_t gez_kwn_imperfect(el_val_t slot);
el_val_t gez_is_copula(el_val_t verb);
el_val_t gez_conjugate_copula(el_val_t tense, el_val_t slot);
el_val_t gez_hlw_perfect(el_val_t slot);
el_val_t gez_hlw_imperfect(el_val_t slot);
el_val_t gez_hbl_perfect(el_val_t slot);
el_val_t gez_hbl_imperfect(el_val_t slot);
el_val_t gez_ray_perfect(el_val_t slot);
el_val_t gez_ray_imperfect(el_val_t slot);
el_val_t gez_qwl_perfect(el_val_t slot);
el_val_t gez_qwl_imperfect(el_val_t slot);
el_val_t gez_generic_perfect(el_val_t base3sg, el_val_t slot);
el_val_t gez_generic_imperfect(el_val_t base3sg, el_val_t slot);
el_val_t gez_known_verb(el_val_t verb, el_val_t tense, el_val_t slot);
el_val_t gez_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t gez_is_fidel(el_val_t noun);
el_val_t gez_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t gez_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t gez_map_canonical(el_val_t verb);
el_val_t gez_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t gez_str_len(el_val_t s) {
return str_len(s);
return 0;
}
el_val_t gez_str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t gez_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("plural"))) {
return 4;
}
return 0;
}
if (str_eq(person, EL_STR("second"))) {
return 1;
}
if (str_eq(number, EL_STR("plural"))) {
return 5;
}
return 2;
return 0;
}
el_val_t gez_slot_g(el_val_t person, el_val_t gender, el_val_t number) {
el_val_t base = gez_slot(person, number);
if (str_eq(person, EL_STR("third"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gender, EL_STR("f"))) {
return 3;
}
}
}
return base;
return 0;
}
el_val_t gez_kwn_perfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xe1\x88\x86\xe1\x8a\x95\xe1\x8a\xa9");
}
if (slot == 1) {
return EL_STR("\xe1\x88\x86\xe1\x8a\x95\xe1\x8a\xa8");
}
if (slot == 2) {
return EL_STR("\xe1\x88\x86\xe1\x8a\x90");
}
if (slot == 3) {
return EL_STR("\xe1\x88\x86\xe1\x8a\x90\xe1\x89\xb5");
}
if (slot == 4) {
return EL_STR("\xe1\x88\x86\xe1\x8a\x95\xe1\x8a\x90");
}
return EL_STR("\xe1\x88\x86\xe1\x8a\x91");
return 0;
}
el_val_t gez_kwn_imperfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xe1\x8a\xa5\xe1\x88\x86\xe1\x8a\x95");
}
if (slot == 1) {
return EL_STR("\xe1\x89\xb5\xe1\x88\x86\xe1\x8a\x95");
}
if (slot == 2) {
return EL_STR("\xe1\x8b\xad\xe1\x88\x86\xe1\x8a\x95");
}
if (slot == 3) {
return EL_STR("\xe1\x89\xb5\xe1\x88\x86\xe1\x8a\x95");
}
if (slot == 4) {
return EL_STR("\xe1\x8a\x95\xe1\x88\x86\xe1\x8a\x95");
}
return EL_STR("\xe1\x8b\xad\xe1\x88\x86\xe1\x8a\x91");
return 0;
}
el_val_t gez_is_copula(el_val_t verb) {
if (str_eq(verb, EL_STR("kwn"))) {
return 1;
}
if (str_eq(verb, EL_STR("\xe1\x88\x86\xe1\x8a\x90"))) {
return 1;
}
if (str_eq(verb, EL_STR("hona"))) {
return 1;
}
if (str_eq(verb, EL_STR("be"))) {
return 1;
}
return 0;
return 0;
}
el_val_t gez_conjugate_copula(el_val_t tense, el_val_t slot) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_kwn_imperfect(slot);
}
return gez_kwn_perfect(slot);
return 0;
}
el_val_t gez_hlw_perfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xe1\x88\x80\xe1\x88\x8e\xe1\x8a\xa9");
}
if (slot == 1) {
return EL_STR("\xe1\x88\x80\xe1\x88\x8e\xe1\x8a\xa8");
}
if (slot == 2) {
return EL_STR("\xe1\x88\x80\xe1\x88\x8e");
}
if (slot == 3) {
return EL_STR("\xe1\x88\x80\xe1\x88\x88\xe1\x8b\x88\xe1\x89\xb5");
}
if (slot == 4) {
return EL_STR("\xe1\x88\x80\xe1\x88\x8e\xe1\x8a\x90");
}
return EL_STR("\xe1\x88\x80\xe1\x88\x89");
return 0;
}
el_val_t gez_hlw_imperfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xe1\x8a\xa5\xe1\x88\x80\xe1\x88\x89");
}
if (slot == 1) {
return EL_STR("\xe1\x89\xb5\xe1\x88\x80\xe1\x88\x89");
}
if (slot == 2) {
return EL_STR("\xe1\x8b\xad\xe1\x88\x80\xe1\x88\x89");
}
if (slot == 3) {
return EL_STR("\xe1\x89\xb5\xe1\x88\x80\xe1\x88\x89");
}
if (slot == 4) {
return EL_STR("\xe1\x8a\x95\xe1\x88\x80\xe1\x88\x89");
}
return EL_STR("\xe1\x8b\xad\xe1\x88\x80\xe1\x88\x8d\xe1\x8b\x89");
return 0;
}
el_val_t gez_hbl_perfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xe1\x88\xb0\xe1\x8c\xa0\xe1\x8a\xa9");
}
if (slot == 1) {
return EL_STR("\xe1\x88\xb0\xe1\x8c\xa0\xe1\x8a\xa8");
}
if (slot == 2) {
return EL_STR("\xe1\x88\xb0\xe1\x8c\xa0");
}
if (slot == 3) {
return EL_STR("\xe1\x88\xb0\xe1\x8c\xa0\xe1\x89\xb5");
}
if (slot == 4) {
return EL_STR("\xe1\x88\xb0\xe1\x8c\xa0\xe1\x8a\x90");
}
return EL_STR("\xe1\x88\xb0\xe1\x8c\xa1");
return 0;
}
el_val_t gez_hbl_imperfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xe1\x8a\xa5\xe1\x88\xb0\xe1\x8c\xa5");
}
if (slot == 1) {
return EL_STR("\xe1\x89\xb5\xe1\x88\xb0\xe1\x8c\xa5");
}
if (slot == 2) {
return EL_STR("\xe1\x8b\xad\xe1\x88\xb0\xe1\x8c\xa5");
}
if (slot == 3) {
return EL_STR("\xe1\x89\xb5\xe1\x88\xb0\xe1\x8c\xa5");
}
if (slot == 4) {
return EL_STR("\xe1\x8a\x95\xe1\x88\xb0\xe1\x8c\xa5");
}
return EL_STR("\xe1\x8b\xad\xe1\x88\xb0\xe1\x8c\xa1");
return 0;
}
el_val_t gez_ray_perfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xe1\x8a\xa0\xe1\x8b\xa8\xe1\x8a\xa9");
}
if (slot == 1) {
return EL_STR("\xe1\x8a\xa0\xe1\x8b\xa8\xe1\x8a\xa8");
}
if (slot == 2) {
return EL_STR("\xe1\x8a\xa0\xe1\x8b\xa8");
}
if (slot == 3) {
return EL_STR("\xe1\x8a\xa0\xe1\x8b\xa8\xe1\x89\xb5");
}
if (slot == 4) {
return EL_STR("\xe1\x8a\xa0\xe1\x8b\xa8\xe1\x8a\x90");
}
return EL_STR("\xe1\x8a\xa0\xe1\x8b\xa9");
return 0;
}
el_val_t gez_ray_imperfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xe1\x8a\xa5\xe1\x8b\xab\xe1\x8b\xad");
}
if (slot == 1) {
return EL_STR("\xe1\x89\xb5\xe1\x8b\xab\xe1\x8b\xad");
}
if (slot == 2) {
return EL_STR("\xe1\x8b\xab\xe1\x8b\xad");
}
if (slot == 3) {
return EL_STR("\xe1\x89\xb5\xe1\x8b\xab\xe1\x8b\xad");
}
if (slot == 4) {
return EL_STR("\xe1\x8a\x95\xe1\x8b\xab\xe1\x8b\xad");
}
return EL_STR("\xe1\x8b\xab\xe1\x8b\xa9");
return 0;
}
el_val_t gez_qwl_perfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xe1\x89\xb0\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xad\xe1\x8a\xa9");
}
if (slot == 1) {
return EL_STR("\xe1\x89\xb0\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xad\xe1\x8a\xa8");
}
if (slot == 2) {
return EL_STR("\xe1\x89\xb0\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xa8");
}
if (slot == 3) {
return EL_STR("\xe1\x89\xb0\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xa8\xe1\x89\xb5");
}
if (slot == 4) {
return EL_STR("\xe1\x89\xb0\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xad\xe1\x8a\x90");
}
return EL_STR("\xe1\x89\xb0\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xa9");
return 0;
}
el_val_t gez_qwl_imperfect(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xe1\x8a\xa5\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xad");
}
if (slot == 1) {
return EL_STR("\xe1\x89\xb5\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xad");
}
if (slot == 2) {
return EL_STR("\xe1\x8b\xad\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xad");
}
if (slot == 3) {
return EL_STR("\xe1\x89\xb5\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xad");
}
if (slot == 4) {
return EL_STR("\xe1\x8a\x95\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xad");
}
return EL_STR("\xe1\x8b\xad\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xa9");
return 0;
}
el_val_t gez_generic_perfect(el_val_t base3sg, el_val_t slot) {
if (slot == 0) {
return el_str_concat(base3sg, EL_STR("\xe1\x8a\xa9"));
}
if (slot == 1) {
return el_str_concat(base3sg, EL_STR("\xe1\x8a\xa8"));
}
if (slot == 2) {
return base3sg;
}
if (slot == 3) {
return el_str_concat(base3sg, EL_STR("\xe1\x89\xb5"));
}
if (slot == 4) {
return el_str_concat(base3sg, EL_STR("\xe1\x8a\x90"));
}
return el_str_concat(base3sg, EL_STR("\xe1\x8a\xa1"));
return 0;
}
el_val_t gez_generic_imperfect(el_val_t base3sg, el_val_t slot) {
if (slot == 0) {
return el_str_concat(EL_STR("\xe1\x8a\xa5"), base3sg);
}
if (slot == 1) {
return el_str_concat(EL_STR("\xe1\x89\xb5"), base3sg);
}
if (slot == 2) {
return el_str_concat(EL_STR("\xe1\x8b\xad"), base3sg);
}
if (slot == 3) {
return el_str_concat(EL_STR("\xe1\x89\xb5"), base3sg);
}
if (slot == 4) {
return el_str_concat(EL_STR("\xe1\x8a\x95"), base3sg);
}
return el_str_concat(el_str_concat(EL_STR("\xe1\x8b\xad"), base3sg), EL_STR("\xe1\x8a\xa1"));
return 0;
}
el_val_t gez_known_verb(el_val_t verb, el_val_t tense, el_val_t slot) {
if (str_eq(verb, EL_STR("kwn"))) {
return gez_conjugate_copula(tense, slot);
}
if (str_eq(verb, EL_STR("\xe1\x88\x86\xe1\x8a\x90"))) {
return gez_conjugate_copula(tense, slot);
}
if (str_eq(verb, EL_STR("hona"))) {
return gez_conjugate_copula(tense, slot);
}
if (str_eq(verb, EL_STR("hlw"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_hlw_imperfect(slot);
}
return gez_hlw_perfect(slot);
}
if (str_eq(verb, EL_STR("\xe1\x88\x80\xe1\x88\x8e"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_hlw_imperfect(slot);
}
return gez_hlw_perfect(slot);
}
if (str_eq(verb, EL_STR("hallo"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_hlw_imperfect(slot);
}
return gez_hlw_perfect(slot);
}
if (str_eq(verb, EL_STR("hbl"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_hbl_imperfect(slot);
}
return gez_hbl_perfect(slot);
}
if (str_eq(verb, EL_STR("\xe1\x88\xb0\xe1\x8c\xa0"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_hbl_imperfect(slot);
}
return gez_hbl_perfect(slot);
}
if (str_eq(verb, EL_STR("s\xc3\xa4tta"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_hbl_imperfect(slot);
}
return gez_hbl_perfect(slot);
}
if (str_eq(verb, EL_STR("r\xca\xbey"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_ray_imperfect(slot);
}
return gez_ray_perfect(slot);
}
if (str_eq(verb, EL_STR("\xe1\x8a\xa0\xe1\x8b\xa8"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_ray_imperfect(slot);
}
return gez_ray_perfect(slot);
}
if (str_eq(verb, EL_STR("\xca\xbe""ayya"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_ray_imperfect(slot);
}
return gez_ray_perfect(slot);
}
if (str_eq(verb, EL_STR("qwl"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_qwl_imperfect(slot);
}
return gez_qwl_perfect(slot);
}
if (str_eq(verb, EL_STR("\xe1\x89\xb0\xe1\x8a\x93\xe1\x8c\x88\xe1\x88\xa8"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_qwl_imperfect(slot);
}
return gez_qwl_perfect(slot);
}
if (str_eq(verb, EL_STR("t\xc3\xa4nag\xc3\xa4r\xc3\xa4"))) {
if (str_eq(tense, EL_STR("imperfect"))) {
return gez_qwl_imperfect(slot);
}
return gez_qwl_perfect(slot);
}
return EL_STR("");
return 0;
}
el_val_t gez_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t slot = gez_slot(person, number);
if (gez_is_copula(verb)) {
return gez_conjugate_copula(tense, slot);
}
el_val_t known = gez_known_verb(verb, tense, slot);
if (!str_eq(known, EL_STR(""))) {
return known;
}
return verb;
return 0;
}
el_val_t gez_is_fidel(el_val_t noun) {
el_val_t n = gez_str_len(noun);
if (n == 0) {
return 0;
}
el_val_t first = str_slice(noun, 0, 1);
if (str_eq(first, EL_STR("\xe1\x88\x80"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x88\x81"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x88\x82"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x88\x83"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x88\x84"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x88\x85"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x88\x86"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x88\x88"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x88\x98"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x88\xb0"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x88\xb8"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x89\x80"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x89\xa0"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x89\xb0"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8a\x90"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8a\xa0"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8a\xa5"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8a\xa8"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8b\x88"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8b\x98"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8b\xa8"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8b\xb0"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8c\x88"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8c\xa0"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8d\x80"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8d\x88"))) {
return 1;
}
if (str_eq(first, EL_STR("\xe1\x8d\x90"))) {
return 1;
}
return 0;
return 0;
}
el_val_t gez_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("plural"))) {
if (gez_is_fidel(noun)) {
return el_str_concat(noun, EL_STR("\xe1\x8b\x8e\xe1\x89\xbd"));
}
return el_str_concat(noun, EL_STR("\xc4\x81t"));
}
if (str_eq(gram_case, EL_STR("acc"))) {
if (gez_is_fidel(noun)) {
return el_str_concat(noun, EL_STR("\xe1\x8a\x95"));
}
return el_str_concat(noun, EL_STR("a"));
}
return noun;
return 0;
}
el_val_t gez_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
return gez_decline(noun, gram_case, number);
return 0;
}
el_val_t gez_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("kwn");
}
if (str_eq(verb, EL_STR("exist"))) {
return EL_STR("hlw");
}
if (str_eq(verb, EL_STR("give"))) {
return EL_STR("hbl");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("r\xca\xbey");
}
if (str_eq(verb, EL_STR("speak"))) {
return EL_STR("qwl");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("qwl");
}
return verb;
return 0;
}
-26
View File
@@ -1,26 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn gez_str_ends(s: String, suf: String) -> Bool
extern fn gez_str_len(s: String) -> Int
extern fn gez_str_drop_last(s: String, n: Int) -> String
extern fn gez_slot(person: String, number: String) -> Int
extern fn gez_slot_g(person: String, gender: String, number: String) -> Int
extern fn gez_kwn_perfect(slot: Int) -> String
extern fn gez_kwn_imperfect(slot: Int) -> String
extern fn gez_is_copula(verb: String) -> Bool
extern fn gez_conjugate_copula(tense: String, slot: Int) -> String
extern fn gez_hlw_perfect(slot: Int) -> String
extern fn gez_hlw_imperfect(slot: Int) -> String
extern fn gez_hbl_perfect(slot: Int) -> String
extern fn gez_hbl_imperfect(slot: Int) -> String
extern fn gez_ray_perfect(slot: Int) -> String
extern fn gez_ray_imperfect(slot: Int) -> String
extern fn gez_qwl_perfect(slot: Int) -> String
extern fn gez_qwl_imperfect(slot: Int) -> String
extern fn gez_generic_perfect(base3sg: String, slot: Int) -> String
extern fn gez_generic_imperfect(base3sg: String, slot: Int) -> String
extern fn gez_known_verb(verb: String, tense: String, slot: Int) -> String
extern fn gez_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn gez_is_fidel(noun: String) -> Bool
extern fn gez_decline(noun: String, gram_case: String, number: String) -> String
extern fn gez_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
extern fn gez_map_canonical(verb: String) -> String
-721
View File
@@ -1,721 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t goh_str_ends(el_val_t s, el_val_t suf);
el_val_t goh_drop(el_val_t s, el_val_t n);
el_val_t goh_slot(el_val_t person, el_val_t number);
el_val_t goh_map_canonical(el_val_t verb);
el_val_t goh_wesan_present(el_val_t slot);
el_val_t goh_wesan_past(el_val_t slot);
el_val_t goh_haben_present(el_val_t slot);
el_val_t goh_haben_past(el_val_t slot);
el_val_t goh_gan_present(el_val_t slot);
el_val_t goh_gan_past(el_val_t slot);
el_val_t goh_sehan_present(el_val_t slot);
el_val_t goh_sehan_past(el_val_t slot);
el_val_t goh_quethan_present(el_val_t slot);
el_val_t goh_quethan_past(el_val_t slot);
el_val_t goh_tuon_present(el_val_t slot);
el_val_t goh_tuon_past(el_val_t slot);
el_val_t goh_weak_present(el_val_t stem, el_val_t slot);
el_val_t goh_weak_past(el_val_t stem, el_val_t slot);
el_val_t goh_verb_stem(el_val_t verb);
el_val_t goh_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t goh_stem_type(el_val_t noun);
el_val_t goh_extract_stem(el_val_t noun, el_val_t stype);
el_val_t goh_decline_masc_a_sg(el_val_t stem, el_val_t gram_case);
el_val_t goh_decline_masc_a_pl(el_val_t stem, el_val_t gram_case);
el_val_t goh_decline_fem_o_sg(el_val_t stem, el_val_t gram_case);
el_val_t goh_decline_fem_o_pl(el_val_t stem, el_val_t gram_case);
el_val_t goh_decline_neut_a_sg(el_val_t stem, el_val_t gram_case);
el_val_t goh_decline_neut_a_pl(el_val_t stem, el_val_t gram_case);
el_val_t goh_decline_masc_n_sg(el_val_t stem, el_val_t gram_case);
el_val_t goh_decline_masc_n_pl(el_val_t stem, el_val_t gram_case);
el_val_t goh_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t goh_demo_article(el_val_t stype, el_val_t number);
el_val_t goh_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t goh_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t goh_drop(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t goh_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t goh_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("wesan");
}
if (str_eq(verb, EL_STR("have"))) {
return EL_STR("haben");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("gan");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("sehan");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("quethan");
}
if (str_eq(verb, EL_STR("do"))) {
return EL_STR("tuon");
}
if (str_eq(verb, EL_STR("make"))) {
return EL_STR("tuon");
}
if (str_eq(verb, EL_STR("come"))) {
return EL_STR("queman");
}
if (str_eq(verb, EL_STR("give"))) {
return EL_STR("geban");
}
if (str_eq(verb, EL_STR("know"))) {
return EL_STR("wizzan");
}
if (str_eq(verb, EL_STR("want"))) {
return EL_STR("wellan");
}
return verb;
return 0;
}
el_val_t goh_wesan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("bim");
}
if (slot == 1) {
return EL_STR("bist");
}
if (slot == 2) {
return EL_STR("ist");
}
if (slot == 3) {
return EL_STR("birum");
}
if (slot == 4) {
return EL_STR("birut");
}
return EL_STR("sint");
return 0;
}
el_val_t goh_wesan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("was");
}
if (slot == 1) {
return EL_STR("wari");
}
if (slot == 2) {
return EL_STR("was");
}
if (slot == 3) {
return EL_STR("warum");
}
if (slot == 4) {
return EL_STR("warut");
}
return EL_STR("warun");
return 0;
}
el_val_t goh_haben_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("habem");
}
if (slot == 1) {
return EL_STR("habest");
}
if (slot == 2) {
return EL_STR("habet");
}
if (slot == 3) {
return EL_STR("habemes");
}
if (slot == 4) {
return EL_STR("habet");
}
return EL_STR("habent");
return 0;
}
el_val_t goh_haben_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("habeta");
}
if (slot == 1) {
return EL_STR("habetos");
}
if (slot == 2) {
return EL_STR("habeta");
}
if (slot == 3) {
return EL_STR("habetom");
}
if (slot == 4) {
return EL_STR("habetot");
}
return EL_STR("habeton");
return 0;
}
el_val_t goh_gan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("gan");
}
if (slot == 1) {
return EL_STR("gest");
}
if (slot == 2) {
return EL_STR("get");
}
if (slot == 3) {
return EL_STR("games");
}
if (slot == 4) {
return EL_STR("gat");
}
return EL_STR("gant");
return 0;
}
el_val_t goh_gan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("giang");
}
if (slot == 1) {
return EL_STR("giangi");
}
if (slot == 2) {
return EL_STR("giang");
}
if (slot == 3) {
return EL_STR("giangum");
}
if (slot == 4) {
return EL_STR("giangun");
}
return EL_STR("giangun");
return 0;
}
el_val_t goh_sehan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("sihu");
}
if (slot == 1) {
return EL_STR("sihist");
}
if (slot == 2) {
return EL_STR("sihit");
}
if (slot == 3) {
return EL_STR("sehemes");
}
if (slot == 4) {
return EL_STR("sehet");
}
return EL_STR("sehent");
return 0;
}
el_val_t goh_sehan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("sah");
}
if (slot == 1) {
return EL_STR("sahi");
}
if (slot == 2) {
return EL_STR("sah");
}
if (slot == 3) {
return EL_STR("sahum");
}
if (slot == 4) {
return EL_STR("sahut");
}
return EL_STR("sahun");
return 0;
}
el_val_t goh_quethan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("quidu");
}
if (slot == 1) {
return EL_STR("quidist");
}
if (slot == 2) {
return EL_STR("quidit");
}
if (slot == 3) {
return EL_STR("quethumes");
}
if (slot == 4) {
return EL_STR("quethet");
}
return EL_STR("quethent");
return 0;
}
el_val_t goh_quethan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("quad");
}
if (slot == 1) {
return EL_STR("quadi");
}
if (slot == 2) {
return EL_STR("quad");
}
if (slot == 3) {
return EL_STR("quadum");
}
if (slot == 4) {
return EL_STR("quadut");
}
return EL_STR("quadun");
return 0;
}
el_val_t goh_tuon_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("tuom");
}
if (slot == 1) {
return EL_STR("tuost");
}
if (slot == 2) {
return EL_STR("tuot");
}
if (slot == 3) {
return EL_STR("tuomes");
}
if (slot == 4) {
return EL_STR("tuot");
}
return EL_STR("tuont");
return 0;
}
el_val_t goh_tuon_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("teta");
}
if (slot == 1) {
return EL_STR("tetos");
}
if (slot == 2) {
return EL_STR("teta");
}
if (slot == 3) {
return EL_STR("tetom");
}
if (slot == 4) {
return EL_STR("tetot");
}
return EL_STR("teton");
return 0;
}
el_val_t goh_weak_present(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("u"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("ist"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("it"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("emes"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("et"));
}
return el_str_concat(stem, EL_STR("ent"));
return 0;
}
el_val_t goh_weak_past(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("ta"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("tos"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("ta"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("tom"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("tot"));
}
return el_str_concat(stem, EL_STR("ton"));
return 0;
}
el_val_t goh_verb_stem(el_val_t verb) {
return goh_drop(verb, 2);
return 0;
}
el_val_t goh_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = goh_map_canonical(verb);
el_val_t slot = goh_slot(person, number);
if (str_eq(v, EL_STR("wesan"))) {
if (str_eq(tense, EL_STR("present"))) {
return goh_wesan_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return goh_wesan_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("haben"))) {
if (str_eq(tense, EL_STR("present"))) {
return goh_haben_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return goh_haben_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("haben"))) {
if (str_eq(tense, EL_STR("present"))) {
return goh_haben_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return goh_haben_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("gan"))) {
if (str_eq(tense, EL_STR("present"))) {
return goh_gan_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return goh_gan_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("sehan"))) {
if (str_eq(tense, EL_STR("present"))) {
return goh_sehan_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return goh_sehan_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("quethan"))) {
if (str_eq(tense, EL_STR("present"))) {
return goh_quethan_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return goh_quethan_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("tuon"))) {
if (str_eq(tense, EL_STR("present"))) {
return goh_tuon_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return goh_tuon_past(slot);
}
return v;
}
el_val_t stem = goh_verb_stem(v);
if (str_eq(tense, EL_STR("present"))) {
return goh_weak_present(stem, slot);
}
if (str_eq(tense, EL_STR("past"))) {
return goh_weak_past(stem, slot);
}
return v;
return 0;
}
el_val_t goh_stem_type(el_val_t noun) {
if (goh_str_ends(noun, EL_STR("o"))) {
return EL_STR("masc_n");
}
if (goh_str_ends(noun, EL_STR("a"))) {
return EL_STR("fem_o");
}
if (goh_str_ends(noun, EL_STR("t"))) {
return EL_STR("neut_a");
}
if (goh_str_ends(noun, EL_STR("d"))) {
return EL_STR("neut_a");
}
if (goh_str_ends(noun, EL_STR("nd"))) {
return EL_STR("neut_a");
}
return EL_STR("masc_a");
return 0;
}
el_val_t goh_extract_stem(el_val_t noun, el_val_t stype) {
if (str_eq(stype, EL_STR("fem_o"))) {
return goh_drop(noun, 1);
}
if (str_eq(stype, EL_STR("masc_n"))) {
return goh_drop(noun, 1);
}
return noun;
return 0;
}
el_val_t goh_decline_masc_a_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return stem;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return stem;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("es"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("e"));
}
return stem;
return 0;
}
el_val_t goh_decline_masc_a_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("o"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("um"));
}
return el_str_concat(stem, EL_STR("a"));
return 0;
}
el_val_t goh_decline_fem_o_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("u"));
}
return el_str_concat(stem, EL_STR("a"));
return 0;
}
el_val_t goh_decline_fem_o_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("ono"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("om"));
}
return el_str_concat(stem, EL_STR("a"));
return 0;
}
el_val_t goh_decline_neut_a_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return stem;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return stem;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("es"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("e"));
}
return stem;
return 0;
}
el_val_t goh_decline_neut_a_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return stem;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return stem;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("o"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("um"));
}
return stem;
return 0;
}
el_val_t goh_decline_masc_n_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("o"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("on"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("on"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("on"));
}
return el_str_concat(stem, EL_STR("o"));
return 0;
}
el_val_t goh_decline_masc_n_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("on"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("on"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("ono"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("om"));
}
return el_str_concat(stem, EL_STR("on"));
return 0;
}
el_val_t goh_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t stype = goh_stem_type(noun);
el_val_t stem = goh_extract_stem(noun, stype);
if (str_eq(stype, EL_STR("masc_a"))) {
if (str_eq(number, EL_STR("singular"))) {
return goh_decline_masc_a_sg(stem, gram_case);
}
return goh_decline_masc_a_pl(stem, gram_case);
}
if (str_eq(stype, EL_STR("fem_o"))) {
if (str_eq(number, EL_STR("singular"))) {
return goh_decline_fem_o_sg(stem, gram_case);
}
return goh_decline_fem_o_pl(stem, gram_case);
}
if (str_eq(stype, EL_STR("neut_a"))) {
if (str_eq(number, EL_STR("singular"))) {
return goh_decline_neut_a_sg(stem, gram_case);
}
return goh_decline_neut_a_pl(stem, gram_case);
}
if (str_eq(stype, EL_STR("masc_n"))) {
if (str_eq(number, EL_STR("singular"))) {
return goh_decline_masc_n_sg(stem, gram_case);
}
return goh_decline_masc_n_pl(stem, gram_case);
}
return noun;
return 0;
}
el_val_t goh_demo_article(el_val_t stype, el_val_t number) {
if (str_eq(number, EL_STR("plural"))) {
return EL_STR("die");
}
if (str_eq(stype, EL_STR("fem_o"))) {
return EL_STR("diu");
}
if (str_eq(stype, EL_STR("neut_a"))) {
return EL_STR("daz");
}
return EL_STR("der");
return 0;
}
el_val_t goh_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
el_val_t stype = goh_stem_type(noun);
el_val_t declined = goh_decline(noun, gram_case, number);
if (str_eq(definite, EL_STR("true"))) {
el_val_t art = goh_demo_article(stype, number);
return el_str_concat(el_str_concat(art, EL_STR(" ")), declined);
}
return declined;
return 0;
}
-34
View File
@@ -1,34 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn goh_str_ends(s: String, suf: String) -> Bool
extern fn goh_drop(s: String, n: Int) -> String
extern fn goh_slot(person: String, number: String) -> Int
extern fn goh_map_canonical(verb: String) -> String
extern fn goh_wesan_present(slot: Int) -> String
extern fn goh_wesan_past(slot: Int) -> String
extern fn goh_haben_present(slot: Int) -> String
extern fn goh_haben_past(slot: Int) -> String
extern fn goh_gan_present(slot: Int) -> String
extern fn goh_gan_past(slot: Int) -> String
extern fn goh_sehan_present(slot: Int) -> String
extern fn goh_sehan_past(slot: Int) -> String
extern fn goh_quethan_present(slot: Int) -> String
extern fn goh_quethan_past(slot: Int) -> String
extern fn goh_tuon_present(slot: Int) -> String
extern fn goh_tuon_past(slot: Int) -> String
extern fn goh_weak_present(stem: String, slot: Int) -> String
extern fn goh_weak_past(stem: String, slot: Int) -> String
extern fn goh_verb_stem(verb: String) -> String
extern fn goh_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn goh_stem_type(noun: String) -> String
extern fn goh_extract_stem(noun: String, stype: String) -> String
extern fn goh_decline_masc_a_sg(stem: String, gram_case: String) -> String
extern fn goh_decline_masc_a_pl(stem: String, gram_case: String) -> String
extern fn goh_decline_fem_o_sg(stem: String, gram_case: String) -> String
extern fn goh_decline_fem_o_pl(stem: String, gram_case: String) -> String
extern fn goh_decline_neut_a_sg(stem: String, gram_case: String) -> String
extern fn goh_decline_neut_a_pl(stem: String, gram_case: String) -> String
extern fn goh_decline_masc_n_sg(stem: String, gram_case: String) -> String
extern fn goh_decline_masc_n_pl(stem: String, gram_case: String) -> String
extern fn goh_decline(noun: String, gram_case: String, number: String) -> String
extern fn goh_demo_article(stype: String, number: String) -> String
extern fn goh_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-735
View File
@@ -1,735 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t got_str_ends(el_val_t s, el_val_t suf);
el_val_t got_str_drop_last(el_val_t s, el_val_t n);
el_val_t got_slot(el_val_t person, el_val_t number);
el_val_t got_map_canonical(el_val_t verb);
el_val_t got_wisan_present(el_val_t slot);
el_val_t got_wisan_past(el_val_t slot);
el_val_t got_haban_present(el_val_t slot);
el_val_t got_haban_past(el_val_t slot);
el_val_t got_gaggan_present(el_val_t slot);
el_val_t got_gaggan_past(el_val_t slot);
el_val_t got_saihwan_present(el_val_t slot);
el_val_t got_saihwan_past(el_val_t slot);
el_val_t got_qithan_present(el_val_t slot);
el_val_t got_qithan_past(el_val_t slot);
el_val_t got_niman_present(el_val_t slot);
el_val_t got_niman_past(el_val_t slot);
el_val_t got_wk1_present_ending(el_val_t slot);
el_val_t got_wk1_past_ending(el_val_t slot);
el_val_t got_wk1_conjugate(el_val_t stem, el_val_t tense, el_val_t slot);
el_val_t got_wk2_present_ending(el_val_t slot);
el_val_t got_wk2_past_ending(el_val_t slot);
el_val_t got_wk2_conjugate(el_val_t stem, el_val_t tense, el_val_t slot);
el_val_t got_verb_class(el_val_t verb);
el_val_t got_verb_stem(el_val_t verb, el_val_t vclass);
el_val_t got_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t got_decline_a_stem_sg(el_val_t stem, el_val_t gram_case);
el_val_t got_decline_a_stem_pl(el_val_t stem, el_val_t gram_case);
el_val_t got_decline_o_stem_sg(el_val_t stem, el_val_t gram_case);
el_val_t got_decline_o_stem_pl(el_val_t stem, el_val_t gram_case);
el_val_t got_decline_n_stem_sg(el_val_t stem, el_val_t gram_case);
el_val_t got_decline_n_stem_pl(el_val_t stem, el_val_t gram_case);
el_val_t got_stem_type(el_val_t noun);
el_val_t got_extract_stem(el_val_t noun, el_val_t stype);
el_val_t got_demo_article(el_val_t stype);
el_val_t got_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t got_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t got_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t got_str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t got_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t got_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("wisan");
}
if (str_eq(verb, EL_STR("have"))) {
return EL_STR("haban");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("gaggan");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("saihwan");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("qi\xc3\xbe""an");
}
if (str_eq(verb, EL_STR("take"))) {
return EL_STR("niman");
}
if (str_eq(verb, EL_STR("come"))) {
return EL_STR("qiman");
}
if (str_eq(verb, EL_STR("give"))) {
return EL_STR("giban");
}
if (str_eq(verb, EL_STR("know"))) {
return EL_STR("kunnan");
}
if (str_eq(verb, EL_STR("want"))) {
return EL_STR("wiljan");
}
return verb;
return 0;
}
el_val_t got_wisan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("im");
}
if (slot == 1) {
return EL_STR("is");
}
if (slot == 2) {
return EL_STR("ist");
}
if (slot == 3) {
return EL_STR("sijum");
}
if (slot == 4) {
return EL_STR("siju\xc3\xbe");
}
return EL_STR("sind");
return 0;
}
el_val_t got_wisan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("was");
}
if (slot == 1) {
return EL_STR("wast");
}
if (slot == 2) {
return EL_STR("was");
}
if (slot == 3) {
return EL_STR("wesum");
}
if (slot == 4) {
return EL_STR("wesu\xc3\xbe");
}
return EL_STR("wesun");
return 0;
}
el_val_t got_haban_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("haba");
}
if (slot == 1) {
return EL_STR("habais");
}
if (slot == 2) {
return EL_STR("habai\xc3\xbe");
}
if (slot == 3) {
return EL_STR("habam");
}
if (slot == 4) {
return EL_STR("habai\xc3\xbe");
}
return EL_STR("haband");
return 0;
}
el_val_t got_haban_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("habida");
}
if (slot == 1) {
return EL_STR("habides");
}
if (slot == 2) {
return EL_STR("habida");
}
if (slot == 3) {
return EL_STR("habidum");
}
if (slot == 4) {
return EL_STR("habide\xc3\xbe");
}
return EL_STR("habidedun");
return 0;
}
el_val_t got_gaggan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("gagga");
}
if (slot == 1) {
return EL_STR("gaggis");
}
if (slot == 2) {
return EL_STR("gaggi\xc3\xbe");
}
if (slot == 3) {
return EL_STR("gagam");
}
if (slot == 4) {
return EL_STR("gagi\xc3\xbe");
}
return EL_STR("gaggand");
return 0;
}
el_val_t got_gaggan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("iddja");
}
if (slot == 1) {
return EL_STR("iddj\xc4\x93s");
}
if (slot == 2) {
return EL_STR("iddja");
}
if (slot == 3) {
return EL_STR("iddj\xc4\x93""dum");
}
if (slot == 4) {
return EL_STR("iddj\xc4\x93""du\xc3\xbe");
}
return EL_STR("iddj\xc4\x93""dun");
return 0;
}
el_val_t got_saihwan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("saihwa");
}
if (slot == 1) {
return EL_STR("saihwis");
}
if (slot == 2) {
return EL_STR("saihwi\xc3\xbe");
}
if (slot == 3) {
return EL_STR("saihwam");
}
if (slot == 4) {
return EL_STR("saihwi\xc3\xbe");
}
return EL_STR("saihwand");
return 0;
}
el_val_t got_saihwan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("sahw");
}
if (slot == 1) {
return EL_STR("sahwt");
}
if (slot == 2) {
return EL_STR("sahw");
}
if (slot == 3) {
return EL_STR("sehwum");
}
if (slot == 4) {
return EL_STR("sehwu\xc3\xbe");
}
return EL_STR("sehwun");
return 0;
}
el_val_t got_qithan_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("qi\xc3\xbe""a");
}
if (slot == 1) {
return EL_STR("qi\xc3\xbeis");
}
if (slot == 2) {
return EL_STR("qi\xc3\xbei\xc3\xbe");
}
if (slot == 3) {
return EL_STR("qi\xc3\xbe""am");
}
if (slot == 4) {
return EL_STR("qi\xc3\xbei\xc3\xbe");
}
return EL_STR("qi\xc3\xbe""and");
return 0;
}
el_val_t got_qithan_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("qa\xc3\xbe");
}
if (slot == 1) {
return EL_STR("qast");
}
if (slot == 2) {
return EL_STR("qa\xc3\xbe");
}
if (slot == 3) {
return EL_STR("q\xc4\x93\xc3\xbeum");
}
if (slot == 4) {
return EL_STR("q\xc4\x93\xc3\xbeu\xc3\xbe");
}
return EL_STR("q\xc4\x93\xc3\xbeun");
return 0;
}
el_val_t got_niman_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("nima");
}
if (slot == 1) {
return EL_STR("nimis");
}
if (slot == 2) {
return EL_STR("nimi\xc3\xbe");
}
if (slot == 3) {
return EL_STR("nimam");
}
if (slot == 4) {
return EL_STR("nimi\xc3\xbe");
}
return EL_STR("nimand");
return 0;
}
el_val_t got_niman_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("nam");
}
if (slot == 1) {
return EL_STR("namt");
}
if (slot == 2) {
return EL_STR("nam");
}
if (slot == 3) {
return EL_STR("n\xc4\x93mum");
}
if (slot == 4) {
return EL_STR("n\xc4\x93mu\xc3\xbe");
}
return EL_STR("n\xc4\x93mun");
return 0;
}
el_val_t got_wk1_present_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("a");
}
if (slot == 1) {
return EL_STR("is");
}
if (slot == 2) {
return EL_STR("i\xc3\xbe");
}
if (slot == 3) {
return EL_STR("jam");
}
if (slot == 4) {
return EL_STR("ji\xc3\xbe");
}
return EL_STR("jand");
return 0;
}
el_val_t got_wk1_past_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("ida");
}
if (slot == 1) {
return EL_STR("ides");
}
if (slot == 2) {
return EL_STR("ida");
}
if (slot == 3) {
return EL_STR("idum");
}
if (slot == 4) {
return EL_STR("ide\xc3\xbe");
}
return EL_STR("idedun");
return 0;
}
el_val_t got_wk1_conjugate(el_val_t stem, el_val_t tense, el_val_t slot) {
if (str_eq(tense, EL_STR("present"))) {
return el_str_concat(stem, got_wk1_present_ending(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return el_str_concat(stem, got_wk1_past_ending(slot));
}
return stem;
return 0;
}
el_val_t got_wk2_present_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("o");
}
if (slot == 1) {
return EL_STR("os");
}
if (slot == 2) {
return EL_STR("o\xc3\xbe");
}
if (slot == 3) {
return EL_STR("om");
}
if (slot == 4) {
return EL_STR("o\xc3\xbe");
}
return EL_STR("ond");
return 0;
}
el_val_t got_wk2_past_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("oda");
}
if (slot == 1) {
return EL_STR("odes");
}
if (slot == 2) {
return EL_STR("oda");
}
if (slot == 3) {
return EL_STR("odum");
}
if (slot == 4) {
return EL_STR("ode\xc3\xbe");
}
return EL_STR("odedun");
return 0;
}
el_val_t got_wk2_conjugate(el_val_t stem, el_val_t tense, el_val_t slot) {
if (str_eq(tense, EL_STR("present"))) {
return el_str_concat(stem, got_wk2_present_ending(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return el_str_concat(stem, got_wk2_past_ending(slot));
}
return stem;
return 0;
}
el_val_t got_verb_class(el_val_t verb) {
if (got_str_ends(verb, EL_STR("jan"))) {
return EL_STR("wk1");
}
if (got_str_ends(verb, EL_STR("on"))) {
return EL_STR("wk2");
}
return EL_STR("wk1");
return 0;
}
el_val_t got_verb_stem(el_val_t verb, el_val_t vclass) {
if (str_eq(vclass, EL_STR("wk1"))) {
return got_str_drop_last(verb, 3);
}
if (str_eq(vclass, EL_STR("wk2"))) {
return got_str_drop_last(verb, 2);
}
return got_str_drop_last(verb, 2);
return 0;
}
el_val_t got_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = got_map_canonical(verb);
el_val_t slot = got_slot(person, number);
if (str_eq(v, EL_STR("wisan"))) {
if (str_eq(tense, EL_STR("present"))) {
return got_wisan_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return got_wisan_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("haban"))) {
if (str_eq(tense, EL_STR("present"))) {
return got_haban_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return got_haban_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("gaggan"))) {
if (str_eq(tense, EL_STR("present"))) {
return got_gaggan_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return got_gaggan_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("saihwan"))) {
if (str_eq(tense, EL_STR("present"))) {
return got_saihwan_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return got_saihwan_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("qi\xc3\xbe""an"))) {
if (str_eq(tense, EL_STR("present"))) {
return got_qithan_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return got_qithan_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("niman"))) {
if (str_eq(tense, EL_STR("present"))) {
return got_niman_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return got_niman_past(slot);
}
return v;
}
el_val_t vclass = got_verb_class(v);
el_val_t stem = got_verb_stem(v, vclass);
if (str_eq(vclass, EL_STR("wk1"))) {
return got_wk1_conjugate(stem, tense, slot);
}
if (str_eq(vclass, EL_STR("wk2"))) {
return got_wk2_conjugate(stem, tense, slot);
}
return v;
return 0;
}
el_val_t got_decline_a_stem_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("s"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return stem;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("is"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("a"));
}
return el_str_concat(stem, EL_STR("s"));
return 0;
}
el_val_t got_decline_a_stem_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("os"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("ans"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("e"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("am"));
}
return el_str_concat(stem, EL_STR("os"));
return 0;
}
el_val_t got_decline_o_stem_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("o"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("os"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("ai"));
}
return el_str_concat(stem, EL_STR("o"));
return 0;
}
el_val_t got_decline_o_stem_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("os"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("os"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("o"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("om"));
}
return el_str_concat(stem, EL_STR("os"));
return 0;
}
el_val_t got_decline_n_stem_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("an"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("ins"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("in"));
}
return el_str_concat(stem, EL_STR("a"));
return 0;
}
el_val_t got_decline_n_stem_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("ans"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("ans"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("ane"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("am"));
}
return el_str_concat(stem, EL_STR("ans"));
return 0;
}
el_val_t got_stem_type(el_val_t noun) {
if (got_str_ends(noun, EL_STR("o"))) {
return EL_STR("o");
}
if (got_str_ends(noun, EL_STR("a"))) {
return EL_STR("n");
}
if (got_str_ends(noun, EL_STR("s"))) {
return EL_STR("a");
}
return EL_STR("a");
return 0;
}
el_val_t got_extract_stem(el_val_t noun, el_val_t stype) {
el_val_t n = str_len(noun);
return str_slice(noun, 0, (n - 1));
return 0;
}
el_val_t got_demo_article(el_val_t stype) {
if (str_eq(stype, EL_STR("o"))) {
return EL_STR("\xc3\xbeo");
}
return EL_STR("sa");
return 0;
}
el_val_t got_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t stype = got_stem_type(noun);
el_val_t stem = got_extract_stem(noun, stype);
if (str_eq(stype, EL_STR("a"))) {
if (str_eq(number, EL_STR("singular"))) {
return got_decline_a_stem_sg(stem, gram_case);
}
return got_decline_a_stem_pl(stem, gram_case);
}
if (str_eq(stype, EL_STR("o"))) {
if (str_eq(number, EL_STR("singular"))) {
return got_decline_o_stem_sg(stem, gram_case);
}
return got_decline_o_stem_pl(stem, gram_case);
}
if (str_eq(stype, EL_STR("n"))) {
if (str_eq(number, EL_STR("singular"))) {
return got_decline_n_stem_sg(stem, gram_case);
}
return got_decline_n_stem_pl(stem, gram_case);
}
return noun;
return 0;
}
el_val_t got_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
el_val_t declined = got_decline(noun, gram_case, number);
if (str_eq(definite, EL_STR("true"))) {
el_val_t stype = got_stem_type(noun);
el_val_t article = got_demo_article(stype);
return el_str_concat(el_str_concat(article, EL_STR(" ")), declined);
}
return declined;
return 0;
}
-37
View File
@@ -1,37 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn got_str_ends(s: String, suf: String) -> Bool
extern fn got_str_drop_last(s: String, n: Int) -> String
extern fn got_slot(person: String, number: String) -> Int
extern fn got_map_canonical(verb: String) -> String
extern fn got_wisan_present(slot: Int) -> String
extern fn got_wisan_past(slot: Int) -> String
extern fn got_haban_present(slot: Int) -> String
extern fn got_haban_past(slot: Int) -> String
extern fn got_gaggan_present(slot: Int) -> String
extern fn got_gaggan_past(slot: Int) -> String
extern fn got_saihwan_present(slot: Int) -> String
extern fn got_saihwan_past(slot: Int) -> String
extern fn got_qithan_present(slot: Int) -> String
extern fn got_qithan_past(slot: Int) -> String
extern fn got_niman_present(slot: Int) -> String
extern fn got_niman_past(slot: Int) -> String
extern fn got_wk1_present_ending(slot: Int) -> String
extern fn got_wk1_past_ending(slot: Int) -> String
extern fn got_wk1_conjugate(stem: String, tense: String, slot: Int) -> String
extern fn got_wk2_present_ending(slot: Int) -> String
extern fn got_wk2_past_ending(slot: Int) -> String
extern fn got_wk2_conjugate(stem: String, tense: String, slot: Int) -> String
extern fn got_verb_class(verb: String) -> String
extern fn got_verb_stem(verb: String, vclass: String) -> String
extern fn got_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn got_decline_a_stem_sg(stem: String, gram_case: String) -> String
extern fn got_decline_a_stem_pl(stem: String, gram_case: String) -> String
extern fn got_decline_o_stem_sg(stem: String, gram_case: String) -> String
extern fn got_decline_o_stem_pl(stem: String, gram_case: String) -> String
extern fn got_decline_n_stem_sg(stem: String, gram_case: String) -> String
extern fn got_decline_n_stem_pl(stem: String, gram_case: String) -> String
extern fn got_stem_type(noun: String) -> String
extern fn got_extract_stem(noun: String, stype: String) -> String
extern fn got_demo_article(stype: String) -> String
extern fn got_decline(noun: String, gram_case: String, number: String) -> String
extern fn got_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-1093
View File
File diff suppressed because it is too large Load Diff
-45
View File
@@ -1,45 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn grc_str_ends(s: String, suf: String) -> Bool
extern fn grc_str_drop_last(s: String, n: Int) -> String
extern fn grc_str_last_char(s: String) -> String
extern fn grc_str_last2(s: String) -> String
extern fn grc_str_last3(s: String) -> String
extern fn grc_slot(person: String, number: String) -> Int
extern fn grc_map_canonical(verb: String) -> String
extern fn grc_einai_present(slot: Int) -> String
extern fn grc_einai_imperfect(slot: Int) -> String
extern fn grc_einai_future(slot: Int) -> String
extern fn grc_echein_present(slot: Int) -> String
extern fn grc_echein_imperfect(slot: Int) -> String
extern fn grc_echein_aorist(slot: Int) -> String
extern fn grc_echein_future(slot: Int) -> String
extern fn grc_legein_present(slot: Int) -> String
extern fn grc_legein_imperfect(slot: Int) -> String
extern fn grc_legein_aorist(slot: Int) -> String
extern fn grc_legein_future(slot: Int) -> String
extern fn grc_horao_present(slot: Int) -> String
extern fn grc_horao_imperfect(slot: Int) -> String
extern fn grc_horao_aorist(slot: Int) -> String
extern fn grc_horao_future(slot: Int) -> String
extern fn grc_erchesthai_present(slot: Int) -> String
extern fn grc_erchesthai_imperfect(slot: Int) -> String
extern fn grc_erchesthai_aorist(slot: Int) -> String
extern fn grc_erchesthai_future(slot: Int) -> String
extern fn grc_thematic_present_ending(slot: Int) -> String
extern fn grc_thematic_imperfect_ending(slot: Int) -> String
extern fn grc_thematic_future_ending(slot: Int) -> String
extern fn grc_weak_aorist_ending(slot: Int) -> String
extern fn grc_present_stem(verb: String) -> String
extern fn grc_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn grc_declension(noun: String) -> String
extern fn grc_decline_2m(stem: String, gram_case: String, number: String) -> String
extern fn grc_decline_2n(stem: String, gram_case: String, number: String) -> String
extern fn grc_decline_1a(stem: String, gram_case: String, number: String) -> String
extern fn grc_decline_1e(stem: String, gram_case: String, number: String) -> String
extern fn grc_decline(noun: String, gram_case: String, number: String) -> String
extern fn grc_article_masculine(gram_case: String, number: String) -> String
extern fn grc_article_feminine(gram_case: String, number: String) -> String
extern fn grc_article_neuter(gram_case: String, number: String) -> String
extern fn grc_article(gender: String, gram_case: String, number: String) -> String
extern fn grc_infer_gender(noun: String) -> String
extern fn grc_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-819
View File
@@ -1,819 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t he_str_ends(el_val_t s, el_val_t suf);
el_val_t he_str_len(el_val_t s);
el_val_t he_str_drop_last(el_val_t s, el_val_t n);
el_val_t he_str_last_char(el_val_t s);
el_val_t he_slot(el_val_t person, el_val_t gender, el_val_t number);
el_val_t he_present_form_code(el_val_t slot);
el_val_t he_copula_past(el_val_t slot);
el_val_t he_copula_future(el_val_t slot);
el_val_t he_is_copula(el_val_t verb);
el_val_t he_conjugate_copula(el_val_t tense, el_val_t slot);
el_val_t he_present_lir_ot(el_val_t form);
el_val_t he_present_le_exol(el_val_t form);
el_val_t he_present_ledaber(el_val_t form);
el_val_t he_present_lalechet(el_val_t form);
el_val_t he_past_lir_ot(el_val_t slot);
el_val_t he_past_le_exol(el_val_t slot);
el_val_t he_past_ledaber(el_val_t slot);
el_val_t he_past_lalechet(el_val_t slot);
el_val_t he_future_lir_ot(el_val_t slot);
el_val_t he_future_le_exol(el_val_t slot);
el_val_t he_future_ledaber(el_val_t slot);
el_val_t he_future_lalechet(el_val_t slot);
el_val_t he_known_verb(el_val_t verb, el_val_t tense, el_val_t slot);
el_val_t he_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number);
el_val_t he_pluralize(el_val_t noun, el_val_t gender);
el_val_t he_is_hebrew_script(el_val_t noun);
el_val_t he_definite_prefix(el_val_t noun);
el_val_t he_noun_phrase(el_val_t noun, el_val_t number, el_val_t gender, el_val_t definite);
el_val_t he_map_canonical(el_val_t verb);
el_val_t he_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t he_str_len(el_val_t s) {
return str_len(s);
return 0;
}
el_val_t he_str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t he_str_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t he_slot(el_val_t person, el_val_t gender, el_val_t number) {
if (str_eq(person, EL_STR("third"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gender, EL_STR("f"))) {
return 1;
}
return 0;
}
if (str_eq(gender, EL_STR("f"))) {
return 6;
}
return 5;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gender, EL_STR("f"))) {
return 3;
}
return 2;
}
if (str_eq(gender, EL_STR("f"))) {
return 8;
}
return 7;
}
if (str_eq(number, EL_STR("plural"))) {
return 9;
}
return 4;
return 0;
}
el_val_t he_present_form_code(el_val_t slot) {
if (slot == 0) {
return 0;
}
if (slot == 1) {
return 1;
}
if (slot == 2) {
return 0;
}
if (slot == 3) {
return 1;
}
if (slot == 4) {
return 0;
}
if (slot == 5) {
return 2;
}
if (slot == 6) {
return 3;
}
if (slot == 7) {
return 2;
}
if (slot == 8) {
return 3;
}
return 2;
return 0;
}
el_val_t he_copula_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd7\x94\xd7\x99\xd7\x94");
}
if (slot == 1) {
return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa\xd7\x94");
}
if (slot == 2) {
return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa");
}
if (slot == 3) {
return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa\xd7\x94");
}
if (slot == 4) {
return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa\xd7\x99");
}
if (slot == 5) {
return EL_STR("\xd7\x94\xd7\x99\xd7\x95");
}
if (slot == 6) {
return EL_STR("\xd7\x94\xd7\x99\xd7\x95");
}
if (slot == 7) {
return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa\xd7\x9d");
}
if (slot == 8) {
return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa\xd7\x9f");
}
return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xa0\xd7\x95");
return 0;
}
el_val_t he_copula_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd7\x99\xd7\x94\xd7\x99\xd7\x94");
}
if (slot == 1) {
return EL_STR("\xd7\xaa\xd7\x94\xd7\x99\xd7\x94");
}
if (slot == 2) {
return EL_STR("\xd7\xaa\xd7\x94\xd7\x99\xd7\x94");
}
if (slot == 3) {
return EL_STR("\xd7\xaa\xd7\x94\xd7\x99\xd7\x99");
}
if (slot == 4) {
return EL_STR("\xd7\x90\xd7\x94\xd7\x99\xd7\x94");
}
if (slot == 5) {
return EL_STR("\xd7\x99\xd7\x94\xd7\x99\xd7\x95");
}
if (slot == 6) {
return EL_STR("\xd7\x99\xd7\x94\xd7\x99\xd7\x95");
}
if (slot == 7) {
return EL_STR("\xd7\xaa\xd7\x94\xd7\x99\xd7\x95");
}
if (slot == 8) {
return EL_STR("\xd7\xaa\xd7\x94\xd7\x99\xd7\x95");
}
return EL_STR("\xd7\xa0\xd7\x94\xd7\x99\xd7\x94");
return 0;
}
el_val_t he_is_copula(el_val_t verb) {
if (str_eq(verb, EL_STR("lihyot"))) {
return 1;
}
if (str_eq(verb, EL_STR("haya"))) {
return 1;
}
if (str_eq(verb, EL_STR("be"))) {
return 1;
}
if (str_eq(verb, EL_STR("\xd7\x94\xd7\x99\xd7\x94"))) {
return 1;
}
if (str_eq(verb, EL_STR("\xd7\x9c\xd6\xb4\xd7\x94\xd6\xb0\xd7\x99\xd7\x95\xd6\xb9\xd7\xaa"))) {
return 1;
}
return 0;
return 0;
}
el_val_t he_conjugate_copula(el_val_t tense, el_val_t slot) {
if (str_eq(tense, EL_STR("present"))) {
return EL_STR("");
}
if (str_eq(tense, EL_STR("past"))) {
return he_copula_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return he_copula_future(slot);
}
return EL_STR("");
return 0;
}
el_val_t he_present_lir_ot(el_val_t form) {
if (form == 0) {
return EL_STR("\xd7\xa8\xd7\x95\xd6\xb9\xd7\x90\xd6\xb6\xd7\x94");
}
if (form == 1) {
return EL_STR("\xd7\xa8\xd7\x95\xd6\xb9\xd7\x90\xd6\xb8\xd7\x94");
}
if (form == 2) {
return EL_STR("\xd7\xa8\xd7\x95\xd6\xb9\xd7\x90\xd6\xb4\xd7\x99\xd7\x9d");
}
return EL_STR("\xd7\xa8\xd7\x95\xd6\xb9\xd7\x90\xd7\x95\xd6\xb9\xd7\xaa");
return 0;
}
el_val_t he_present_le_exol(el_val_t form) {
if (form == 0) {
return EL_STR("\xd7\x90\xd7\x95\xd6\xb9\xd7\x9b\xd6\xb5\xd7\x9c");
}
if (form == 1) {
return EL_STR("\xd7\x90\xd7\x95\xd6\xb9\xd7\x9b\xd6\xb6\xd7\x9c\xd6\xb6\xd7\xaa");
}
if (form == 2) {
return EL_STR("\xd7\x90\xd7\x95\xd6\xb9\xd7\x9b\xd6\xb0\xd7\x9c\xd6\xb4\xd7\x99\xd7\x9d");
}
return EL_STR("\xd7\x90\xd7\x95\xd6\xb9\xd7\x9b\xd6\xb0\xd7\x9c\xd7\x95\xd6\xb9\xd7\xaa");
return 0;
}
el_val_t he_present_ledaber(el_val_t form) {
if (form == 0) {
return EL_STR("\xd7\x9e\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
}
if (form == 1) {
return EL_STR("\xd7\x9e\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb6\xd6\xbc\xd7\xa8\xd6\xb6\xd7\xaa");
}
if (form == 2) {
return EL_STR("\xd7\x9e\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd6\xb4\xd7\x99\xd7\x9d");
}
return EL_STR("\xd7\x9e\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd7\x95\xd6\xb9\xd7\xaa");
return 0;
}
el_val_t he_present_lalechet(el_val_t form) {
if (form == 0) {
return EL_STR("\xd7\x94\xd7\x95\xd6\xb9\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
}
if (form == 1) {
return EL_STR("\xd7\x94\xd7\x95\xd6\xb9\xd7\x9c\xd6\xb6\xd7\x9b\xd6\xb6\xd7\xaa");
}
if (form == 2) {
return EL_STR("\xd7\x94\xd7\x95\xd6\xb9\xd7\x9c\xd6\xb0\xd7\x9b\xd6\xb4\xd7\x99\xd7\x9d");
}
return EL_STR("\xd7\x94\xd7\x95\xd6\xb9\xd7\x9c\xd6\xb0\xd7\x9b\xd7\x95\xd6\xb9\xd7\xaa");
return 0;
}
el_val_t he_past_lir_ot(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb8\xd7\x94");
}
if (slot == 1) {
return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb2\xd7\xaa\xd6\xb8\xd7\x94");
}
if (slot == 2) {
return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb4\xd7\x99\xd7\xaa\xd6\xb8");
}
if (slot == 3) {
return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb4\xd7\x99\xd7\xaa");
}
if (slot == 4) {
return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb4\xd7\x99\xd7\xaa\xd6\xb4\xd7\x99");
}
if (slot == 5) {
return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd7\x95\xd6\xbc");
}
if (slot == 6) {
return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd7\x95\xd6\xbc");
}
if (slot == 7) {
return EL_STR("\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb4\xd7\x99\xd7\xaa\xd6\xb6\xd7\x9d");
}
if (slot == 8) {
return EL_STR("\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb4\xd7\x99\xd7\xaa\xd6\xb6\xd7\x9f");
}
return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb4\xd7\x99\xd7\xa0\xd7\x95\xd6\xbc");
return 0;
}
el_val_t he_past_le_exol(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb7\xd7\x9c");
}
if (slot == 1) {
return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb0\xd7\x9c\xd6\xb8\xd7\x94");
}
if (slot == 2) {
return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xaa\xd6\xb8\xd6\xbc");
}
if (slot == 3) {
return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xaa\xd6\xb0\xd6\xbc");
}
if (slot == 4) {
return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xaa\xd6\xb4\xd6\xbc\xd7\x99");
}
if (slot == 5) {
return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb0\xd7\x9c\xd7\x95\xd6\xbc");
}
if (slot == 6) {
return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb0\xd7\x9c\xd7\x95\xd6\xbc");
}
if (slot == 7) {
return EL_STR("\xd7\x90\xd6\xb2\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9d");
}
if (slot == 8) {
return EL_STR("\xd7\x90\xd6\xb2\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9f");
}
return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xa0\xd7\x95\xd6\xbc");
return 0;
}
el_val_t he_past_ledaber(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
}
if (slot == 1) {
return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd6\xb8\xd7\x94");
}
if (slot == 2) {
return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xaa\xd6\xb8\xd6\xbc");
}
if (slot == 3) {
return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xaa\xd6\xb0\xd6\xbc");
}
if (slot == 4) {
return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xaa\xd6\xb4\xd6\xbc\xd7\x99");
}
if (slot == 5) {
return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd7\x95\xd6\xbc");
}
if (slot == 6) {
return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd7\x95\xd6\xbc");
}
if (slot == 7) {
return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9d");
}
if (slot == 8) {
return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9f");
}
return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xa0\xd7\x95\xd6\xbc");
return 0;
}
el_val_t he_past_lalechet(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb7\xd7\x9a\xd6\xb0");
}
if (slot == 1) {
return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb0\xd7\x9b\xd6\xb8\xd7\x94");
}
if (slot == 2) {
return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xaa\xd6\xb8\xd6\xbc");
}
if (slot == 3) {
return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xaa\xd6\xb0\xd6\xbc");
}
if (slot == 4) {
return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xaa\xd6\xb4\xd6\xbc\xd7\x99");
}
if (slot == 5) {
return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb0\xd7\x9b\xd7\x95\xd6\xbc");
}
if (slot == 6) {
return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb0\xd7\x9b\xd7\x95\xd6\xbc");
}
if (slot == 7) {
return EL_STR("\xd7\x94\xd6\xb2\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9d");
}
if (slot == 8) {
return EL_STR("\xd7\x94\xd6\xb2\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9f");
}
return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xa0\xd7\x95\xd6\xbc");
return 0;
}
el_val_t he_future_lir_ot(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd7\x99\xd6\xb4\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x94");
}
if (slot == 1) {
return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x94");
}
if (slot == 2) {
return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x94");
}
if (slot == 3) {
return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb4\xd7\x99");
}
if (slot == 4) {
return EL_STR("\xd7\x90\xd6\xb6\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x94");
}
if (slot == 5) {
return EL_STR("\xd7\x99\xd6\xb4\xd7\xa8\xd6\xb0\xd7\x90\xd7\x95\xd6\xbc");
}
if (slot == 6) {
return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x99\xd7\xa0\xd6\xb8\xd7\x94");
}
if (slot == 7) {
return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd7\x95\xd6\xbc");
}
if (slot == 8) {
return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x99\xd7\xa0\xd6\xb8\xd7\x94");
}
return EL_STR("\xd7\xa0\xd6\xb4\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x94");
return 0;
}
el_val_t he_future_le_exol(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd7\x99\xd6\xb9\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c");
}
if (slot == 1) {
return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c");
}
if (slot == 2) {
return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c");
}
if (slot == 3) {
return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb0\xd7\x9c\xd6\xb4\xd7\x99");
}
if (slot == 4) {
return EL_STR("\xd7\x90\xd6\xb9\xd7\x9b\xd6\xb7\xd7\x9c");
}
if (slot == 5) {
return EL_STR("\xd7\x99\xd6\xb9\xd7\x90\xd7\x9b\xd6\xb0\xd7\x9c\xd7\x95\xd6\xbc");
}
if (slot == 6) {
return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
}
if (slot == 7) {
return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb0\xd7\x9c\xd7\x95\xd6\xbc");
}
if (slot == 8) {
return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
}
return EL_STR("\xd7\xa0\xd6\xb9\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c");
return 0;
}
el_val_t he_future_ledaber(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd7\x99\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
}
if (slot == 1) {
return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
}
if (slot == 2) {
return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
}
if (slot == 3) {
return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd6\xb4\xd7\x99");
}
if (slot == 4) {
return EL_STR("\xd7\x90\xd6\xb2\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
}
if (slot == 5) {
return EL_STR("\xd7\x99\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd7\x95\xd6\xbc");
}
if (slot == 6) {
return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
}
if (slot == 7) {
return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd7\x95\xd6\xbc");
}
if (slot == 8) {
return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
}
return EL_STR("\xd7\xa0\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
return 0;
}
el_val_t he_future_lalechet(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xd7\x99\xd6\xb5\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
}
if (slot == 1) {
return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
}
if (slot == 2) {
return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
}
if (slot == 3) {
return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb0\xd7\x9b\xd6\xb4\xd7\x99");
}
if (slot == 4) {
return EL_STR("\xd7\x90\xd6\xb5\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
}
if (slot == 5) {
return EL_STR("\xd7\x99\xd6\xb5\xd7\x9c\xd6\xb0\xd7\x9b\xd7\x95\xd6\xbc");
}
if (slot == 6) {
return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
}
if (slot == 7) {
return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb0\xd7\x9b\xd7\x95\xd6\xbc");
}
if (slot == 8) {
return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
}
return EL_STR("\xd7\xa0\xd6\xb5\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
return 0;
}
el_val_t he_known_verb(el_val_t verb, el_val_t tense, el_val_t slot) {
if (str_eq(verb, EL_STR("lir'ot"))) {
if (str_eq(tense, EL_STR("present"))) {
return he_present_lir_ot(he_present_form_code(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return he_past_lir_ot(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return he_future_lir_ot(slot);
}
return he_present_lir_ot(he_present_form_code(slot));
}
if (str_eq(verb, EL_STR("\xd7\x9c\xd6\xb4\xd7\xa8\xd6\xb0\xd7\x90\xd7\x95\xd6\xb9\xd7\xaa"))) {
if (str_eq(tense, EL_STR("present"))) {
return he_present_lir_ot(he_present_form_code(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return he_past_lir_ot(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return he_future_lir_ot(slot);
}
return he_present_lir_ot(he_present_form_code(slot));
}
if (str_eq(verb, EL_STR("le'exol"))) {
if (str_eq(tense, EL_STR("present"))) {
return he_present_le_exol(he_present_form_code(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return he_past_le_exol(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return he_future_le_exol(slot);
}
return he_present_le_exol(he_present_form_code(slot));
}
if (str_eq(verb, EL_STR("\xd7\x9c\xd6\xb6\xd7\x90\xd6\xb1\xd7\x9b\xd7\x95\xd6\xb9\xd7\x9c"))) {
if (str_eq(tense, EL_STR("present"))) {
return he_present_le_exol(he_present_form_code(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return he_past_le_exol(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return he_future_le_exol(slot);
}
return he_present_le_exol(he_present_form_code(slot));
}
if (str_eq(verb, EL_STR("ledaber"))) {
if (str_eq(tense, EL_STR("present"))) {
return he_present_ledaber(he_present_form_code(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return he_past_ledaber(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return he_future_ledaber(slot);
}
return he_present_ledaber(he_present_form_code(slot));
}
if (str_eq(verb, EL_STR("\xd7\x9c\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8"))) {
if (str_eq(tense, EL_STR("present"))) {
return he_present_ledaber(he_present_form_code(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return he_past_ledaber(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return he_future_ledaber(slot);
}
return he_present_ledaber(he_present_form_code(slot));
}
if (str_eq(verb, EL_STR("lalechet"))) {
if (str_eq(tense, EL_STR("present"))) {
return he_present_lalechet(he_present_form_code(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return he_past_lalechet(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return he_future_lalechet(slot);
}
return he_present_lalechet(he_present_form_code(slot));
}
if (str_eq(verb, EL_STR("\xd7\x9c\xd6\xb8\xd7\x9c\xd6\xb6\xd7\x9b\xd6\xb6\xd7\xaa"))) {
if (str_eq(tense, EL_STR("present"))) {
return he_present_lalechet(he_present_form_code(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return he_past_lalechet(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return he_future_lalechet(slot);
}
return he_present_lalechet(he_present_form_code(slot));
}
return EL_STR("");
return 0;
}
el_val_t he_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number) {
el_val_t slot = he_slot(person, gender, number);
if (he_is_copula(verb)) {
return he_conjugate_copula(tense, slot);
}
el_val_t known = he_known_verb(verb, tense, slot);
if (!str_eq(known, EL_STR(""))) {
return known;
}
return verb;
return 0;
}
el_val_t he_pluralize(el_val_t noun, el_val_t gender) {
if (str_eq(gender, EL_STR("m"))) {
return el_str_concat(noun, EL_STR("\xd7\x99\xd7\x9d"));
}
if (he_str_ends(noun, EL_STR("\xd7\x94"))) {
el_val_t stem = he_str_drop_last(noun, 1);
return el_str_concat(stem, EL_STR("\xd7\x95\xd7\xaa"));
}
if (he_str_ends(noun, EL_STR("\xd7\xaa"))) {
el_val_t stem = he_str_drop_last(noun, 1);
return el_str_concat(stem, EL_STR("\xd7\x95\xd7\xaa"));
}
if (he_str_ends(noun, EL_STR("a"))) {
el_val_t stem = he_str_drop_last(noun, 1);
return el_str_concat(stem, EL_STR("ot"));
}
if (he_str_ends(noun, EL_STR("et"))) {
el_val_t stem = he_str_drop_last(noun, 2);
return el_str_concat(stem, EL_STR("ot"));
}
return el_str_concat(noun, EL_STR("\xd7\x95\xd7\xaa"));
return 0;
}
el_val_t he_is_hebrew_script(el_val_t noun) {
el_val_t n = str_len(noun);
if (n == 0) {
return 0;
}
el_val_t first = str_slice(noun, 0, 1);
if (str_eq(first, EL_STR("\xd7\x90"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x91"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x92"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x93"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x94"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x95"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x96"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x97"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x98"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x99"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x9b"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x9c"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\x9e"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\xa0"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\xa1"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\xa2"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\xa4"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\xa6"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\xa7"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\xa8"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\xa9"))) {
return 1;
}
if (str_eq(first, EL_STR("\xd7\xaa"))) {
return 1;
}
return 0;
return 0;
}
el_val_t he_definite_prefix(el_val_t noun) {
if (he_is_hebrew_script(noun)) {
return el_str_concat(EL_STR("\xd7\x94"), noun);
}
return el_str_concat(EL_STR("ha"), noun);
return 0;
}
el_val_t he_noun_phrase(el_val_t noun, el_val_t number, el_val_t gender, el_val_t definite) {
el_val_t stem = noun;
if (str_eq(number, EL_STR("plural"))) {
stem = he_pluralize(noun, gender);
}
if (str_eq(definite, EL_STR("true"))) {
return he_definite_prefix(stem);
}
return stem;
return 0;
}
el_val_t he_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("lihyot");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("lir'ot");
}
if (str_eq(verb, EL_STR("eat"))) {
return EL_STR("le'exol");
}
if (str_eq(verb, EL_STR("speak"))) {
return EL_STR("ledaber");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("ledaber");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("lalechet");
}
return verb;
return 0;
}
-30
View File
@@ -1,30 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn he_str_ends(s: String, suf: String) -> Bool
extern fn he_str_len(s: String) -> Int
extern fn he_str_drop_last(s: String, n: Int) -> String
extern fn he_str_last_char(s: String) -> String
extern fn he_slot(person: String, gender: String, number: String) -> Int
extern fn he_present_form_code(slot: Int) -> Int
extern fn he_copula_past(slot: Int) -> String
extern fn he_copula_future(slot: Int) -> String
extern fn he_is_copula(verb: String) -> Bool
extern fn he_conjugate_copula(tense: String, slot: Int) -> String
extern fn he_present_lir_ot(form: Int) -> String
extern fn he_present_le_exol(form: Int) -> String
extern fn he_present_ledaber(form: Int) -> String
extern fn he_present_lalechet(form: Int) -> String
extern fn he_past_lir_ot(slot: Int) -> String
extern fn he_past_le_exol(slot: Int) -> String
extern fn he_past_ledaber(slot: Int) -> String
extern fn he_past_lalechet(slot: Int) -> String
extern fn he_future_lir_ot(slot: Int) -> String
extern fn he_future_le_exol(slot: Int) -> String
extern fn he_future_ledaber(slot: Int) -> String
extern fn he_future_lalechet(slot: Int) -> String
extern fn he_known_verb(verb: String, tense: String, slot: Int) -> String
extern fn he_conjugate(verb: String, tense: String, person: String, gender: String, number: String) -> String
extern fn he_pluralize(noun: String, gender: String) -> String
extern fn he_is_hebrew_script(noun: String) -> Bool
extern fn he_definite_prefix(noun: String) -> String
extern fn he_noun_phrase(noun: String, number: String, gender: String, definite: String) -> String
extern fn he_map_canonical(verb: String) -> String
-748
View File
@@ -1,748 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t hi_str_ends(el_val_t s, el_val_t suf);
el_val_t hi_str_drop_last(el_val_t s, el_val_t n);
el_val_t hi_str_last_char(el_val_t s);
el_val_t hi_gender(el_val_t noun);
el_val_t hi_masc_aa_stem(el_val_t noun);
el_val_t hi_noun_direct_m(el_val_t noun, el_val_t number);
el_val_t hi_noun_oblique_m(el_val_t noun, el_val_t number);
el_val_t hi_noun_direct_f(el_val_t noun, el_val_t number);
el_val_t hi_noun_oblique_f(el_val_t noun, el_val_t number);
el_val_t hi_noun_direct(el_val_t noun, el_val_t gender, el_val_t number);
el_val_t hi_noun_oblique(el_val_t noun, el_val_t gender, el_val_t number);
el_val_t hi_postposition(el_val_t gram_case);
el_val_t hi_agree_genitive(el_val_t possessed_gender, el_val_t possessed_number);
el_val_t hi_verb_stem(el_val_t infinitive);
el_val_t hi_verb_stem_clean(el_val_t infinitive);
el_val_t hi_present_aspect(el_val_t gender, el_val_t number);
el_val_t hi_aux_present(el_val_t person, el_val_t number);
el_val_t hi_past_suffix(el_val_t gender, el_val_t number);
el_val_t hi_past_irregular(el_val_t stem, el_val_t gender, el_val_t number);
el_val_t hi_future_suffix(el_val_t person, el_val_t number, el_val_t gender);
el_val_t hi_tense_suffix(el_val_t tense, el_val_t gender, el_val_t number);
el_val_t hi_hona_present(el_val_t person, el_val_t number);
el_val_t hi_hona_past(el_val_t gender, el_val_t number);
el_val_t hi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number);
el_val_t hi_noun_with_post(el_val_t noun, el_val_t gender, el_val_t number, el_val_t gram_case);
el_val_t hi_genitive_phrase(el_val_t possessor, el_val_t possessor_gender, el_val_t possessor_number, el_val_t possessed, el_val_t possessed_gender, el_val_t possessed_number);
el_val_t hi_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t hi_str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t hi_str_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t hi_gender(el_val_t noun) {
if (hi_str_ends(noun, EL_STR("\xe0\xa5\x80"))) {
return EL_STR("f");
}
if (hi_str_ends(noun, EL_STR("\xe0\xa4\xbe"))) {
return EL_STR("m");
}
if (hi_str_ends(noun, EL_STR("\xe0\xa4\xa8"))) {
return EL_STR("f");
}
if (hi_str_ends(noun, EL_STR("\xe0\xa4\xa4"))) {
return EL_STR("f");
}
if (hi_str_ends(noun, EL_STR("\xe0\xa4\x9f"))) {
return EL_STR("f");
}
if (hi_str_ends(noun, EL_STR("\xe0\xa4\xb6"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xb2\xe0\xa4\xa1\xe0\xa4\xbc\xe0\xa4\x95\xe0\xa4\xbe"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xb2\xe0\xa4\xa1\xe0\xa4\xbc\xe0\xa4\x95\xe0\xa5\x80"))) {
return EL_STR("f");
}
if (str_eq(noun, EL_STR("\xe0\xa4\x86\xe0\xa4\xa6\xe0\xa4\xae\xe0\xa5\x80"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\x94\xe0\xa4\xb0\xe0\xa4\xa4"))) {
return EL_STR("f");
}
if (str_eq(noun, EL_STR("\xe0\xa4\x98\xe0\xa4\xb0"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x9c\xe0\xa4\xbc"))) {
return EL_STR("f");
}
if (str_eq(noun, EL_STR("\xe0\xa4\x95\xe0\xa4\xbf\xe0\xa4\xa4\xe0\xa4\xbe\xe0\xa4\xac"))) {
return EL_STR("f");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa5\x80"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xa6\xe0\xa5\x82\xe0\xa4\xa7"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xb9\xe0\xa4\xbe\xe0\xa4\xa5"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\x86\xe0\xa4\x81\xe0\xa4\x96"))) {
return EL_STR("f");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xac\xe0\xa4\x9a\xe0\xa5\x8d\xe0\xa4\x9a\xe0\xa4\xbe"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xac\xe0\xa4\x9a\xe0\xa5\x8d\xe0\xa4\x9a\xe0\xa5\x80"))) {
return EL_STR("f");
}
if (str_eq(noun, EL_STR("\xe0\xa4\x95\xe0\xa4\xbe\xe0\xa4\xae"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xa4"))) {
return EL_STR("f");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xa8"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xb0\xe0\xa4\xbe\xe0\xa4\xa4"))) {
return EL_STR("f");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xa6\xe0\xa5\x87\xe0\xa4\xb6"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb7\xe0\xa4\xbe"))) {
return EL_STR("f");
}
if (str_eq(noun, EL_STR("\xe0\xa4\x9c\xe0\xa4\x97\xe0\xa4\xb9"))) {
return EL_STR("f");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xb8\xe0\xa4\xae\xe0\xa4\xaf"))) {
return EL_STR("m");
}
if (str_eq(noun, EL_STR("\xe0\xa4\xb8\xe0\xa4\xbe\xe0\xa4\xb2"))) {
return EL_STR("m");
}
return EL_STR("m");
return 0;
}
el_val_t hi_masc_aa_stem(el_val_t noun) {
return hi_str_drop_last(noun, 1);
return 0;
}
el_val_t hi_noun_direct_m(el_val_t noun, el_val_t number) {
if (hi_str_ends(noun, EL_STR("\xe0\xa4\xbe"))) {
if (str_eq(number, EL_STR("sg"))) {
return noun;
}
return el_str_concat(hi_masc_aa_stem(noun), EL_STR("\xe0\xa5\x87"));
}
return noun;
return 0;
}
el_val_t hi_noun_oblique_m(el_val_t noun, el_val_t number) {
if (hi_str_ends(noun, EL_STR("\xe0\xa4\xbe"))) {
el_val_t stem = hi_masc_aa_stem(noun);
if (str_eq(number, EL_STR("sg"))) {
return el_str_concat(stem, EL_STR("\xe0\xa5\x87"));
}
return el_str_concat(stem, EL_STR("\xe0\xa5\x8b\xe0\xa4\x82"));
}
if (hi_str_ends(noun, EL_STR("\xe0\xa5\x80"))) {
if (str_eq(number, EL_STR("sg"))) {
return noun;
}
el_val_t stem = hi_str_drop_last(noun, 1);
return el_str_concat(stem, EL_STR("\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa5\x8b\xe0\xa4\x82"));
}
if (str_eq(number, EL_STR("sg"))) {
return noun;
}
return el_str_concat(noun, EL_STR("\xe0\xa5\x8b\xe0\xa4\x82"));
return 0;
}
el_val_t hi_noun_direct_f(el_val_t noun, el_val_t number) {
if (hi_str_ends(noun, EL_STR("\xe0\xa5\x80"))) {
if (str_eq(number, EL_STR("sg"))) {
return noun;
}
el_val_t stem = hi_str_drop_last(noun, 1);
return el_str_concat(stem, EL_STR("\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81"));
}
if (str_eq(number, EL_STR("sg"))) {
return noun;
}
return el_str_concat(noun, EL_STR("\xe0\xa5\x87\xe0\xa4\x82"));
return 0;
}
el_val_t hi_noun_oblique_f(el_val_t noun, el_val_t number) {
if (hi_str_ends(noun, EL_STR("\xe0\xa5\x80"))) {
if (str_eq(number, EL_STR("sg"))) {
return noun;
}
el_val_t stem = hi_str_drop_last(noun, 1);
return el_str_concat(stem, EL_STR("\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa5\x8b\xe0\xa4\x82"));
}
if (str_eq(number, EL_STR("sg"))) {
return noun;
}
return el_str_concat(noun, EL_STR("\xe0\xa5\x8b\xe0\xa4\x82"));
return 0;
}
el_val_t hi_noun_direct(el_val_t noun, el_val_t gender, el_val_t number) {
if (str_eq(gender, EL_STR("m"))) {
return hi_noun_direct_m(noun, number);
}
if (str_eq(gender, EL_STR("f"))) {
return hi_noun_direct_f(noun, number);
}
return noun;
return 0;
}
el_val_t hi_noun_oblique(el_val_t noun, el_val_t gender, el_val_t number) {
if (str_eq(gender, EL_STR("m"))) {
return hi_noun_oblique_m(noun, number);
}
if (str_eq(gender, EL_STR("f"))) {
return hi_noun_oblique_f(noun, number);
}
return noun;
return 0;
}
el_val_t hi_postposition(el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("");
}
if (str_eq(gram_case, EL_STR("accusative_animate"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa5\x8b");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa5\x8b");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa4\xbe");
}
if (str_eq(gram_case, EL_STR("locative_in"))) {
return EL_STR("\xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82");
}
if (str_eq(gram_case, EL_STR("locative_on"))) {
return EL_STR("\xe0\xa4\xaa\xe0\xa4\xb0");
}
if (str_eq(gram_case, EL_STR("instrumental"))) {
return EL_STR("\xe0\xa4\xb8\xe0\xa5\x87");
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return EL_STR("\xe0\xa4\xb8\xe0\xa5\x87");
}
if (str_eq(gram_case, EL_STR("comitative"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa5\x87 \xe0\xa4\xb8\xe0\xa4\xbe\xe0\xa4\xa5");
}
if (str_eq(gram_case, EL_STR("benefactive"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa5\x87 \xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x8f");
}
return EL_STR("");
return 0;
}
el_val_t hi_agree_genitive(el_val_t possessed_gender, el_val_t possessed_number) {
if (str_eq(possessed_gender, EL_STR("f"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa5\x80");
}
if (str_eq(possessed_number, EL_STR("pl"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa5\x87");
}
return EL_STR("\xe0\xa4\x95\xe0\xa4\xbe");
return 0;
}
el_val_t hi_verb_stem(el_val_t infinitive) {
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb9\xe0\xa5\x8b\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb9\xe0\xa5\x8b");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x95\xe0\xa4\xb0\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa4\xb0");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x9c\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x9c\xe0\xa4\xbe");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x86\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x86");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xa6\xe0\xa5\x87\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xa6\xe0\xa5\x87");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb2\xe0\xa5\x87\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb2\xe0\xa5\x87");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xa6\xe0\xa5\x87\xe0\xa4\x96\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xa6\xe0\xa5\x87\xe0\xa4\x96");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x95\xe0\xa4\xb9\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa4\xb9");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x9c\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x9c\xe0\xa4\xbe\xe0\xa4\xa8");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x9a\xe0\xa4\xbe\xe0\xa4\xb9\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x9a\xe0\xa4\xbe\xe0\xa4\xb9");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x96\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x96\xe0\xa4\xbe");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xaa\xe0\xa5\x80\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xaa\xe0\xa5\x80");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb8\xe0\xa5\x8b\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb8\xe0\xa5\x8b");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x96\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x96");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xaa\xe0\xa4\xa2\xe0\xa4\xbc\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xaa\xe0\xa4\xa2\xe0\xa4\xbc");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x9a\xe0\xa4\xb2\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x9a\xe0\xa4\xb2");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xac\xe0\xa5\x88\xe0\xa4\xa0\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xac\xe0\xa5\x88\xe0\xa4\xa0");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x89\xe0\xa4\xa0\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x89\xe0\xa4\xa0");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xae\xe0\xa4\xbf\xe0\xa4\xb2\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xae\xe0\xa4\xbf\xe0\xa4\xb2");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb0\xe0\xa4\xb9\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb0\xe0\xa4\xb9");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb8\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb8\xe0\xa5\x81\xe0\xa4\xa8");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb8\xe0\xa4\xae\xe0\xa4\x9d\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb8\xe0\xa4\xae\xe0\xa4\x9d");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xac\xe0\xa4\xa8\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xac\xe0\xa4\xa8\xe0\xa4\xbe");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb2\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb2\xe0\xa4\xbe");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xad\xe0\xa5\x87\xe0\xa4\x9c\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xad\xe0\xa5\x87\xe0\xa4\x9c");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x96\xe0\xa5\x8b\xe0\xa4\xb2\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x96\xe0\xa5\x8b\xe0\xa4\xb2");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xac\xe0\xa4\x82\xe0\xa4\xa6 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xac\xe0\xa4\x82\xe0\xa4\xa6 \xe0\xa4\x95\xe0\xa4\xb0");
}
if (hi_str_ends(infinitive, EL_STR("\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return hi_str_drop_last(infinitive, 1);
}
return infinitive;
return 0;
}
el_val_t hi_verb_stem_clean(el_val_t infinitive) {
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb9\xe0\xa5\x8b\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb9\xe0\xa5\x8b");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x95\xe0\xa4\xb0\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa4\xb0");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x9c\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x9c\xe0\xa4\xbe");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x86\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x86");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xa6\xe0\xa5\x87\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xa6\xe0\xa5\x87");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb2\xe0\xa5\x87\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb2\xe0\xa5\x87");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xa6\xe0\xa5\x87\xe0\xa4\x96\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xa6\xe0\xa5\x87\xe0\xa4\x96");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x95\xe0\xa4\xb9\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa4\xb9");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x9c\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x9c\xe0\xa4\xbe\xe0\xa4\xa8");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x9a\xe0\xa4\xbe\xe0\xa4\xb9\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x9a\xe0\xa4\xbe\xe0\xa4\xb9");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x96\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x96\xe0\xa4\xbe");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xaa\xe0\xa5\x80\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xaa\xe0\xa5\x80");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb8\xe0\xa5\x8b\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb8\xe0\xa5\x8b");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x96\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x96");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xaa\xe0\xa4\xa2\xe0\xa4\xbc\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xaa\xe0\xa4\xa2\xe0\xa4\xbc");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x9a\xe0\xa4\xb2\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x9a\xe0\xa4\xb2");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xac\xe0\xa5\x88\xe0\xa4\xa0\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xac\xe0\xa5\x88\xe0\xa4\xa0");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x89\xe0\xa4\xa0\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x89\xe0\xa4\xa0");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xae\xe0\xa4\xbf\xe0\xa4\xb2\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xae\xe0\xa4\xbf\xe0\xa4\xb2");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb0\xe0\xa4\xb9\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb0\xe0\xa4\xb9");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb8\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb8\xe0\xa5\x81\xe0\xa4\xa8");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb8\xe0\xa4\xae\xe0\xa4\x9d\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb8\xe0\xa4\xae\xe0\xa4\x9d");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xac\xe0\xa4\xa8\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xac\xe0\xa4\xa8\xe0\xa4\xbe");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xb2\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xb2\xe0\xa4\xbe");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\xad\xe0\xa5\x87\xe0\xa4\x9c\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\xad\xe0\xa5\x87\xe0\xa4\x9c");
}
if (str_eq(infinitive, EL_STR("\xe0\xa4\x96\xe0\xa5\x8b\xe0\xa4\xb2\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return EL_STR("\xe0\xa4\x96\xe0\xa5\x8b\xe0\xa4\xb2");
}
if (hi_str_ends(infinitive, EL_STR("\xe0\xa4\xa8\xe0\xa4\xbe"))) {
return hi_str_drop_last(infinitive, 2);
}
return infinitive;
return 0;
}
el_val_t hi_present_aspect(el_val_t gender, el_val_t number) {
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("\xe0\xa4\xa4\xe0\xa5\x80");
}
if (str_eq(number, EL_STR("pl"))) {
return EL_STR("\xe0\xa4\xa4\xe0\xa5\x87");
}
return EL_STR("\xe0\xa4\xa4\xe0\xa4\xbe");
return 0;
}
el_val_t hi_aux_present(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("1"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xb9\xe0\xa5\x82\xe0\xa4\x81");
}
return EL_STR("\xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\x82");
}
if (str_eq(person, EL_STR("2"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xb9\xe0\xa5\x8b");
}
return EL_STR("\xe0\xa4\xb9\xe0\xa5\x8b");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xb9\xe0\xa5\x88");
}
return EL_STR("\xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\x82");
return 0;
}
el_val_t hi_past_suffix(el_val_t gender, el_val_t number) {
if (str_eq(gender, EL_STR("m"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\x86");
}
return EL_STR("\xe0\xa4\x8f");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\x88");
}
return EL_STR("\xe0\xa4\x88\xe0\xa4\x82");
return 0;
}
el_val_t hi_past_irregular(el_val_t stem, el_val_t gender, el_val_t number) {
if (str_eq(stem, EL_STR("\xe0\xa4\xb9\xe0\xa5\x8b"))) {
if (str_eq(gender, EL_STR("m"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xa5\xe0\xa4\xbe");
}
return EL_STR("\xe0\xa4\xa5\xe0\xa5\x87");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xa5\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\xa5\xe0\xa5\x80\xe0\xa4\x82");
}
if (str_eq(stem, EL_STR("\xe0\xa4\x9c\xe0\xa4\xbe"))) {
if (str_eq(gender, EL_STR("m"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\x97\xe0\xa4\xaf\xe0\xa4\xbe");
}
return EL_STR("\xe0\xa4\x97\xe0\xa4\x8f");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\x97\xe0\xa4\x88");
}
return EL_STR("\xe0\xa4\x97\xe0\xa4\x88\xe0\xa4\x82");
}
if (str_eq(stem, EL_STR("\xe0\xa4\x95\xe0\xa4\xb0"))) {
if (str_eq(gender, EL_STR("m"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe");
}
return EL_STR("\xe0\xa4\x95\xe0\xa4\xbf\xe0\xa4\x8f");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\x95\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\x95\xe0\xa5\x80\xe0\xa4\x82");
}
if (str_eq(stem, EL_STR("\xe0\xa4\xa6\xe0\xa5\x87"))) {
if (str_eq(gender, EL_STR("m"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe");
}
return EL_STR("\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\x8f");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xa6\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\xa6\xe0\xa5\x80\xe0\xa4\x82");
}
if (str_eq(stem, EL_STR("\xe0\xa4\xb2\xe0\xa5\x87"))) {
if (str_eq(gender, EL_STR("m"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe");
}
return EL_STR("\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x8f");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xb2\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\xb2\xe0\xa5\x80\xe0\xa4\x82");
}
if (str_eq(stem, EL_STR("\xe0\xa4\x86"))) {
if (str_eq(gender, EL_STR("m"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\x86\xe0\xa4\xaf\xe0\xa4\xbe");
}
return EL_STR("\xe0\xa4\x86\xe0\xa4\x8f");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\x86\xe0\xa4\x88");
}
return EL_STR("\xe0\xa4\x86\xe0\xa4\x88\xe0\xa4\x82");
}
if (str_eq(stem, EL_STR("\xe0\xa4\x96\xe0\xa4\xbe"))) {
if (str_eq(gender, EL_STR("m"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\x96\xe0\xa4\xbe\xe0\xa4\xaf\xe0\xa4\xbe");
}
return EL_STR("\xe0\xa4\x96\xe0\xa4\xbe\xe0\xa4\x8f");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\x96\xe0\xa4\xbe\xe0\xa4\x88");
}
return EL_STR("\xe0\xa4\x96\xe0\xa4\xbe\xe0\xa4\x88\xe0\xa4\x82");
}
if (str_eq(stem, EL_STR("\xe0\xa4\xaa\xe0\xa5\x80"))) {
if (str_eq(gender, EL_STR("m"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xaa\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe");
}
return EL_STR("\xe0\xa4\xaa\xe0\xa4\xbf\xe0\xa4\x8f");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xaa\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\xaa\xe0\xa5\x80\xe0\xa4\x82");
}
return EL_STR("");
return 0;
}
el_val_t hi_future_suffix(el_val_t person, el_val_t number, el_val_t gender) {
if (str_eq(person, EL_STR("1"))) {
if (str_eq(number, EL_STR("sg"))) {
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("\xe0\xa4\x8a\xe0\xa4\x81\xe0\xa4\x97\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\x8a\xe0\xa4\x81\xe0\xa4\x97\xe0\xa4\xbe");
}
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("\xe0\xa4\x8f\xe0\xa4\x82\xe0\xa4\x97\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\x8f\xe0\xa4\x82\xe0\xa4\x97\xe0\xa5\x87");
}
if (str_eq(person, EL_STR("2"))) {
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("\xe0\xa4\x93\xe0\xa4\x97\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\x93\xe0\xa4\x97\xe0\xa5\x87");
}
if (str_eq(number, EL_STR("sg"))) {
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("\xe0\xa4\x8f\xe0\xa4\x97\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\x8f\xe0\xa4\x97\xe0\xa4\xbe");
}
if (str_eq(gender, EL_STR("f"))) {
return EL_STR("\xe0\xa4\x8f\xe0\xa4\x82\xe0\xa4\x97\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\x8f\xe0\xa4\x82\xe0\xa4\x97\xe0\xa5\x87");
return 0;
}
el_val_t hi_tense_suffix(el_val_t tense, el_val_t gender, el_val_t number) {
if (str_eq(tense, EL_STR("present"))) {
return hi_present_aspect(gender, number);
}
if (str_eq(tense, EL_STR("past"))) {
return hi_past_suffix(gender, number);
}
return EL_STR("");
return 0;
}
el_val_t hi_hona_present(el_val_t person, el_val_t number) {
return hi_aux_present(person, number);
return 0;
}
el_val_t hi_hona_past(el_val_t gender, el_val_t number) {
if (str_eq(gender, EL_STR("m"))) {
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xa5\xe0\xa4\xbe");
}
return EL_STR("\xe0\xa4\xa5\xe0\xa5\x87");
}
if (str_eq(number, EL_STR("sg"))) {
return EL_STR("\xe0\xa4\xa5\xe0\xa5\x80");
}
return EL_STR("\xe0\xa4\xa5\xe0\xa5\x80\xe0\xa4\x82");
return 0;
}
el_val_t hi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number) {
el_val_t stem = hi_verb_stem_clean(verb);
if (str_eq(verb, EL_STR("\xe0\xa4\xb9\xe0\xa5\x8b\xe0\xa4\xa8\xe0\xa4\xbe"))) {
if (str_eq(tense, EL_STR("present"))) {
return hi_hona_present(person, number);
}
if (str_eq(tense, EL_STR("past"))) {
return hi_hona_past(gender, number);
}
return el_str_concat(EL_STR("\xe0\xa4\xb9\xe0\xa5\x8b"), hi_future_suffix(person, number, gender));
}
if (str_eq(tense, EL_STR("present"))) {
el_val_t aspect = hi_present_aspect(gender, number);
el_val_t aux = hi_aux_present(person, number);
return el_str_concat(el_str_concat(el_str_concat(stem, aspect), EL_STR(" ")), aux);
}
if (str_eq(tense, EL_STR("past"))) {
el_val_t irreg = hi_past_irregular(stem, gender, number);
if (!str_eq(irreg, EL_STR(""))) {
return irreg;
}
return el_str_concat(stem, hi_past_suffix(gender, number));
}
if (str_eq(tense, EL_STR("future"))) {
return el_str_concat(stem, hi_future_suffix(person, number, gender));
}
return verb;
return 0;
}
el_val_t hi_noun_with_post(el_val_t noun, el_val_t gender, el_val_t number, el_val_t gram_case) {
el_val_t post = hi_postposition(gram_case);
if (str_eq(post, EL_STR(""))) {
return hi_noun_direct(noun, gender, number);
}
el_val_t oblique = hi_noun_oblique(noun, gender, number);
return el_str_concat(el_str_concat(oblique, EL_STR(" ")), post);
return 0;
}
el_val_t hi_genitive_phrase(el_val_t possessor, el_val_t possessor_gender, el_val_t possessor_number, el_val_t possessed, el_val_t possessed_gender, el_val_t possessed_number) {
el_val_t obl = hi_noun_oblique(possessor, possessor_gender, possessor_number);
el_val_t gen = hi_agree_genitive(possessed_gender, possessed_number);
el_val_t poss = hi_noun_direct(possessed, possessed_gender, possessed_number);
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(obl, EL_STR(" ")), gen), EL_STR(" ")), poss);
return 0;
}
-27
View File
@@ -1,27 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn hi_str_ends(s: String, suf: String) -> Bool
extern fn hi_str_drop_last(s: String, n: Int) -> String
extern fn hi_str_last_char(s: String) -> String
extern fn hi_gender(noun: String) -> String
extern fn hi_masc_aa_stem(noun: String) -> String
extern fn hi_noun_direct_m(noun: String, number: String) -> String
extern fn hi_noun_oblique_m(noun: String, number: String) -> String
extern fn hi_noun_direct_f(noun: String, number: String) -> String
extern fn hi_noun_oblique_f(noun: String, number: String) -> String
extern fn hi_noun_direct(noun: String, gender: String, number: String) -> String
extern fn hi_noun_oblique(noun: String, gender: String, number: String) -> String
extern fn hi_postposition(gram_case: String) -> String
extern fn hi_agree_genitive(possessed_gender: String, possessed_number: String) -> String
extern fn hi_verb_stem(infinitive: String) -> String
extern fn hi_verb_stem_clean(infinitive: String) -> String
extern fn hi_present_aspect(gender: String, number: String) -> String
extern fn hi_aux_present(person: String, number: String) -> String
extern fn hi_past_suffix(gender: String, number: String) -> String
extern fn hi_past_irregular(stem: String, gender: String, number: String) -> String
extern fn hi_future_suffix(person: String, number: String, gender: String) -> String
extern fn hi_tense_suffix(tense: String, gender: String, number: String) -> String
extern fn hi_hona_present(person: String, number: String) -> String
extern fn hi_hona_past(gender: String, number: String) -> String
extern fn hi_conjugate(verb: String, tense: String, person: String, gender: String, number: String) -> String
extern fn hi_noun_with_post(noun: String, gender: String, number: String, gram_case: String) -> String
extern fn hi_genitive_phrase(possessor: String, possessor_gender: String, possessor_number: String, possessed: String, possessed_gender: String, possessed_number: String) -> String
-746
View File
@@ -1,746 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t ja_verb_group(el_val_t dict_form);
el_val_t ja_ichidan_stem(el_val_t dict_form);
el_val_t ja_godan_stem_change(el_val_t dict_form, el_val_t row);
el_val_t ja_conjugate(el_val_t dict_form, el_val_t form);
el_val_t ja_particle(el_val_t gram_case);
el_val_t ja_noun_phrase(el_val_t noun, el_val_t gram_case);
el_val_t ja_question_particle(void);
el_val_t ja_make_question(el_val_t sentence);
el_val_t ja_verb_group(el_val_t dict_form) {
if (str_eq(dict_form, EL_STR("\xe3\x81\x99\xe3\x82\x8b"))) {
return EL_STR("irregular");
}
if (str_eq(dict_form, EL_STR("\xe3\x81\x8f\xe3\x82\x8b"))) {
return EL_STR("irregular");
}
if (str_eq(dict_form, EL_STR("\xe3\x81\x8f\xe3\x82\x8b"))) {
return EL_STR("irregular");
}
if (str_eq(dict_form, EL_STR("\xe3\x81\x84\xe3\x82\x8b"))) {
return EL_STR("irregular");
}
if (str_eq(dict_form, EL_STR("\xe3\x81\x82\xe3\x82\x8b"))) {
return EL_STR("irregular");
}
if (str_eq(dict_form, EL_STR("\xe3\x81\xa0"))) {
return EL_STR("irregular");
}
if (str_eq(dict_form, EL_STR("suru"))) {
return EL_STR("irregular");
}
if (str_eq(dict_form, EL_STR("kuru"))) {
return EL_STR("irregular");
}
if (str_eq(dict_form, EL_STR("iru"))) {
return EL_STR("irregular");
}
if (str_eq(dict_form, EL_STR("aru"))) {
return EL_STR("irregular");
}
if (str_eq(dict_form, EL_STR("da"))) {
return EL_STR("irregular");
}
if (str_ends_with(dict_form, EL_STR("\xe3\x82\x8b"))) {
return EL_STR("ichidan");
}
if (str_ends_with(dict_form, EL_STR("eru"))) {
return EL_STR("ichidan");
}
if (str_ends_with(dict_form, EL_STR("iru"))) {
return EL_STR("ichidan");
}
return EL_STR("godan");
return 0;
}
el_val_t ja_ichidan_stem(el_val_t dict_form) {
if (str_ends_with(dict_form, EL_STR("\xe3\x82\x8b"))) {
el_val_t n = str_len(dict_form);
return str_drop_last(dict_form, 1);
}
if (str_ends_with(dict_form, EL_STR("ru"))) {
el_val_t n = str_len(dict_form);
return str_slice(dict_form, 0, (n - 2));
}
return dict_form;
return 0;
}
el_val_t ja_godan_stem_change(el_val_t dict_form, el_val_t row) {
el_val_t n = str_len(dict_form);
if (n == 0) {
return dict_form;
}
if (str_eq(row, EL_STR("i"))) {
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x8f"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x8d"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x90"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x8e"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x99"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x97"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xa4"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\xa1"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xac"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\xab"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xb6"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\xb3"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x82\x80"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\xbf"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x82\x8b"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x82\x8a"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x86"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x84"));
}
if (str_ends_with(dict_form, EL_STR("ku"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ki"));
}
if (str_ends_with(dict_form, EL_STR("gu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("gi"));
}
if (str_ends_with(dict_form, EL_STR("su"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("shi"));
}
if (str_ends_with(dict_form, EL_STR("tsu"))) {
return el_str_concat(str_drop_last(dict_form, 3), EL_STR("chi"));
}
if (str_ends_with(dict_form, EL_STR("nu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ni"));
}
if (str_ends_with(dict_form, EL_STR("bu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("bi"));
}
if (str_ends_with(dict_form, EL_STR("mu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("mi"));
}
if (str_ends_with(dict_form, EL_STR("ru"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ri"));
}
if (str_ends_with(dict_form, EL_STR("u"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("i"));
}
return dict_form;
}
if (str_eq(row, EL_STR("a"))) {
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x8f"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x8b"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x90"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x8c"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x99"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x95"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xa4"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x9f"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xac"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\xaa"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xb6"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\xb0"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x82\x80"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\xbe"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x82\x8b"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x82\x89"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x86"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x82\x8f"));
}
if (str_ends_with(dict_form, EL_STR("ku"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ka"));
}
if (str_ends_with(dict_form, EL_STR("gu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ga"));
}
if (str_ends_with(dict_form, EL_STR("su"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("sa"));
}
if (str_ends_with(dict_form, EL_STR("tsu"))) {
return el_str_concat(str_drop_last(dict_form, 3), EL_STR("ta"));
}
if (str_ends_with(dict_form, EL_STR("nu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("na"));
}
if (str_ends_with(dict_form, EL_STR("bu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ba"));
}
if (str_ends_with(dict_form, EL_STR("mu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ma"));
}
if (str_ends_with(dict_form, EL_STR("ru"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ra"));
}
if (str_ends_with(dict_form, EL_STR("u"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("wa"));
}
return dict_form;
}
if (str_eq(row, EL_STR("te"))) {
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x8f"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x84"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x90"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x84"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x99"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x97"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xa4"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\xa3"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xac"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x82\x93"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xb6"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x82\x93"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x82\x80"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x82\x93"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x82\x8b"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\xa3"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x86"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\xa3"));
}
if (str_ends_with(dict_form, EL_STR("ku"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("i"));
}
if (str_ends_with(dict_form, EL_STR("gu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("i"));
}
if (str_ends_with(dict_form, EL_STR("su"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("shi"));
}
if (str_ends_with(dict_form, EL_STR("tsu"))) {
return el_str_concat(str_drop_last(dict_form, 3), EL_STR("tt"));
}
if (str_ends_with(dict_form, EL_STR("nu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("n"));
}
if (str_ends_with(dict_form, EL_STR("bu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("n"));
}
if (str_ends_with(dict_form, EL_STR("mu"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("n"));
}
if (str_ends_with(dict_form, EL_STR("ru"))) {
return el_str_concat(str_drop_last(dict_form, 2), EL_STR("tt"));
}
if (str_ends_with(dict_form, EL_STR("u"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("tt"));
}
return dict_form;
}
return dict_form;
return 0;
}
el_val_t ja_conjugate(el_val_t dict_form, el_val_t form) {
el_val_t group = ja_verb_group(dict_form);
if (str_eq(group, EL_STR("irregular"))) {
if (str_eq(dict_form, EL_STR("\xe3\x81\x99\xe3\x82\x8b"))) {
if (str_eq(form, EL_STR("present"))) {
return EL_STR("\xe3\x81\x99\xe3\x82\x8b");
}
if (str_eq(form, EL_STR("past"))) {
return EL_STR("\xe3\x81\x97\xe3\x81\x9f");
}
if (str_eq(form, EL_STR("negative"))) {
return EL_STR("\xe3\x81\x97\xe3\x81\xaa\xe3\x81\x84");
}
if (str_eq(form, EL_STR("volitional"))) {
return EL_STR("\xe3\x81\x97\xe3\x82\x88\xe3\x81\x86");
}
if (str_eq(form, EL_STR("polite"))) {
return EL_STR("\xe3\x81\x97\xe3\x81\xbe\xe3\x81\x99");
}
if (str_eq(form, EL_STR("polite-past"))) {
return EL_STR("\xe3\x81\x97\xe3\x81\xbe\xe3\x81\x97\xe3\x81\x9f");
}
if (str_eq(form, EL_STR("polite-neg"))) {
return EL_STR("\xe3\x81\x97\xe3\x81\xbe\xe3\x81\x9b\xe3\x82\x93");
}
if (str_eq(form, EL_STR("te"))) {
return EL_STR("\xe3\x81\x97\xe3\x81\xa6");
}
return dict_form;
}
if (str_eq(dict_form, EL_STR("suru"))) {
if (str_eq(form, EL_STR("present"))) {
return EL_STR("suru");
}
if (str_eq(form, EL_STR("past"))) {
return EL_STR("shita");
}
if (str_eq(form, EL_STR("negative"))) {
return EL_STR("shinai");
}
if (str_eq(form, EL_STR("volitional"))) {
return EL_STR("shiyou");
}
if (str_eq(form, EL_STR("polite"))) {
return EL_STR("shimasu");
}
if (str_eq(form, EL_STR("polite-past"))) {
return EL_STR("shimashita");
}
if (str_eq(form, EL_STR("polite-neg"))) {
return EL_STR("shimasen");
}
if (str_eq(form, EL_STR("te"))) {
return EL_STR("shite");
}
return dict_form;
}
if (str_eq(dict_form, EL_STR("\xe3\x81\x8f\xe3\x82\x8b"))) {
if (str_eq(form, EL_STR("present"))) {
return EL_STR("\xe3\x81\x8f\xe3\x82\x8b");
}
if (str_eq(form, EL_STR("past"))) {
return EL_STR("\xe3\x81\x8d\xe3\x81\x9f");
}
if (str_eq(form, EL_STR("negative"))) {
return EL_STR("\xe3\x81\x93\xe3\x81\xaa\xe3\x81\x84");
}
if (str_eq(form, EL_STR("volitional"))) {
return EL_STR("\xe3\x81\x93\xe3\x82\x88\xe3\x81\x86");
}
if (str_eq(form, EL_STR("polite"))) {
return EL_STR("\xe3\x81\x8d\xe3\x81\xbe\xe3\x81\x99");
}
if (str_eq(form, EL_STR("polite-past"))) {
return EL_STR("\xe3\x81\x8d\xe3\x81\xbe\xe3\x81\x97\xe3\x81\x9f");
}
if (str_eq(form, EL_STR("polite-neg"))) {
return EL_STR("\xe3\x81\x8d\xe3\x81\xbe\xe3\x81\x9b\xe3\x82\x93");
}
if (str_eq(form, EL_STR("te"))) {
return EL_STR("\xe3\x81\x8d\xe3\x81\xa6");
}
return dict_form;
}
if (str_eq(dict_form, EL_STR("kuru"))) {
if (str_eq(form, EL_STR("present"))) {
return EL_STR("kuru");
}
if (str_eq(form, EL_STR("past"))) {
return EL_STR("kita");
}
if (str_eq(form, EL_STR("negative"))) {
return EL_STR("konai");
}
if (str_eq(form, EL_STR("volitional"))) {
return EL_STR("koyou");
}
if (str_eq(form, EL_STR("polite"))) {
return EL_STR("kimasu");
}
if (str_eq(form, EL_STR("polite-past"))) {
return EL_STR("kimashita");
}
if (str_eq(form, EL_STR("polite-neg"))) {
return EL_STR("kimasen");
}
if (str_eq(form, EL_STR("te"))) {
return EL_STR("kite");
}
return dict_form;
}
if (str_eq(dict_form, EL_STR("\xe3\x81\x84\xe3\x82\x8b"))) {
if (str_eq(form, EL_STR("present"))) {
return EL_STR("\xe3\x81\x84\xe3\x82\x8b");
}
if (str_eq(form, EL_STR("past"))) {
return EL_STR("\xe3\x81\x84\xe3\x81\x9f");
}
if (str_eq(form, EL_STR("negative"))) {
return EL_STR("\xe3\x81\x84\xe3\x81\xaa\xe3\x81\x84");
}
if (str_eq(form, EL_STR("volitional"))) {
return EL_STR("\xe3\x81\x84\xe3\x82\x88\xe3\x81\x86");
}
if (str_eq(form, EL_STR("polite"))) {
return EL_STR("\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x99");
}
if (str_eq(form, EL_STR("polite-past"))) {
return EL_STR("\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x97\xe3\x81\x9f");
}
if (str_eq(form, EL_STR("polite-neg"))) {
return EL_STR("\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x9b\xe3\x82\x93");
}
if (str_eq(form, EL_STR("te"))) {
return EL_STR("\xe3\x81\x84\xe3\x81\xa6");
}
return dict_form;
}
if (str_eq(dict_form, EL_STR("iru"))) {
if (str_eq(form, EL_STR("present"))) {
return EL_STR("iru");
}
if (str_eq(form, EL_STR("past"))) {
return EL_STR("ita");
}
if (str_eq(form, EL_STR("negative"))) {
return EL_STR("inai");
}
if (str_eq(form, EL_STR("volitional"))) {
return EL_STR("iyou");
}
if (str_eq(form, EL_STR("polite"))) {
return EL_STR("imasu");
}
if (str_eq(form, EL_STR("polite-past"))) {
return EL_STR("imashita");
}
if (str_eq(form, EL_STR("polite-neg"))) {
return EL_STR("imasen");
}
if (str_eq(form, EL_STR("te"))) {
return EL_STR("ite");
}
return dict_form;
}
if (str_eq(dict_form, EL_STR("\xe3\x81\x82\xe3\x82\x8b"))) {
if (str_eq(form, EL_STR("present"))) {
return EL_STR("\xe3\x81\x82\xe3\x82\x8b");
}
if (str_eq(form, EL_STR("past"))) {
return EL_STR("\xe3\x81\x82\xe3\x81\xa3\xe3\x81\x9f");
}
if (str_eq(form, EL_STR("negative"))) {
return EL_STR("\xe3\x81\xaa\xe3\x81\x84");
}
if (str_eq(form, EL_STR("volitional"))) {
return EL_STR("\xe3\x81\x82\xe3\x82\x8d\xe3\x81\x86");
}
if (str_eq(form, EL_STR("polite"))) {
return EL_STR("\xe3\x81\x82\xe3\x82\x8a\xe3\x81\xbe\xe3\x81\x99");
}
if (str_eq(form, EL_STR("polite-past"))) {
return EL_STR("\xe3\x81\x82\xe3\x82\x8a\xe3\x81\xbe\xe3\x81\x97\xe3\x81\x9f");
}
if (str_eq(form, EL_STR("polite-neg"))) {
return EL_STR("\xe3\x81\x82\xe3\x82\x8a\xe3\x81\xbe\xe3\x81\x9b\xe3\x82\x93");
}
if (str_eq(form, EL_STR("te"))) {
return EL_STR("\xe3\x81\x82\xe3\x81\xa3\xe3\x81\xa6");
}
return dict_form;
}
if (str_eq(dict_form, EL_STR("aru"))) {
if (str_eq(form, EL_STR("present"))) {
return EL_STR("aru");
}
if (str_eq(form, EL_STR("past"))) {
return EL_STR("atta");
}
if (str_eq(form, EL_STR("negative"))) {
return EL_STR("nai");
}
if (str_eq(form, EL_STR("volitional"))) {
return EL_STR("arou");
}
if (str_eq(form, EL_STR("polite"))) {
return EL_STR("arimasu");
}
if (str_eq(form, EL_STR("polite-past"))) {
return EL_STR("arimashita");
}
if (str_eq(form, EL_STR("polite-neg"))) {
return EL_STR("arimasen");
}
if (str_eq(form, EL_STR("te"))) {
return EL_STR("atte");
}
return dict_form;
}
if (str_eq(dict_form, EL_STR("\xe3\x81\xa0"))) {
if (str_eq(form, EL_STR("present"))) {
return EL_STR("\xe3\x81\xa0");
}
if (str_eq(form, EL_STR("past"))) {
return EL_STR("\xe3\x81\xa0\xe3\x81\xa3\xe3\x81\x9f");
}
if (str_eq(form, EL_STR("negative"))) {
return EL_STR("\xe3\x81\xa7\xe3\x81\xaf\xe3\x81\xaa\xe3\x81\x84");
}
if (str_eq(form, EL_STR("volitional"))) {
return EL_STR("\xe3\x81\xa0\xe3\x82\x8d\xe3\x81\x86");
}
if (str_eq(form, EL_STR("polite"))) {
return EL_STR("\xe3\x81\xa7\xe3\x81\x99");
}
if (str_eq(form, EL_STR("polite-past"))) {
return EL_STR("\xe3\x81\xa7\xe3\x81\x97\xe3\x81\x9f");
}
if (str_eq(form, EL_STR("polite-neg"))) {
return EL_STR("\xe3\x81\xa7\xe3\x81\xaf\xe3\x81\x82\xe3\x82\x8a\xe3\x81\xbe\xe3\x81\x9b\xe3\x82\x93");
}
if (str_eq(form, EL_STR("te"))) {
return EL_STR("\xe3\x81\xa7");
}
return dict_form;
}
if (str_eq(dict_form, EL_STR("da"))) {
if (str_eq(form, EL_STR("present"))) {
return EL_STR("da");
}
if (str_eq(form, EL_STR("past"))) {
return EL_STR("datta");
}
if (str_eq(form, EL_STR("negative"))) {
return EL_STR("dewanai");
}
if (str_eq(form, EL_STR("volitional"))) {
return EL_STR("darou");
}
if (str_eq(form, EL_STR("polite"))) {
return EL_STR("desu");
}
if (str_eq(form, EL_STR("polite-past"))) {
return EL_STR("deshita");
}
if (str_eq(form, EL_STR("polite-neg"))) {
return EL_STR("dewaarimarsen");
}
if (str_eq(form, EL_STR("te"))) {
return EL_STR("de");
}
return dict_form;
}
return dict_form;
}
if (str_eq(group, EL_STR("ichidan"))) {
el_val_t stem = ja_ichidan_stem(dict_form);
if (str_eq(form, EL_STR("present"))) {
return dict_form;
}
if (str_eq(form, EL_STR("past"))) {
return el_str_concat(stem, EL_STR("\xe3\x81\x9f"));
}
if (str_eq(form, EL_STR("negative"))) {
return el_str_concat(stem, EL_STR("\xe3\x81\xaa\xe3\x81\x84"));
}
if (str_eq(form, EL_STR("volitional"))) {
return el_str_concat(stem, EL_STR("\xe3\x82\x88\xe3\x81\x86"));
}
if (str_eq(form, EL_STR("polite"))) {
return el_str_concat(stem, EL_STR("\xe3\x81\xbe\xe3\x81\x99"));
}
if (str_eq(form, EL_STR("polite-past"))) {
return el_str_concat(stem, EL_STR("\xe3\x81\xbe\xe3\x81\x97\xe3\x81\x9f"));
}
if (str_eq(form, EL_STR("polite-neg"))) {
return el_str_concat(stem, EL_STR("\xe3\x81\xbe\xe3\x81\x9b\xe3\x82\x93"));
}
if (str_eq(form, EL_STR("te"))) {
return el_str_concat(stem, EL_STR("\xe3\x81\xa6"));
}
return dict_form;
}
if (str_eq(form, EL_STR("present"))) {
return dict_form;
}
if (str_eq(form, EL_STR("polite"))) {
el_val_t istem = ja_godan_stem_change(dict_form, EL_STR("i"));
return el_str_concat(istem, EL_STR("\xe3\x81\xbe\xe3\x81\x99"));
}
if (str_eq(form, EL_STR("polite-past"))) {
el_val_t istem = ja_godan_stem_change(dict_form, EL_STR("i"));
return el_str_concat(istem, EL_STR("\xe3\x81\xbe\xe3\x81\x97\xe3\x81\x9f"));
}
if (str_eq(form, EL_STR("polite-neg"))) {
el_val_t istem = ja_godan_stem_change(dict_form, EL_STR("i"));
return el_str_concat(istem, EL_STR("\xe3\x81\xbe\xe3\x81\x9b\xe3\x82\x93"));
}
if (str_eq(form, EL_STR("negative"))) {
el_val_t astem = ja_godan_stem_change(dict_form, EL_STR("a"));
return el_str_concat(astem, EL_STR("\xe3\x81\xaa\xe3\x81\x84"));
}
if (str_eq(form, EL_STR("volitional"))) {
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x86"))) {
return el_str_concat(str_drop_last(dict_form, 1), EL_STR("\xe3\x81\x8a\xe3\x81\x86"));
}
el_val_t istem = ja_godan_stem_change(dict_form, EL_STR("i"));
return el_str_concat(istem, EL_STR("\xe3\x82\x8d\xe3\x81\x86"));
}
if (str_eq(form, EL_STR("te"))) {
el_val_t tstem = ja_godan_stem_change(dict_form, EL_STR("te"));
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x90"))) {
return el_str_concat(tstem, EL_STR("\xe3\x81\x84\xe3\x81\xa7"));
}
if (str_ends_with(dict_form, EL_STR("gu"))) {
return el_str_concat(tstem, EL_STR("ide"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xac"))) {
return el_str_concat(tstem, EL_STR("\xe3\x82\x93\xe3\x81\xa7"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xb6"))) {
return el_str_concat(tstem, EL_STR("\xe3\x82\x93\xe3\x81\xa7"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x82\x80"))) {
return el_str_concat(tstem, EL_STR("\xe3\x82\x93\xe3\x81\xa7"));
}
if (str_ends_with(dict_form, EL_STR("nu"))) {
return el_str_concat(tstem, EL_STR("nde"));
}
if (str_ends_with(dict_form, EL_STR("bu"))) {
return el_str_concat(tstem, EL_STR("nde"));
}
if (str_ends_with(dict_form, EL_STR("mu"))) {
return el_str_concat(tstem, EL_STR("nde"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x99"))) {
return el_str_concat(tstem, EL_STR("\xe3\x81\x97\xe3\x81\xa6"));
}
if (str_ends_with(dict_form, EL_STR("su"))) {
return el_str_concat(tstem, EL_STR("shite"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x8f"))) {
return el_str_concat(tstem, EL_STR("\xe3\x81\xa6"));
}
if (str_ends_with(dict_form, EL_STR("ku"))) {
return el_str_concat(tstem, EL_STR("te"));
}
return el_str_concat(tstem, EL_STR("\xe3\x81\xa6"));
}
if (str_eq(form, EL_STR("past"))) {
el_val_t tstem = ja_godan_stem_change(dict_form, EL_STR("te"));
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x90"))) {
return el_str_concat(tstem, EL_STR("\xe3\x81\x84\xe3\x81\xa0"));
}
if (str_ends_with(dict_form, EL_STR("gu"))) {
return el_str_concat(tstem, EL_STR("ida"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xac"))) {
return el_str_concat(tstem, EL_STR("\xe3\x82\x93\xe3\x81\xa0"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\xb6"))) {
return el_str_concat(tstem, EL_STR("\xe3\x82\x93\xe3\x81\xa0"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x82\x80"))) {
return el_str_concat(tstem, EL_STR("\xe3\x82\x93\xe3\x81\xa0"));
}
if (str_ends_with(dict_form, EL_STR("nu"))) {
return el_str_concat(tstem, EL_STR("nda"));
}
if (str_ends_with(dict_form, EL_STR("bu"))) {
return el_str_concat(tstem, EL_STR("nda"));
}
if (str_ends_with(dict_form, EL_STR("mu"))) {
return el_str_concat(tstem, EL_STR("nda"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x99"))) {
return el_str_concat(tstem, EL_STR("\xe3\x81\x97\xe3\x81\x9f"));
}
if (str_ends_with(dict_form, EL_STR("su"))) {
return el_str_concat(tstem, EL_STR("shita"));
}
if (str_ends_with(dict_form, EL_STR("\xe3\x81\x8f"))) {
return el_str_concat(tstem, EL_STR("\xe3\x81\x9f"));
}
if (str_ends_with(dict_form, EL_STR("ku"))) {
return el_str_concat(tstem, EL_STR("ta"));
}
return el_str_concat(tstem, EL_STR("\xe3\x81\x9f"));
}
return dict_form;
return 0;
}
el_val_t ja_particle(el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("\xe3\x81\x8c");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("\xe3\x82\x92");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("\xe3\x81\xab");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("\xe3\x81\xae");
}
if (str_eq(gram_case, EL_STR("topic"))) {
return EL_STR("\xe3\x81\xaf");
}
if (str_eq(gram_case, EL_STR("instrumental"))) {
return EL_STR("\xe3\x81\xa7");
}
if (str_eq(gram_case, EL_STR("locative"))) {
return EL_STR("\xe3\x81\xab");
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return EL_STR("\xe3\x81\x8b\xe3\x82\x89");
}
if (str_eq(gram_case, EL_STR("direction"))) {
return EL_STR("\xe3\x81\xb8");
}
if (str_eq(gram_case, EL_STR("comitative"))) {
return EL_STR("\xe3\x81\xa8");
}
return EL_STR("");
return 0;
}
el_val_t ja_noun_phrase(el_val_t noun, el_val_t gram_case) {
el_val_t p = ja_particle(gram_case);
if (str_eq(p, EL_STR(""))) {
return noun;
}
return el_str_concat(noun, p);
return 0;
}
el_val_t ja_question_particle(void) {
return EL_STR("\xe3\x81\x8b");
return 0;
}
el_val_t ja_make_question(el_val_t sentence) {
return el_str_concat(sentence, ja_question_particle());
return 0;
}
-9
View File
@@ -1,9 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn ja_verb_group(dict_form: String) -> String
extern fn ja_ichidan_stem(dict_form: String) -> String
extern fn ja_godan_stem_change(dict_form: String, row: String) -> String
extern fn ja_conjugate(dict_form: String, form: String) -> String
extern fn ja_particle(gram_case: String) -> String
extern fn ja_noun_phrase(noun: String, gram_case: String) -> String
extern fn ja_question_particle() -> String
extern fn ja_make_question(sentence: String) -> String
-1150
View File
File diff suppressed because it is too large Load Diff
-41
View File
@@ -1,41 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn la_str_ends(s: String, suf: String) -> Bool
extern fn la_str_drop_last(s: String, n: Int) -> String
extern fn la_str_last_char(s: String) -> String
extern fn la_str_last2(s: String) -> String
extern fn la_str_last3(s: String) -> String
extern fn la_slot(person: String, number: String) -> Int
extern fn la_verb_class(verb: String) -> String
extern fn la_stem(verb: String, vclass: String) -> String
extern fn la_perfect_stem(verb: String, vclass: String) -> String
extern fn la_perfect_ending(slot: Int) -> String
extern fn la_present_ending(vclass: String, slot: Int) -> String
extern fn la_present_form(stem: String, vclass: String, slot: Int) -> String
extern fn la_future_ending_12(slot: Int) -> String
extern fn la_future_ending_34(slot: Int) -> String
extern fn la_future_form(stem: String, vclass: String, slot: Int) -> String
extern fn la_esse_present(slot: Int) -> String
extern fn la_esse_past(slot: Int) -> String
extern fn la_esse_future(slot: Int) -> String
extern fn la_ire_present(slot: Int) -> String
extern fn la_ire_past(slot: Int) -> String
extern fn la_ire_future(slot: Int) -> String
extern fn la_velle_present(slot: Int) -> String
extern fn la_velle_past(slot: Int) -> String
extern fn la_velle_future(slot: Int) -> String
extern fn la_posse_present(slot: Int) -> String
extern fn la_posse_past(slot: Int) -> String
extern fn la_posse_future(slot: Int) -> String
extern fn la_irregular_perfect_stem(verb: String) -> String
extern fn la_map_canonical(verb: String) -> String
extern fn la_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn la_declension(noun: String) -> String
extern fn la_decline_1(stem: String, gram_case: String, number: String) -> String
extern fn la_decline_2m(stem: String, gram_case: String, number: String) -> String
extern fn la_decline_2n(stem: String, gram_case: String, number: String) -> String
extern fn la_decline_3(noun: String, gram_case: String, number: String) -> String
extern fn la_decline_4(stem: String, gram_case: String, number: String) -> String
extern fn la_decline_5(stem: String, gram_case: String, number: String) -> String
extern fn la_decline_2er(noun: String, gram_case: String, number: String) -> String
extern fn la_decline(noun: String, gram_case: String, number: String) -> String
extern fn la_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-808
View File
@@ -1,808 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t non_str_ends(el_val_t s, el_val_t suf);
el_val_t non_drop(el_val_t s, el_val_t n);
el_val_t non_last(el_val_t s);
el_val_t non_slot(el_val_t person, el_val_t number);
el_val_t non_vera_present(el_val_t slot);
el_val_t non_vera_past(el_val_t slot);
el_val_t non_hafa_present(el_val_t slot);
el_val_t non_hafa_past(el_val_t slot);
el_val_t non_ganga_present(el_val_t slot);
el_val_t non_ganga_past(el_val_t slot);
el_val_t non_sja_present(el_val_t slot);
el_val_t non_sja_past(el_val_t slot);
el_val_t non_segja_present(el_val_t slot);
el_val_t non_segja_past(el_val_t slot);
el_val_t non_koma_present(el_val_t slot);
el_val_t non_koma_past(el_val_t slot);
el_val_t non_map_canonical(el_val_t verb);
el_val_t non_weak_present(el_val_t stem, el_val_t slot);
el_val_t non_weak_past(el_val_t stem, el_val_t slot);
el_val_t non_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t non_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t non_decline_fem(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t non_decline_neut(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t non_detect_gender(el_val_t noun);
el_val_t non_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t non_def_suffix_masc(el_val_t gram_case, el_val_t number);
el_val_t non_def_suffix_neut(el_val_t gram_case, el_val_t number);
el_val_t non_def_suffix_fem(el_val_t gram_case, el_val_t number);
el_val_t non_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t non_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t non_drop(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t non_last(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t non_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t non_vera_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("em");
}
if (slot == 1) {
return EL_STR("ert");
}
if (slot == 2) {
return EL_STR("er");
}
if (slot == 3) {
return EL_STR("erum");
}
if (slot == 4) {
return EL_STR("eru\xc3\xb0");
}
return EL_STR("eru");
return 0;
}
el_val_t non_vera_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("var");
}
if (slot == 1) {
return EL_STR("vart");
}
if (slot == 2) {
return EL_STR("var");
}
if (slot == 3) {
return EL_STR("v\xc3\xb3rum");
}
if (slot == 4) {
return EL_STR("v\xc3\xb3ru\xc3\xb0");
}
return EL_STR("v\xc3\xb3ru");
return 0;
}
el_val_t non_hafa_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("hefi");
}
if (slot == 1) {
return EL_STR("hefr");
}
if (slot == 2) {
return EL_STR("hefr");
}
if (slot == 3) {
return EL_STR("h\xc3\xb6""fum");
}
if (slot == 4) {
return EL_STR("hafi\xc3\xb0");
}
return EL_STR("hafa");
return 0;
}
el_val_t non_hafa_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("haf\xc3\xb0""a");
}
if (slot == 1) {
return EL_STR("haf\xc3\xb0ir");
}
if (slot == 2) {
return EL_STR("haf\xc3\xb0i");
}
if (slot == 3) {
return EL_STR("h\xc3\xb6""f\xc3\xb0um");
}
if (slot == 4) {
return EL_STR("h\xc3\xb6""f\xc3\xb0u\xc3\xb0");
}
return EL_STR("h\xc3\xb6""f\xc3\xb0u");
return 0;
}
el_val_t non_ganga_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("geng");
}
if (slot == 1) {
return EL_STR("gengr");
}
if (slot == 2) {
return EL_STR("gengr");
}
if (slot == 3) {
return EL_STR("g\xc3\xb6ngum");
}
if (slot == 4) {
return EL_STR("gangi\xc3\xb0");
}
return EL_STR("ganga");
return 0;
}
el_val_t non_ganga_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("gekk");
}
if (slot == 1) {
return EL_STR("gekkt");
}
if (slot == 2) {
return EL_STR("gekk");
}
if (slot == 3) {
return EL_STR("gengum");
}
if (slot == 4) {
return EL_STR("gengu\xc3\xb0");
}
return EL_STR("gengu");
return 0;
}
el_val_t non_sja_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("s\xc3\xa9");
}
if (slot == 1) {
return EL_STR("s\xc3\xa9r");
}
if (slot == 2) {
return EL_STR("s\xc3\xa9r");
}
if (slot == 3) {
return EL_STR("s\xc3\xa9um");
}
if (slot == 4) {
return EL_STR("s\xc3\xa9i\xc3\xb0");
}
return EL_STR("sj\xc3\xa1");
return 0;
}
el_val_t non_sja_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("s\xc3\xa1");
}
if (slot == 1) {
return EL_STR("s\xc3\xa1st");
}
if (slot == 2) {
return EL_STR("s\xc3\xa1");
}
if (slot == 3) {
return EL_STR("s\xc3\xa1m");
}
if (slot == 4) {
return EL_STR("s\xc3\xa1\xc3\xb0");
}
return EL_STR("s\xc3\xa1u");
return 0;
}
el_val_t non_segja_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("segi");
}
if (slot == 1) {
return EL_STR("segir");
}
if (slot == 2) {
return EL_STR("segir");
}
if (slot == 3) {
return EL_STR("segjum");
}
if (slot == 4) {
return EL_STR("segi\xc3\xb0");
}
return EL_STR("segja");
return 0;
}
el_val_t non_segja_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("sag\xc3\xb0i");
}
if (slot == 1) {
return EL_STR("sag\xc3\xb0ir");
}
if (slot == 2) {
return EL_STR("sag\xc3\xb0i");
}
if (slot == 3) {
return EL_STR("s\xc3\xb6g\xc3\xb0um");
}
if (slot == 4) {
return EL_STR("s\xc3\xb6g\xc3\xb0u\xc3\xb0");
}
return EL_STR("s\xc3\xb6g\xc3\xb0u");
return 0;
}
el_val_t non_koma_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("kem");
}
if (slot == 1) {
return EL_STR("kemr");
}
if (slot == 2) {
return EL_STR("kemr");
}
if (slot == 3) {
return EL_STR("komum");
}
if (slot == 4) {
return EL_STR("komi\xc3\xb0");
}
return EL_STR("koma");
return 0;
}
el_val_t non_koma_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("kom");
}
if (slot == 1) {
return EL_STR("komt");
}
if (slot == 2) {
return EL_STR("kom");
}
if (slot == 3) {
return EL_STR("komum");
}
if (slot == 4) {
return EL_STR("komu\xc3\xb0");
}
return EL_STR("komu");
return 0;
}
el_val_t non_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("vera");
}
if (str_eq(verb, EL_STR("have"))) {
return EL_STR("hafa");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("ganga");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("sj\xc3\xa1");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("segja");
}
if (str_eq(verb, EL_STR("come"))) {
return EL_STR("koma");
}
return verb;
return 0;
}
el_val_t non_weak_present(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("a"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("ar"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("ar"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("um"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("i\xc3\xb0"));
}
return el_str_concat(stem, EL_STR("a"));
return 0;
}
el_val_t non_weak_past(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("a\xc3\xb0i"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("a\xc3\xb0ir"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("a\xc3\xb0i"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("u\xc3\xb0um"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("u\xc3\xb0u\xc3\xb0"));
}
return el_str_concat(stem, EL_STR("u\xc3\xb0u"));
return 0;
}
el_val_t non_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = non_map_canonical(verb);
el_val_t slot = non_slot(person, number);
if (str_eq(v, EL_STR("vera"))) {
if (str_eq(tense, EL_STR("present"))) {
return non_vera_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return non_vera_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("hafa"))) {
if (str_eq(tense, EL_STR("present"))) {
return non_hafa_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return non_hafa_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("ganga"))) {
if (str_eq(tense, EL_STR("present"))) {
return non_ganga_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return non_ganga_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("sj\xc3\xa1"))) {
if (str_eq(tense, EL_STR("present"))) {
return non_sja_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return non_sja_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("segja"))) {
if (str_eq(tense, EL_STR("present"))) {
return non_segja_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return non_segja_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("koma"))) {
if (str_eq(tense, EL_STR("present"))) {
return non_koma_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return non_koma_past(slot);
}
return v;
}
if (non_str_ends(v, EL_STR("a"))) {
el_val_t stem = non_drop(v, 1);
if (str_eq(tense, EL_STR("present"))) {
return non_weak_present(stem, slot);
}
if (str_eq(tense, EL_STR("past"))) {
return non_weak_past(stem, slot);
}
return v;
}
return v;
return 0;
}
el_val_t non_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t stem = noun;
if (non_str_ends(noun, EL_STR("r"))) {
stem = non_drop(noun, 1);
}
if (str_eq(noun, EL_STR("armr"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("armr");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("arm");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("arms");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("armi");
}
return EL_STR("armr");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("armar");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("arma");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("arma");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("\xc3\xb6rmum");
}
return EL_STR("armar");
}
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("r"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return stem;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("s"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("i"));
}
return el_str_concat(stem, EL_STR("r"));
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("ar"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("um"));
}
return el_str_concat(stem, EL_STR("ar"));
return 0;
}
el_val_t non_decline_fem(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(noun, EL_STR("g\xc3\xb6r"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("g\xc3\xb6r");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("g\xc3\xb6rvar");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("g\xc3\xb6rvar");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("g\xc3\xb6rvi");
}
return EL_STR("g\xc3\xb6r");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("g\xc3\xb6rvar");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("g\xc3\xb6rvar");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("g\xc3\xb6rva");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("g\xc3\xb6rvum");
}
return EL_STR("g\xc3\xb6rvar");
}
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("var"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("var"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("vi"));
}
return noun;
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("var"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("var"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("va"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("vum"));
}
return el_str_concat(noun, EL_STR("var"));
return 0;
}
el_val_t non_decline_neut(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(noun, EL_STR("land"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("land");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("land");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("lands");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("landi");
}
return EL_STR("land");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("l\xc3\xb6nd");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("l\xc3\xb6nd");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("landa");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("l\xc3\xb6ndum");
}
return EL_STR("l\xc3\xb6nd");
}
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("s"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("i"));
}
return noun;
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("um"));
}
return noun;
return 0;
}
el_val_t non_detect_gender(el_val_t noun) {
if (str_eq(noun, EL_STR("land"))) {
return EL_STR("neuter");
}
if (str_eq(noun, EL_STR("g\xc3\xb6r"))) {
return EL_STR("feminine");
}
return EL_STR("masculine");
return 0;
}
el_val_t non_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t gender = non_detect_gender(noun);
if (str_eq(gender, EL_STR("masculine"))) {
return non_decline_masc(noun, gram_case, number);
}
if (str_eq(gender, EL_STR("feminine"))) {
return non_decline_fem(noun, gram_case, number);
}
if (str_eq(gender, EL_STR("neuter"))) {
return non_decline_neut(noun, gram_case, number);
}
return noun;
return 0;
}
el_val_t non_def_suffix_masc(el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("inn");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("ins");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("inum");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("inn");
}
return EL_STR("inn");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("inir");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("ina");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("anna");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("unum");
}
return EL_STR("inir");
return 0;
}
el_val_t non_def_suffix_neut(el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("it");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("ins");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("inu");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("it");
}
return EL_STR("it");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("in");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("in");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("anna");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("unum");
}
return EL_STR("in");
return 0;
}
el_val_t non_def_suffix_fem(el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("in");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("innar");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("inni");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("ina");
}
return EL_STR("in");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("inar");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("inar");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("anna");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("innar");
}
return EL_STR("inar");
return 0;
}
el_val_t non_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
el_val_t base = non_decline(noun, gram_case, number);
if (!str_eq(definite, EL_STR("true"))) {
return base;
}
el_val_t gender = non_detect_gender(noun);
if (str_eq(gender, EL_STR("masculine"))) {
return el_str_concat(base, non_def_suffix_masc(gram_case, number));
}
if (str_eq(gender, EL_STR("neuter"))) {
return el_str_concat(base, non_def_suffix_neut(gram_case, number));
}
if (str_eq(gender, EL_STR("feminine"))) {
return el_str_concat(base, non_def_suffix_fem(gram_case, number));
}
return el_str_concat(base, EL_STR("inn"));
return 0;
}
-30
View File
@@ -1,30 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn non_str_ends(s: String, suf: String) -> Bool
extern fn non_drop(s: String, n: Int) -> String
extern fn non_last(s: String) -> String
extern fn non_slot(person: String, number: String) -> Int
extern fn non_vera_present(slot: Int) -> String
extern fn non_vera_past(slot: Int) -> String
extern fn non_hafa_present(slot: Int) -> String
extern fn non_hafa_past(slot: Int) -> String
extern fn non_ganga_present(slot: Int) -> String
extern fn non_ganga_past(slot: Int) -> String
extern fn non_sja_present(slot: Int) -> String
extern fn non_sja_past(slot: Int) -> String
extern fn non_segja_present(slot: Int) -> String
extern fn non_segja_past(slot: Int) -> String
extern fn non_koma_present(slot: Int) -> String
extern fn non_koma_past(slot: Int) -> String
extern fn non_map_canonical(verb: String) -> String
extern fn non_weak_present(stem: String, slot: Int) -> String
extern fn non_weak_past(stem: String, slot: Int) -> String
extern fn non_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn non_decline_masc(noun: String, gram_case: String, number: String) -> String
extern fn non_decline_fem(noun: String, gram_case: String, number: String) -> String
extern fn non_decline_neut(noun: String, gram_case: String, number: String) -> String
extern fn non_detect_gender(noun: String) -> String
extern fn non_decline(noun: String, gram_case: String, number: String) -> String
extern fn non_def_suffix_masc(gram_case: String, number: String) -> String
extern fn non_def_suffix_neut(gram_case: String, number: String) -> String
extern fn non_def_suffix_fem(gram_case: String, number: String) -> String
extern fn non_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-427
View File
@@ -1,427 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t peo_drop(el_val_t s, el_val_t n);
el_val_t peo_ends(el_val_t s, el_val_t suf);
el_val_t peo_slot(el_val_t person, el_val_t number);
el_val_t peo_present_suffix(el_val_t slot);
el_val_t peo_past_suffix(el_val_t slot);
el_val_t peo_ah_present(el_val_t slot);
el_val_t peo_ah_past(el_val_t slot);
el_val_t peo_kar_present(el_val_t slot);
el_val_t peo_kar_past(el_val_t slot);
el_val_t peo_xsaya_present(el_val_t slot);
el_val_t peo_tar_present(el_val_t slot);
el_val_t peo_da_present(el_val_t slot);
el_val_t peo_da_past(el_val_t slot);
el_val_t peo_map_canonical(el_val_t verb);
el_val_t peo_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t peo_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t peo_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t peo_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t peo_drop(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t peo_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t peo_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t peo_present_suffix(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xc4\x81miy");
}
if (slot == 1) {
return EL_STR("ahiy");
}
if (slot == 2) {
return EL_STR("atiy");
}
if (slot == 3) {
return EL_STR("\xc4\x81mahy");
}
if (slot == 4) {
return EL_STR("\xc4\x81t\xc4\x81");
}
return EL_STR("antiy");
return 0;
}
el_val_t peo_past_suffix(el_val_t slot) {
if (slot == 0) {
return EL_STR("am");
}
if (slot == 1) {
return EL_STR("\xc4\x81");
}
if (slot == 2) {
return EL_STR("a");
}
if (slot == 3) {
return EL_STR("\xc4\x81m\xc4\x81");
}
if (slot == 4) {
return EL_STR("\xc4\x81t\xc4\x81");
}
return EL_STR("\xc4\x81");
return 0;
}
el_val_t peo_ah_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("amiy");
}
if (slot == 1) {
return EL_STR("ahiy");
}
if (slot == 2) {
return EL_STR("astiy");
}
if (slot == 3) {
return EL_STR("amahy");
}
if (slot == 4) {
return EL_STR("ast\xc4\x81");
}
return EL_STR("hatiy");
return 0;
}
el_val_t peo_ah_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xc4\x81ham");
}
if (slot == 1) {
return EL_STR("\xc4\x81ha");
}
if (slot == 2) {
return EL_STR("\xc4\x81ha");
}
if (slot == 3) {
return EL_STR("\xc4\x81hama");
}
if (slot == 4) {
return EL_STR("\xc4\x81hata");
}
return EL_STR("\xc4\x81han");
return 0;
}
el_val_t peo_kar_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("kun\xc4\x81miy");
}
if (slot == 1) {
return EL_STR("kun\xc4\x81hiy");
}
if (slot == 2) {
return EL_STR("kunautiy");
}
if (slot == 3) {
return EL_STR("kun\xc4\x81mahy");
}
if (slot == 4) {
return EL_STR("kun\xc4\x81t\xc4\x81");
}
return EL_STR("kunavantiy");
return 0;
}
el_val_t peo_kar_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("akunavam");
}
if (slot == 1) {
return EL_STR("akunav\xc4\x81");
}
if (slot == 2) {
return EL_STR("akunava");
}
if (slot == 3) {
return EL_STR("akunav\xc4\x81m\xc4\x81");
}
if (slot == 4) {
return EL_STR("akunav\xc4\x81t\xc4\x81");
}
return EL_STR("akunavan");
return 0;
}
el_val_t peo_xsaya_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("x\xc5\xa1\xc4\x81y\xc4\x81miy");
}
if (slot == 1) {
return EL_STR("x\xc5\xa1\xc4\x81y\xc4\x81hiy");
}
if (slot == 2) {
return EL_STR("x\xc5\xa1\xc4\x81yatiy");
}
if (slot == 3) {
return EL_STR("x\xc5\xa1\xc4\x81y\xc4\x81mahy");
}
if (slot == 4) {
return EL_STR("x\xc5\xa1\xc4\x81y\xc4\x81t\xc4\x81");
}
return EL_STR("x\xc5\xa1\xc4\x81yantiy");
return 0;
}
el_val_t peo_tar_present(el_val_t slot) {
if (slot == 2) {
return EL_STR("taratiy");
}
if (slot == 5) {
return EL_STR("tarantiy");
}
return el_str_concat(EL_STR("tar"), peo_present_suffix(slot));
return 0;
}
el_val_t peo_da_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("d\xc4\x81miy");
}
if (slot == 1) {
return EL_STR("d\xc4\x81hiy");
}
if (slot == 2) {
return EL_STR("d\xc4\x81tiy");
}
if (slot == 3) {
return EL_STR("d\xc4\x81mahy");
}
if (slot == 4) {
return EL_STR("d\xc4\x81t\xc4\x81");
}
return EL_STR("dantiy");
return 0;
}
el_val_t peo_da_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("ad\xc4\x81m");
}
if (slot == 1) {
return EL_STR("ad\xc4\x81\xc4\x81");
}
if (slot == 2) {
return EL_STR("ad\xc4\x81");
}
if (slot == 3) {
return EL_STR("ad\xc4\x81m\xc4\x81");
}
if (slot == 4) {
return EL_STR("ad\xc4\x81t\xc4\x81");
}
return EL_STR("ad\xc4\x81n");
return 0;
}
el_val_t peo_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("ah");
}
if (str_eq(verb, EL_STR("do"))) {
return EL_STR("kar");
}
if (str_eq(verb, EL_STR("make"))) {
return EL_STR("kar");
}
if (str_eq(verb, EL_STR("rule"))) {
return EL_STR("x\xc5\xa1\xc4\x81ya");
}
if (str_eq(verb, EL_STR("cross"))) {
return EL_STR("tar");
}
if (str_eq(verb, EL_STR("give"))) {
return EL_STR("d\xc4\x81");
}
return verb;
return 0;
}
el_val_t peo_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = peo_map_canonical(verb);
el_val_t slot = peo_slot(person, number);
if (str_eq(v, EL_STR("ah"))) {
if (str_eq(tense, EL_STR("present"))) {
return peo_ah_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return peo_ah_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("kar"))) {
if (str_eq(tense, EL_STR("present"))) {
return peo_kar_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return peo_kar_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("x\xc5\xa1\xc4\x81ya"))) {
if (str_eq(tense, EL_STR("present"))) {
return peo_xsaya_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return el_str_concat(EL_STR("x\xc5\xa1\xc4\x81ya"), peo_past_suffix(slot));
}
return v;
}
if (str_eq(v, EL_STR("tar"))) {
if (str_eq(tense, EL_STR("present"))) {
return peo_tar_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return el_str_concat(EL_STR("tar"), peo_past_suffix(slot));
}
return v;
}
if (str_eq(v, EL_STR("d\xc4\x81"))) {
if (str_eq(tense, EL_STR("present"))) {
return peo_da_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return peo_da_past(slot);
}
return v;
}
if (str_eq(tense, EL_STR("present"))) {
return el_str_concat(v, peo_present_suffix(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return el_str_concat(v, peo_past_suffix(slot));
}
return v;
return 0;
}
el_val_t peo_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(noun, EL_STR("dahyu"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("dahy\xc4\x81u\xc5\xa1");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("dahyum");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("dahy\xc4\x81u\xc5\xa1");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("dahyav\xc4\x81");
}
return EL_STR("dahy\xc4\x81u\xc5\xa1");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("dahy\xc4\x81va");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("dahy\xc5\xabn");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("dahy\xc5\xabn\xc4\x81m");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("dahyubiy\xc4\x81");
}
return EL_STR("dahy\xc4\x81va");
}
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("\xc4\x81u\xc5\xa1"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("am"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("\xc4\x81u\xc5\xa1"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("av\xc4\x81"));
}
return el_str_concat(noun, EL_STR("\xc4\x81u\xc5\xa1"));
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("\xc4\x81va"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("\xc5\xabn"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("\xc5\xabn\xc4\x81m"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("ubiy\xc4\x81"));
}
return el_str_concat(noun, EL_STR("\xc4\x81va"));
return 0;
}
el_val_t peo_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
return peo_decline_astem(noun, gram_case, number);
return 0;
}
el_val_t peo_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
return peo_decline(noun, gram_case, number);
return 0;
}
-19
View File
@@ -1,19 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn peo_drop(s: String, n: Int) -> String
extern fn peo_ends(s: String, suf: String) -> Bool
extern fn peo_slot(person: String, number: String) -> Int
extern fn peo_present_suffix(slot: Int) -> String
extern fn peo_past_suffix(slot: Int) -> String
extern fn peo_ah_present(slot: Int) -> String
extern fn peo_ah_past(slot: Int) -> String
extern fn peo_kar_present(slot: Int) -> String
extern fn peo_kar_past(slot: Int) -> String
extern fn peo_xsaya_present(slot: Int) -> String
extern fn peo_tar_present(slot: Int) -> String
extern fn peo_da_present(slot: Int) -> String
extern fn peo_da_past(slot: Int) -> String
extern fn peo_map_canonical(verb: String) -> String
extern fn peo_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn peo_decline_astem(noun: String, gram_case: String, number: String) -> String
extern fn peo_decline(noun: String, gram_case: String, number: String) -> String
extern fn peo_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-774
View File
@@ -1,774 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t pi_str_ends(el_val_t s, el_val_t suf);
el_val_t pi_drop(el_val_t s, el_val_t n);
el_val_t pi_last_char(el_val_t s);
el_val_t pi_slot(el_val_t person, el_val_t number);
el_val_t pi_present_ending(el_val_t slot);
el_val_t pi_aorist_ending(el_val_t slot);
el_val_t pi_future_ending(el_val_t slot);
el_val_t pi_hoti_present(el_val_t slot);
el_val_t pi_atthi_present(el_val_t slot);
el_val_t pi_hoti_aorist(el_val_t slot);
el_val_t pi_hoti_future(el_val_t slot);
el_val_t pi_gacchati_present(el_val_t slot);
el_val_t pi_gacchati_aorist(el_val_t slot);
el_val_t pi_gacchati_future(el_val_t slot);
el_val_t pi_passati_present(el_val_t slot);
el_val_t pi_passati_aorist(el_val_t slot);
el_val_t pi_passati_future(el_val_t slot);
el_val_t pi_vadati_present(el_val_t slot);
el_val_t pi_vadati_aorist(el_val_t slot);
el_val_t pi_vadati_future(el_val_t slot);
el_val_t pi_karoti_present(el_val_t slot);
el_val_t pi_karoti_aorist(el_val_t slot);
el_val_t pi_karoti_future(el_val_t slot);
el_val_t pi_map_canonical(el_val_t verb);
el_val_t pi_regular_root(el_val_t verb);
el_val_t pi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t pi_decline_a_masc_sg(el_val_t stem, el_val_t gram_case);
el_val_t pi_decline_a_masc_pl(el_val_t stem, el_val_t gram_case);
el_val_t pi_decline_a_fem_sg(el_val_t stem, el_val_t gram_case);
el_val_t pi_decline_a_fem_pl(el_val_t stem, el_val_t gram_case);
el_val_t pi_detect_class(el_val_t noun);
el_val_t pi_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t pi_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t pi_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t pi_drop(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t pi_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t pi_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t pi_present_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("asi");
}
if (slot == 2) {
return EL_STR("ati");
}
if (slot == 3) {
return EL_STR("\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("atha");
}
return EL_STR("anti");
return 0;
}
el_val_t pi_aorist_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("i\xe1\xb9\x83");
}
if (slot == 1) {
return EL_STR("i");
}
if (slot == 2) {
return EL_STR("i");
}
if (slot == 3) {
return EL_STR("imh\xc4\x81");
}
if (slot == 4) {
return EL_STR("ittha");
}
return EL_STR("i\xe1\xb9\x83su");
return 0;
}
el_val_t pi_future_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("iss\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("issasi");
}
if (slot == 2) {
return EL_STR("issati");
}
if (slot == 3) {
return EL_STR("iss\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("issatha");
}
return EL_STR("issanti");
return 0;
}
el_val_t pi_hoti_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("homi");
}
if (slot == 1) {
return EL_STR("hosi");
}
if (slot == 2) {
return EL_STR("hoti");
}
if (slot == 3) {
return EL_STR("homa");
}
if (slot == 4) {
return EL_STR("hotha");
}
return EL_STR("honti");
return 0;
}
el_val_t pi_atthi_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("amhi");
}
if (slot == 1) {
return EL_STR("asi");
}
if (slot == 2) {
return EL_STR("atthi");
}
if (slot == 3) {
return EL_STR("amha");
}
if (slot == 4) {
return EL_STR("attha");
}
return EL_STR("santi");
return 0;
}
el_val_t pi_hoti_aorist(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xc4\x81si\xe1\xb9\x83");
}
if (slot == 1) {
return EL_STR("\xc4\x81si");
}
if (slot == 2) {
return EL_STR("\xc4\x81si");
}
if (slot == 3) {
return EL_STR("\xc4\x81simh\xc4\x81");
}
if (slot == 4) {
return EL_STR("\xc4\x81sittha");
}
return EL_STR("\xc4\x81si\xe1\xb9\x83su");
return 0;
}
el_val_t pi_hoti_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("hoss\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("hossasi");
}
if (slot == 2) {
return EL_STR("hossati");
}
if (slot == 3) {
return EL_STR("hoss\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("hossatha");
}
return EL_STR("hossanti");
return 0;
}
el_val_t pi_gacchati_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("gacch\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("gacchasi");
}
if (slot == 2) {
return EL_STR("gacchati");
}
if (slot == 3) {
return EL_STR("gacch\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("gacchatha");
}
return EL_STR("gacchanti");
return 0;
}
el_val_t pi_gacchati_aorist(el_val_t slot) {
if (slot == 0) {
return EL_STR("agam\xc4\x81si\xe1\xb9\x83");
}
if (slot == 1) {
return EL_STR("agam\xc4\x81si");
}
if (slot == 2) {
return EL_STR("agam\xc4\x81si");
}
if (slot == 3) {
return EL_STR("agam\xc4\x81simh\xc4\x81");
}
if (slot == 4) {
return EL_STR("agam\xc4\x81sittha");
}
return EL_STR("agama\xe1\xb9\x83su");
return 0;
}
el_val_t pi_gacchati_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("gamiss\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("gamissasi");
}
if (slot == 2) {
return EL_STR("gamissati");
}
if (slot == 3) {
return EL_STR("gamiss\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("gamissatha");
}
return EL_STR("gamissanti");
return 0;
}
el_val_t pi_passati_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("pass\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("passasi");
}
if (slot == 2) {
return EL_STR("passati");
}
if (slot == 3) {
return EL_STR("pass\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("passatha");
}
return EL_STR("passanti");
return 0;
}
el_val_t pi_passati_aorist(el_val_t slot) {
if (slot == 0) {
return EL_STR("addas\xc4\x81si\xe1\xb9\x83");
}
if (slot == 1) {
return EL_STR("addas\xc4\x81si");
}
if (slot == 2) {
return EL_STR("addas\xc4\x81si");
}
if (slot == 3) {
return EL_STR("addas\xc4\x81simh\xc4\x81");
}
if (slot == 4) {
return EL_STR("addas\xc4\x81sittha");
}
return EL_STR("addas\xc4\x81si\xe1\xb9\x83su");
return 0;
}
el_val_t pi_passati_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("dakkhiss\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("dakkhissasi");
}
if (slot == 2) {
return EL_STR("dakkhissati");
}
if (slot == 3) {
return EL_STR("dakkhiss\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("dakkhissatha");
}
return EL_STR("dakkhissanti");
return 0;
}
el_val_t pi_vadati_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("vad\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("vadasi");
}
if (slot == 2) {
return EL_STR("vadati");
}
if (slot == 3) {
return EL_STR("vad\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("vadatha");
}
return EL_STR("vadanti");
return 0;
}
el_val_t pi_vadati_aorist(el_val_t slot) {
if (slot == 0) {
return EL_STR("avad\xc4\x81si\xe1\xb9\x83");
}
if (slot == 1) {
return EL_STR("avad\xc4\x81si");
}
if (slot == 2) {
return EL_STR("avad\xc4\x81si");
}
if (slot == 3) {
return EL_STR("avad\xc4\x81simh\xc4\x81");
}
if (slot == 4) {
return EL_STR("avad\xc4\x81sittha");
}
return EL_STR("avad\xc4\x81si\xe1\xb9\x83su");
return 0;
}
el_val_t pi_vadati_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("vadiss\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("vadissasi");
}
if (slot == 2) {
return EL_STR("vadissati");
}
if (slot == 3) {
return EL_STR("vadiss\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("vadissatha");
}
return EL_STR("vadissanti");
return 0;
}
el_val_t pi_karoti_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("karomi");
}
if (slot == 1) {
return EL_STR("karosi");
}
if (slot == 2) {
return EL_STR("karoti");
}
if (slot == 3) {
return EL_STR("karoma");
}
if (slot == 4) {
return EL_STR("karotha");
}
return EL_STR("karonti");
return 0;
}
el_val_t pi_karoti_aorist(el_val_t slot) {
if (slot == 0) {
return EL_STR("ak\xc4\x81si\xe1\xb9\x83");
}
if (slot == 1) {
return EL_STR("ak\xc4\x81si");
}
if (slot == 2) {
return EL_STR("ak\xc4\x81si");
}
if (slot == 3) {
return EL_STR("ak\xc4\x81simh\xc4\x81");
}
if (slot == 4) {
return EL_STR("ak\xc4\x81sittha");
}
return EL_STR("ak\xc4\x81si\xe1\xb9\x83su");
return 0;
}
el_val_t pi_karoti_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("kariss\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("karissasi");
}
if (slot == 2) {
return EL_STR("karissati");
}
if (slot == 3) {
return EL_STR("kariss\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("karissatha");
}
return EL_STR("karissanti");
return 0;
}
el_val_t pi_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("hoti");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("gacchati");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("passati");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("vadati");
}
if (str_eq(verb, EL_STR("do"))) {
return EL_STR("karoti");
}
if (str_eq(verb, EL_STR("make"))) {
return EL_STR("karoti");
}
return verb;
return 0;
}
el_val_t pi_regular_root(el_val_t verb) {
if (pi_str_ends(verb, EL_STR("ati"))) {
return pi_drop(verb, 3);
}
if (pi_str_ends(verb, EL_STR("eti"))) {
return pi_drop(verb, 3);
}
return verb;
return 0;
}
el_val_t pi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = pi_map_canonical(verb);
el_val_t slot = pi_slot(person, number);
if (str_eq(v, EL_STR("hoti"))) {
if (str_eq(tense, EL_STR("present"))) {
return pi_hoti_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return pi_hoti_aorist(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return pi_hoti_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("atthi"))) {
if (str_eq(tense, EL_STR("present"))) {
return pi_atthi_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return pi_hoti_aorist(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return pi_hoti_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("gacchati"))) {
if (str_eq(tense, EL_STR("present"))) {
return pi_gacchati_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return pi_gacchati_aorist(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return pi_gacchati_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("passati"))) {
if (str_eq(tense, EL_STR("present"))) {
return pi_passati_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return pi_passati_aorist(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return pi_passati_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("vadati"))) {
if (str_eq(tense, EL_STR("present"))) {
return pi_vadati_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return pi_vadati_aorist(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return pi_vadati_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("karoti"))) {
if (str_eq(tense, EL_STR("present"))) {
return pi_karoti_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return pi_karoti_aorist(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return pi_karoti_future(slot);
}
return v;
}
el_val_t root = pi_regular_root(v);
if (str_eq(tense, EL_STR("present"))) {
return el_str_concat(root, pi_present_ending(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return el_str_concat(root, pi_aorist_ending(slot));
}
if (str_eq(tense, EL_STR("future"))) {
return el_str_concat(root, pi_future_ending(slot));
}
return v;
return 0;
}
el_val_t pi_decline_a_masc_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("o"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("\xe1\xb9\x83"));
}
if (str_eq(gram_case, EL_STR("instrumental"))) {
return el_str_concat(stem, EL_STR("ena"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81ya"));
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("ssa"));
}
if (str_eq(gram_case, EL_STR("locative"))) {
return el_str_concat(stem, EL_STR("smi\xe1\xb9\x83"));
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return stem;
}
return el_str_concat(stem, EL_STR("o"));
return 0;
}
el_val_t pi_decline_a_masc_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("e"));
}
if (str_eq(gram_case, EL_STR("instrumental"))) {
return el_str_concat(stem, EL_STR("ehi"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81na\xe1\xb9\x83"));
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81na\xe1\xb9\x83"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("\xc4\x81na\xe1\xb9\x83"));
}
if (str_eq(gram_case, EL_STR("locative"))) {
return el_str_concat(stem, EL_STR("esu"));
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81"));
}
return el_str_concat(stem, EL_STR("\xc4\x81"));
return 0;
}
el_val_t pi_decline_a_fem_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("a\xe1\xb9\x83"));
}
if (str_eq(gram_case, EL_STR("instrumental"))) {
return el_str_concat(stem, EL_STR("\xc4\x81ya"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81ya"));
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81ya"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("\xc4\x81ya"));
}
if (str_eq(gram_case, EL_STR("locative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81ya\xe1\xb9\x83"));
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return el_str_concat(stem, EL_STR("e"));
}
return el_str_concat(stem, EL_STR("\xc4\x81"));
return 0;
}
el_val_t pi_decline_a_fem_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81"));
}
if (str_eq(gram_case, EL_STR("instrumental"))) {
return el_str_concat(stem, EL_STR("\xc4\x81hi"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81na\xe1\xb9\x83"));
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81na\xe1\xb9\x83"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("\xc4\x81na\xe1\xb9\x83"));
}
if (str_eq(gram_case, EL_STR("locative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81su"));
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81"));
}
return el_str_concat(stem, EL_STR("\xc4\x81"));
return 0;
}
el_val_t pi_detect_class(el_val_t noun) {
if (pi_str_ends(noun, EL_STR("o"))) {
return EL_STR("a_masc");
}
if (pi_str_ends(noun, EL_STR("\xc4\x81"))) {
return EL_STR("a_fem");
}
if (pi_str_ends(noun, EL_STR("a"))) {
return EL_STR("a_masc");
}
return EL_STR("a_masc");
return 0;
}
el_val_t pi_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t nclass = pi_detect_class(noun);
if (str_eq(nclass, EL_STR("a_masc"))) {
el_val_t stem = noun;
if (pi_str_ends(noun, EL_STR("o"))) {
stem = pi_drop(noun, 1);
}
if (pi_str_ends(noun, EL_STR("a"))) {
stem = pi_drop(noun, 1);
}
if (str_eq(number, EL_STR("singular"))) {
return pi_decline_a_masc_sg(stem, gram_case);
}
return pi_decline_a_masc_pl(stem, gram_case);
}
if (str_eq(nclass, EL_STR("a_fem"))) {
el_val_t stem = noun;
if (pi_str_ends(noun, EL_STR("\xc4\x81"))) {
stem = pi_drop(noun, 1);
}
if (str_eq(number, EL_STR("singular"))) {
return pi_decline_a_fem_sg(stem, gram_case);
}
return pi_decline_a_fem_pl(stem, gram_case);
}
return noun;
return 0;
}
el_val_t pi_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
return pi_decline(noun, gram_case, number);
return 0;
}
-34
View File
@@ -1,34 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn pi_str_ends(s: String, suf: String) -> Bool
extern fn pi_drop(s: String, n: Int) -> String
extern fn pi_last_char(s: String) -> String
extern fn pi_slot(person: String, number: String) -> Int
extern fn pi_present_ending(slot: Int) -> String
extern fn pi_aorist_ending(slot: Int) -> String
extern fn pi_future_ending(slot: Int) -> String
extern fn pi_hoti_present(slot: Int) -> String
extern fn pi_atthi_present(slot: Int) -> String
extern fn pi_hoti_aorist(slot: Int) -> String
extern fn pi_hoti_future(slot: Int) -> String
extern fn pi_gacchati_present(slot: Int) -> String
extern fn pi_gacchati_aorist(slot: Int) -> String
extern fn pi_gacchati_future(slot: Int) -> String
extern fn pi_passati_present(slot: Int) -> String
extern fn pi_passati_aorist(slot: Int) -> String
extern fn pi_passati_future(slot: Int) -> String
extern fn pi_vadati_present(slot: Int) -> String
extern fn pi_vadati_aorist(slot: Int) -> String
extern fn pi_vadati_future(slot: Int) -> String
extern fn pi_karoti_present(slot: Int) -> String
extern fn pi_karoti_aorist(slot: Int) -> String
extern fn pi_karoti_future(slot: Int) -> String
extern fn pi_map_canonical(verb: String) -> String
extern fn pi_regular_root(verb: String) -> String
extern fn pi_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn pi_decline_a_masc_sg(stem: String, gram_case: String) -> String
extern fn pi_decline_a_masc_pl(stem: String, gram_case: String) -> String
extern fn pi_decline_a_fem_sg(stem: String, gram_case: String) -> String
extern fn pi_decline_a_fem_pl(stem: String, gram_case: String) -> String
extern fn pi_detect_class(noun: String) -> String
extern fn pi_decline(noun: String, gram_case: String, number: String) -> String
extern fn pi_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-1245
View File
File diff suppressed because it is too large Load Diff
-14
View File
@@ -1,14 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn ru_gender(noun: String) -> String
extern fn ru_stem_type(noun: String, gender: String) -> String
extern fn ru_noun_case(noun: String, gender: String, gram_case: String, number: String) -> String
extern fn ru_decline_regular(noun: String, gender: String, stype: String, gram_case: String, number: String) -> String
extern fn ru_decline_masc(noun: String, stype: String, gram_case: String, number: String) -> String
extern fn ru_decline_fem(noun: String, stype: String, gram_case: String, number: String) -> String
extern fn ru_decline_neut(noun: String, stype: String, gram_case: String, number: String) -> String
extern fn ru_past_agree(verb_stem: String, gender: String, number: String) -> String
extern fn ru_conjugate_1st(stem: String, tense: String, person: String, number: String) -> String
extern fn ru_conjugate_2nd(stem: String, tense: String, person: String, number: String) -> String
extern fn ru_irregular(verb: String, tense: String, person: String, number: String) -> String
extern fn ru_past_stem(verb: String) -> String
extern fn ru_conjugate(verb: String, tense: String, person: String, number: String, gender: String) -> String
-815
View File
@@ -1,815 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t sa_str_ends(el_val_t s, el_val_t suf);
el_val_t sa_str_drop_last(el_val_t s, el_val_t n);
el_val_t sa_slot(el_val_t person, el_val_t number);
el_val_t sa_map_canonical(el_val_t verb);
el_val_t sa_as_present(el_val_t slot);
el_val_t sa_as_past(el_val_t slot);
el_val_t sa_as_future(el_val_t slot);
el_val_t sa_bhu_present(el_val_t slot);
el_val_t sa_bhu_past(el_val_t slot);
el_val_t sa_bhu_future(el_val_t slot);
el_val_t sa_gam_present(el_val_t slot);
el_val_t sa_gam_past(el_val_t slot);
el_val_t sa_gam_future(el_val_t slot);
el_val_t sa_drs_present(el_val_t slot);
el_val_t sa_drs_past(el_val_t slot);
el_val_t sa_drs_future(el_val_t slot);
el_val_t sa_vad_present(el_val_t slot);
el_val_t sa_vad_past(el_val_t slot);
el_val_t sa_vad_future(el_val_t slot);
el_val_t sa_kr_present(el_val_t slot);
el_val_t sa_kr_past(el_val_t slot);
el_val_t sa_kr_future(el_val_t slot);
el_val_t sa_class1_present_ending(el_val_t slot);
el_val_t sa_class1_past_ending(el_val_t slot);
el_val_t sa_class1_future_ending(el_val_t slot);
el_val_t sa_class1_conjugate(el_val_t stem, el_val_t tense, el_val_t slot);
el_val_t sa_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t sa_decline_a_stem_sg(el_val_t stem, el_val_t gram_case);
el_val_t sa_decline_a_stem_pl(el_val_t stem, el_val_t gram_case);
el_val_t sa_decline_aa_stem_sg(el_val_t stem, el_val_t gram_case);
el_val_t sa_decline_aa_stem_pl(el_val_t stem, el_val_t gram_case);
el_val_t sa_stem_type(el_val_t noun);
el_val_t sa_extract_stem(el_val_t noun, el_val_t stype);
el_val_t sa_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t sa_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t sa_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t sa_str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t sa_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t sa_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("as");
}
if (str_eq(verb, EL_STR("become"))) {
return EL_STR("bhu");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("gam");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("drs");
}
if (str_eq(verb, EL_STR("speak"))) {
return EL_STR("vad");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("vad");
}
if (str_eq(verb, EL_STR("do"))) {
return EL_STR("kr");
}
if (str_eq(verb, EL_STR("make"))) {
return EL_STR("kr");
}
return verb;
return 0;
}
el_val_t sa_as_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("asmi");
}
if (slot == 1) {
return EL_STR("asi");
}
if (slot == 2) {
return EL_STR("asti");
}
if (slot == 3) {
return EL_STR("sma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("stha");
}
return EL_STR("santi");
return 0;
}
el_val_t sa_as_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xc4\x81sam");
}
if (slot == 1) {
return EL_STR("\xc4\x81s\xc4\xab\xe1\xb8\xa5");
}
if (slot == 2) {
return EL_STR("\xc4\x81s\xc4\xabt");
}
if (slot == 3) {
return EL_STR("\xc4\x81sma");
}
if (slot == 4) {
return EL_STR("\xc4\x81sta");
}
return EL_STR("\xc4\x81san");
return 0;
}
el_val_t sa_as_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("bhavi\xe1\xb9\xa3y\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("bhavi\xe1\xb9\xa3yasi");
}
if (slot == 2) {
return EL_STR("bhavi\xe1\xb9\xa3yati");
}
if (slot == 3) {
return EL_STR("bhavi\xe1\xb9\xa3y\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("bhavi\xe1\xb9\xa3yatha");
}
return EL_STR("bhavi\xe1\xb9\xa3yanti");
return 0;
}
el_val_t sa_bhu_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("bhav\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("bhavasi");
}
if (slot == 2) {
return EL_STR("bhavati");
}
if (slot == 3) {
return EL_STR("bhav\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("bhavatha");
}
return EL_STR("bhavanti");
return 0;
}
el_val_t sa_bhu_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("abhavam");
}
if (slot == 1) {
return EL_STR("abhava\xe1\xb8\xa5");
}
if (slot == 2) {
return EL_STR("abhavat");
}
if (slot == 3) {
return EL_STR("abhav\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("abhavata");
}
return EL_STR("abhavan");
return 0;
}
el_val_t sa_bhu_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("bhavi\xe1\xb9\xa3y\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("bhavi\xe1\xb9\xa3yasi");
}
if (slot == 2) {
return EL_STR("bhavi\xe1\xb9\xa3yati");
}
if (slot == 3) {
return EL_STR("bhavi\xe1\xb9\xa3y\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("bhavi\xe1\xb9\xa3yatha");
}
return EL_STR("bhavi\xe1\xb9\xa3yanti");
return 0;
}
el_val_t sa_gam_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("gacch\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("gacchasi");
}
if (slot == 2) {
return EL_STR("gacchati");
}
if (slot == 3) {
return EL_STR("gacch\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("gacchatha");
}
return EL_STR("gacchanti");
return 0;
}
el_val_t sa_gam_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("agaccham");
}
if (slot == 1) {
return EL_STR("agaccha\xe1\xb8\xa5");
}
if (slot == 2) {
return EL_STR("agacchat");
}
if (slot == 3) {
return EL_STR("agacch\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("agacchata");
}
return EL_STR("agacchan");
return 0;
}
el_val_t sa_gam_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("gami\xe1\xb9\xa3y\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("gami\xe1\xb9\xa3yasi");
}
if (slot == 2) {
return EL_STR("gami\xe1\xb9\xa3yati");
}
if (slot == 3) {
return EL_STR("gami\xe1\xb9\xa3y\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("gami\xe1\xb9\xa3yatha");
}
return EL_STR("gami\xe1\xb9\xa3yanti");
return 0;
}
el_val_t sa_drs_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("pa\xc5\x9by\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("pa\xc5\x9byasi");
}
if (slot == 2) {
return EL_STR("pa\xc5\x9byati");
}
if (slot == 3) {
return EL_STR("pa\xc5\x9by\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("pa\xc5\x9byatha");
}
return EL_STR("pa\xc5\x9byanti");
return 0;
}
el_val_t sa_drs_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("apa\xc5\x9byam");
}
if (slot == 1) {
return EL_STR("apa\xc5\x9bya\xe1\xb8\xa5");
}
if (slot == 2) {
return EL_STR("apa\xc5\x9byat");
}
if (slot == 3) {
return EL_STR("apa\xc5\x9by\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("apa\xc5\x9byata");
}
return EL_STR("apa\xc5\x9byan");
return 0;
}
el_val_t sa_drs_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("drak\xe1\xb9\xa3y\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("drak\xe1\xb9\xa3yasi");
}
if (slot == 2) {
return EL_STR("drak\xe1\xb9\xa3yati");
}
if (slot == 3) {
return EL_STR("drak\xe1\xb9\xa3y\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("drak\xe1\xb9\xa3yatha");
}
return EL_STR("drak\xe1\xb9\xa3yanti");
return 0;
}
el_val_t sa_vad_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("vad\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("vadasi");
}
if (slot == 2) {
return EL_STR("vadati");
}
if (slot == 3) {
return EL_STR("vad\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("vadatha");
}
return EL_STR("vadanti");
return 0;
}
el_val_t sa_vad_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("avadam");
}
if (slot == 1) {
return EL_STR("avada\xe1\xb8\xa5");
}
if (slot == 2) {
return EL_STR("avadat");
}
if (slot == 3) {
return EL_STR("avad\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("avadata");
}
return EL_STR("avadan");
return 0;
}
el_val_t sa_vad_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("vadi\xe1\xb9\xa3y\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("vadi\xe1\xb9\xa3yasi");
}
if (slot == 2) {
return EL_STR("vadi\xe1\xb9\xa3yati");
}
if (slot == 3) {
return EL_STR("vadi\xe1\xb9\xa3y\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("vadi\xe1\xb9\xa3yatha");
}
return EL_STR("vadi\xe1\xb9\xa3yanti");
return 0;
}
el_val_t sa_kr_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("karomi");
}
if (slot == 1) {
return EL_STR("karo\xe1\xb9\xa3i");
}
if (slot == 2) {
return EL_STR("karoti");
}
if (slot == 3) {
return EL_STR("kurma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("kurutha");
}
return EL_STR("kurvanti");
return 0;
}
el_val_t sa_kr_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("akaravam");
}
if (slot == 1) {
return EL_STR("akaroda\xe1\xb8\xa5");
}
if (slot == 2) {
return EL_STR("akarot");
}
if (slot == 3) {
return EL_STR("akurma");
}
if (slot == 4) {
return EL_STR("akuruta");
}
return EL_STR("akurvan");
return 0;
}
el_val_t sa_kr_future(el_val_t slot) {
if (slot == 0) {
return EL_STR("kari\xe1\xb9\xa3y\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("kari\xe1\xb9\xa3yasi");
}
if (slot == 2) {
return EL_STR("kari\xe1\xb9\xa3yati");
}
if (slot == 3) {
return EL_STR("kari\xe1\xb9\xa3y\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("kari\xe1\xb9\xa3yatha");
}
return EL_STR("kari\xe1\xb9\xa3yanti");
return 0;
}
el_val_t sa_class1_present_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("asi");
}
if (slot == 2) {
return EL_STR("ati");
}
if (slot == 3) {
return EL_STR("\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("atha");
}
return EL_STR("anti");
return 0;
}
el_val_t sa_class1_past_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("am");
}
if (slot == 1) {
return EL_STR("a\xe1\xb8\xa5");
}
if (slot == 2) {
return EL_STR("at");
}
if (slot == 3) {
return EL_STR("\xc4\x81ma");
}
if (slot == 4) {
return EL_STR("ata");
}
return EL_STR("an");
return 0;
}
el_val_t sa_class1_future_ending(el_val_t slot) {
if (slot == 0) {
return EL_STR("i\xe1\xb9\xa3y\xc4\x81mi");
}
if (slot == 1) {
return EL_STR("i\xe1\xb9\xa3yasi");
}
if (slot == 2) {
return EL_STR("i\xe1\xb9\xa3yati");
}
if (slot == 3) {
return EL_STR("i\xe1\xb9\xa3y\xc4\x81ma\xe1\xb8\xa5");
}
if (slot == 4) {
return EL_STR("i\xe1\xb9\xa3yatha");
}
return EL_STR("i\xe1\xb9\xa3yanti");
return 0;
}
el_val_t sa_class1_conjugate(el_val_t stem, el_val_t tense, el_val_t slot) {
if (str_eq(tense, EL_STR("present"))) {
return el_str_concat(stem, sa_class1_present_ending(slot));
}
if (str_eq(tense, EL_STR("past"))) {
return el_str_concat(el_str_concat(EL_STR("a"), stem), sa_class1_past_ending(slot));
}
if (str_eq(tense, EL_STR("future"))) {
return el_str_concat(stem, sa_class1_future_ending(slot));
}
return stem;
return 0;
}
el_val_t sa_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = sa_map_canonical(verb);
el_val_t slot = sa_slot(person, number);
if (str_eq(v, EL_STR("as"))) {
if (str_eq(tense, EL_STR("present"))) {
return sa_as_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sa_as_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return sa_as_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("bhu"))) {
if (str_eq(tense, EL_STR("present"))) {
return sa_bhu_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sa_bhu_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return sa_bhu_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("gam"))) {
if (str_eq(tense, EL_STR("present"))) {
return sa_gam_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sa_gam_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return sa_gam_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("drs"))) {
if (str_eq(tense, EL_STR("present"))) {
return sa_drs_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sa_drs_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return sa_drs_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("vad"))) {
if (str_eq(tense, EL_STR("present"))) {
return sa_vad_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sa_vad_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return sa_vad_future(slot);
}
return v;
}
if (str_eq(v, EL_STR("kr"))) {
if (str_eq(tense, EL_STR("present"))) {
return sa_kr_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sa_kr_past(slot);
}
if (str_eq(tense, EL_STR("future"))) {
return sa_kr_future(slot);
}
return v;
}
return sa_class1_conjugate(v, tense, slot);
return 0;
}
el_val_t sa_decline_a_stem_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("m"));
}
if (str_eq(gram_case, EL_STR("instrumental"))) {
return el_str_concat(stem, EL_STR("ena"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81ya"));
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81t"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("sya"));
}
if (str_eq(gram_case, EL_STR("locative"))) {
return el_str_concat(stem, EL_STR("e"));
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return stem;
}
return stem;
return 0;
}
el_val_t sa_decline_a_stem_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81n"));
}
if (str_eq(gram_case, EL_STR("instrumental"))) {
return el_str_concat(stem, EL_STR("ai\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("ebhya\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return el_str_concat(stem, EL_STR("ebhya\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("\xc4\x81n\xc4\x81m"));
}
if (str_eq(gram_case, EL_STR("locative"))) {
return el_str_concat(stem, EL_STR("e\xe1\xb9\xa3u"));
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return el_str_concat(stem, EL_STR("\xc4\x81\xe1\xb8\xa5"));
}
return el_str_concat(stem, EL_STR("\xc4\x81\xe1\xb8\xa5"));
return 0;
}
el_val_t sa_decline_aa_stem_sg(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("\xc4\xab"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("\xc4\xabm"));
}
if (str_eq(gram_case, EL_STR("instrumental"))) {
return el_str_concat(stem, EL_STR("y\xc4\x81"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("yai"));
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return el_str_concat(stem, EL_STR("y\xc4\x81\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("y\xc4\x81\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("locative"))) {
return el_str_concat(stem, EL_STR("y\xc4\x81m"));
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return el_str_concat(stem, EL_STR("i"));
}
return el_str_concat(stem, EL_STR("\xc4\xab"));
return 0;
}
el_val_t sa_decline_aa_stem_pl(el_val_t stem, el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(stem, EL_STR("ya\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(stem, EL_STR("\xc4\xab\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("instrumental"))) {
return el_str_concat(stem, EL_STR("\xc4\xab""bhi\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(stem, EL_STR("\xc4\xab""bhya\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return el_str_concat(stem, EL_STR("\xc4\xab""bhya\xe1\xb8\xa5"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(stem, EL_STR("\xc4\xab\xe1\xb9\x87\xc4\x81m"));
}
if (str_eq(gram_case, EL_STR("locative"))) {
return el_str_concat(stem, EL_STR("\xc4\xab\xe1\xb9\xa3u"));
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return el_str_concat(stem, EL_STR("ya\xe1\xb8\xa5"));
}
return el_str_concat(stem, EL_STR("ya\xe1\xb8\xa5"));
return 0;
}
el_val_t sa_stem_type(el_val_t noun) {
if (sa_str_ends(noun, EL_STR("\xc4\x81"))) {
return EL_STR("aa");
}
if (sa_str_ends(noun, EL_STR("\xc4\xab"))) {
return EL_STR("aa");
}
if (sa_str_ends(noun, EL_STR("a\xe1\xb8\xa5"))) {
return EL_STR("a");
}
if (sa_str_ends(noun, EL_STR("a"))) {
return EL_STR("a");
}
return EL_STR("unknown");
return 0;
}
el_val_t sa_extract_stem(el_val_t noun, el_val_t stype) {
el_val_t n = str_len(noun);
if (str_eq(stype, EL_STR("a"))) {
if (sa_str_ends(noun, EL_STR("a\xe1\xb8\xa5"))) {
return str_slice(noun, 0, (n - 4));
}
return str_slice(noun, 0, (n - 1));
}
if (str_eq(stype, EL_STR("aa"))) {
return str_slice(noun, 0, (n - 2));
}
return noun;
return 0;
}
el_val_t sa_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t stype = sa_stem_type(noun);
if (str_eq(stype, EL_STR("a"))) {
el_val_t stem = sa_extract_stem(noun, EL_STR("a"));
if (str_eq(number, EL_STR("singular"))) {
return sa_decline_a_stem_sg(stem, gram_case);
}
return sa_decline_a_stem_pl(stem, gram_case);
}
if (str_eq(stype, EL_STR("aa"))) {
el_val_t stem = sa_extract_stem(noun, EL_STR("aa"));
if (str_eq(number, EL_STR("singular"))) {
return sa_decline_aa_stem_sg(stem, gram_case);
}
return sa_decline_aa_stem_pl(stem, gram_case);
}
return noun;
return 0;
}
el_val_t sa_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
return sa_decline(noun, gram_case, number);
return 0;
}
-36
View File
@@ -1,36 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn sa_str_ends(s: String, suf: String) -> Bool
extern fn sa_str_drop_last(s: String, n: Int) -> String
extern fn sa_slot(person: String, number: String) -> Int
extern fn sa_map_canonical(verb: String) -> String
extern fn sa_as_present(slot: Int) -> String
extern fn sa_as_past(slot: Int) -> String
extern fn sa_as_future(slot: Int) -> String
extern fn sa_bhu_present(slot: Int) -> String
extern fn sa_bhu_past(slot: Int) -> String
extern fn sa_bhu_future(slot: Int) -> String
extern fn sa_gam_present(slot: Int) -> String
extern fn sa_gam_past(slot: Int) -> String
extern fn sa_gam_future(slot: Int) -> String
extern fn sa_drs_present(slot: Int) -> String
extern fn sa_drs_past(slot: Int) -> String
extern fn sa_drs_future(slot: Int) -> String
extern fn sa_vad_present(slot: Int) -> String
extern fn sa_vad_past(slot: Int) -> String
extern fn sa_vad_future(slot: Int) -> String
extern fn sa_kr_present(slot: Int) -> String
extern fn sa_kr_past(slot: Int) -> String
extern fn sa_kr_future(slot: Int) -> String
extern fn sa_class1_present_ending(slot: Int) -> String
extern fn sa_class1_past_ending(slot: Int) -> String
extern fn sa_class1_future_ending(slot: Int) -> String
extern fn sa_class1_conjugate(stem: String, tense: String, slot: Int) -> String
extern fn sa_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn sa_decline_a_stem_sg(stem: String, gram_case: String) -> String
extern fn sa_decline_a_stem_pl(stem: String, gram_case: String) -> String
extern fn sa_decline_aa_stem_sg(stem: String, gram_case: String) -> String
extern fn sa_decline_aa_stem_pl(stem: String, gram_case: String) -> String
extern fn sa_stem_type(noun: String) -> String
extern fn sa_extract_stem(noun: String, stype: String) -> String
extern fn sa_decline(noun: String, gram_case: String, number: String) -> String
extern fn sa_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-571
View File
@@ -1,571 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t sga_drop(el_val_t s, el_val_t n);
el_val_t sga_first(el_val_t s);
el_val_t sga_rest(el_val_t s);
el_val_t sga_slot(el_val_t person, el_val_t number);
el_val_t sga_lenite(el_val_t word);
el_val_t sga_copula_present(el_val_t slot);
el_val_t sga_bith_present(el_val_t slot);
el_val_t sga_bith_past(el_val_t slot);
el_val_t sga_teit_present(el_val_t slot);
el_val_t sga_teit_past(el_val_t slot);
el_val_t sga_gaibid_present(el_val_t slot);
el_val_t sga_adci_present(el_val_t slot);
el_val_t sga_asbeir_present(el_val_t slot);
el_val_t sga_map_canonical(el_val_t verb);
el_val_t sga_ai_present(el_val_t stem, el_val_t slot);
el_val_t sga_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t sga_decline_ostem(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t sga_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t sga_detect_gender(el_val_t noun);
el_val_t sga_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t sga_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t sga_drop(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t sga_first(el_val_t s) {
if (str_len(s) == 0) {
return EL_STR("");
}
return str_slice(s, 0, 1);
return 0;
}
el_val_t sga_rest(el_val_t s) {
el_val_t n = str_len(s);
if (n <= 1) {
return EL_STR("");
}
return str_slice(s, 1, n);
return 0;
}
el_val_t sga_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t sga_lenite(el_val_t word) {
el_val_t init = sga_first(word);
el_val_t tail = sga_rest(word);
if (str_eq(init, EL_STR("b"))) {
return el_str_concat(EL_STR("bh"), tail);
}
if (str_eq(init, EL_STR("c"))) {
return el_str_concat(EL_STR("ch"), tail);
}
if (str_eq(init, EL_STR("d"))) {
return el_str_concat(EL_STR("dh"), tail);
}
if (str_eq(init, EL_STR("f"))) {
return el_str_concat(EL_STR("fh"), tail);
}
if (str_eq(init, EL_STR("g"))) {
return el_str_concat(EL_STR("gh"), tail);
}
if (str_eq(init, EL_STR("m"))) {
return el_str_concat(EL_STR("mh"), tail);
}
if (str_eq(init, EL_STR("p"))) {
return el_str_concat(EL_STR("ph"), tail);
}
if (str_eq(init, EL_STR("s"))) {
return el_str_concat(EL_STR("sh"), tail);
}
if (str_eq(init, EL_STR("t"))) {
return el_str_concat(EL_STR("th"), tail);
}
return word;
return 0;
}
el_val_t sga_copula_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("am");
}
if (slot == 1) {
return EL_STR("at");
}
if (slot == 2) {
return EL_STR("is");
}
if (slot == 3) {
return EL_STR("am");
}
if (slot == 4) {
return EL_STR("adib");
}
return EL_STR("it");
return 0;
}
el_val_t sga_bith_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("am");
}
if (slot == 1) {
return EL_STR("at");
}
if (slot == 2) {
return EL_STR("is");
}
if (slot == 3) {
return EL_STR("am");
}
if (slot == 4) {
return EL_STR("adib");
}
return EL_STR("at");
return 0;
}
el_val_t sga_bith_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("ba");
}
if (slot == 1) {
return EL_STR("ba");
}
if (slot == 2) {
return EL_STR("ba");
}
if (slot == 3) {
return EL_STR("b\xc3\xa1mmar");
}
if (slot == 4) {
return EL_STR("b\xc3\xa1""daid");
}
return EL_STR("batar");
return 0;
}
el_val_t sga_teit_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("t\xc3\xad""agu");
}
if (slot == 1) {
return EL_STR("t\xc3\xa9it");
}
if (slot == 2) {
return EL_STR("t\xc3\xa9it");
}
if (slot == 3) {
return EL_STR("t\xc3\xad""agmai");
}
if (slot == 4) {
return EL_STR("t\xc3\xad""agid");
}
return EL_STR("t\xc3\xad""agat");
return 0;
}
el_val_t sga_teit_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("lod");
}
if (slot == 1) {
return EL_STR("lod");
}
if (slot == 2) {
return EL_STR("luid");
}
if (slot == 3) {
return EL_STR("lodmar");
}
if (slot == 4) {
return EL_STR("lodaid");
}
return EL_STR("lotar");
return 0;
}
el_val_t sga_gaibid_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("gaibim");
}
if (slot == 1) {
return EL_STR("gaibi");
}
if (slot == 2) {
return EL_STR("gaibid");
}
if (slot == 3) {
return EL_STR("gaibmi");
}
if (slot == 4) {
return EL_STR("gaibthe");
}
return EL_STR("gaibid");
return 0;
}
el_val_t sga_adci_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("ad\xc2\xb7""ciu");
}
if (slot == 1) {
return EL_STR("ad\xc2\xb7""c\xc3\xad");
}
if (slot == 2) {
return EL_STR("ad\xc2\xb7""c\xc3\xad");
}
if (slot == 3) {
return EL_STR("ad\xc2\xb7""c\xc3\xadmi");
}
if (slot == 4) {
return EL_STR("ad\xc2\xb7""c\xc3\xadthe");
}
return EL_STR("ad\xc2\xb7""ciat");
return 0;
}
el_val_t sga_asbeir_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("as\xc2\xb7""biur");
}
if (slot == 1) {
return EL_STR("as\xc2\xb7""beir");
}
if (slot == 2) {
return EL_STR("as\xc2\xb7""beir");
}
if (slot == 3) {
return EL_STR("as\xc2\xb7""beram");
}
if (slot == 4) {
return EL_STR("as\xc2\xb7""berid");
}
return EL_STR("as\xc2\xb7""berat");
return 0;
}
el_val_t sga_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("is");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("t\xc3\xa9it");
}
if (str_eq(verb, EL_STR("take"))) {
return EL_STR("gaibid");
}
if (str_eq(verb, EL_STR("hold"))) {
return EL_STR("gaibid");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("ad\xc2\xb7""c\xc3\xad");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("as\xc2\xb7""beir");
}
return verb;
return 0;
}
el_val_t sga_ai_present(el_val_t stem, el_val_t slot) {
if (slot == 0) {
return el_str_concat(stem, EL_STR("aim"));
}
if (slot == 1) {
return el_str_concat(stem, EL_STR("ai"));
}
if (slot == 2) {
return el_str_concat(stem, EL_STR("aid"));
}
if (slot == 3) {
return el_str_concat(stem, EL_STR("am"));
}
if (slot == 4) {
return el_str_concat(stem, EL_STR("aid"));
}
return el_str_concat(stem, EL_STR("at"));
return 0;
}
el_val_t sga_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = sga_map_canonical(verb);
el_val_t slot = sga_slot(person, number);
if (str_eq(v, EL_STR("is"))) {
if (str_eq(tense, EL_STR("present"))) {
return sga_copula_present(slot);
}
return EL_STR("ba");
}
if (str_eq(v, EL_STR("bith"))) {
if (str_eq(tense, EL_STR("present"))) {
return sga_bith_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sga_bith_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("t\xc3\xa9it"))) {
if (str_eq(tense, EL_STR("present"))) {
return sga_teit_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sga_teit_past(slot);
}
return v;
}
if (str_eq(v, EL_STR("gaibid"))) {
if (str_eq(tense, EL_STR("present"))) {
return sga_gaibid_present(slot);
}
return EL_STR("gab");
}
if (str_eq(v, EL_STR("ad\xc2\xb7""c\xc3\xad"))) {
if (str_eq(tense, EL_STR("present"))) {
return sga_adci_present(slot);
}
return v;
}
if (str_eq(v, EL_STR("as\xc2\xb7""beir"))) {
if (str_eq(tense, EL_STR("present"))) {
return sga_asbeir_present(slot);
}
return v;
}
if (str_ends_with(v, EL_STR("id"))) {
el_val_t stem = sga_drop(v, 2);
if (str_eq(tense, EL_STR("present"))) {
return sga_ai_present(stem, slot);
}
return v;
}
return v;
return 0;
}
el_val_t sga_decline_ostem(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(noun, EL_STR("fer"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("fer");
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return EL_STR("fhir");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("fer");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("fir");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("fiur");
}
return EL_STR("fer");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("fir");
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return EL_STR("firu");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("firu");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("fer");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("feraib");
}
return EL_STR("fir");
}
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return sga_lenite(noun);
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("u"));
}
return noun;
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("i"));
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return el_str_concat(noun, EL_STR("u"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("u"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("aib"));
}
return el_str_concat(noun, EL_STR("i"));
return 0;
}
el_val_t sga_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(noun, EL_STR("ben"))) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("ben");
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return EL_STR("ben");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("bein");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("mn\xc3\xa1");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("mn\xc3\xa1ib");
}
return EL_STR("ben");
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return EL_STR("mn\xc3\xa1");
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return EL_STR("mn\xc3\xa1");
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return EL_STR("mn\xc3\xa1");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("ban");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("mn\xc3\xa1ib");
}
return EL_STR("mn\xc3\xa1");
}
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("i"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("e"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("aib"));
}
return noun;
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("vocative"))) {
return el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return noun;
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("aib"));
}
return el_str_concat(noun, EL_STR("a"));
return 0;
}
el_val_t sga_detect_gender(el_val_t noun) {
if (str_eq(noun, EL_STR("ben"))) {
return EL_STR("feminine");
}
if (str_eq(noun, EL_STR("mn\xc3\xa1"))) {
return EL_STR("feminine");
}
return EL_STR("masculine");
return 0;
}
el_val_t sga_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t gender = sga_detect_gender(noun);
if (str_eq(gender, EL_STR("masculine"))) {
return sga_decline_ostem(noun, gram_case, number);
}
if (str_eq(gender, EL_STR("feminine"))) {
return sga_decline_astem(noun, gram_case, number);
}
return noun;
return 0;
}
el_val_t sga_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
el_val_t base = sga_decline(noun, gram_case, number);
if (!str_eq(definite, EL_STR("true"))) {
return base;
}
return el_str_concat(EL_STR("in "), base);
return 0;
}
-22
View File
@@ -1,22 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn sga_drop(s: String, n: Int) -> String
extern fn sga_first(s: String) -> String
extern fn sga_rest(s: String) -> String
extern fn sga_slot(person: String, number: String) -> Int
extern fn sga_lenite(word: String) -> String
extern fn sga_copula_present(slot: Int) -> String
extern fn sga_bith_present(slot: Int) -> String
extern fn sga_bith_past(slot: Int) -> String
extern fn sga_teit_present(slot: Int) -> String
extern fn sga_teit_past(slot: Int) -> String
extern fn sga_gaibid_present(slot: Int) -> String
extern fn sga_adci_present(slot: Int) -> String
extern fn sga_asbeir_present(slot: Int) -> String
extern fn sga_map_canonical(verb: String) -> String
extern fn sga_ai_present(stem: String, slot: Int) -> String
extern fn sga_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn sga_decline_ostem(noun: String, gram_case: String, number: String) -> String
extern fn sga_decline_astem(noun: String, gram_case: String, number: String) -> String
extern fn sga_detect_gender(noun: String) -> String
extern fn sga_decline(noun: String, gram_case: String, number: String) -> String
extern fn sga_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
-591
View File
@@ -1,591 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t sux_str_ends(el_val_t s, el_val_t suf);
el_val_t sux_str_drop_last(el_val_t s, el_val_t n);
el_val_t sux_str_last_char(el_val_t s);
el_val_t sux_str_last2(el_val_t s);
el_val_t sux_slot(el_val_t person, el_val_t number);
el_val_t sux_ergative_suffix(el_val_t person, el_val_t number);
el_val_t sux_absolutive_suffix(el_val_t person, el_val_t number);
el_val_t sux_map_canonical(el_val_t verb);
el_val_t sux_personal_suffix(el_val_t slot);
el_val_t sux_me_present(el_val_t slot);
el_val_t sux_me_past(el_val_t slot);
el_val_t sux_dug4_present(el_val_t slot);
el_val_t sux_dug4_past(el_val_t slot);
el_val_t sux_du_present(el_val_t slot);
el_val_t sux_du_past(el_val_t slot);
el_val_t sux_igibar_present(el_val_t slot);
el_val_t sux_igibar_past(el_val_t slot);
el_val_t sux_ak_present(el_val_t slot);
el_val_t sux_ak_past(el_val_t slot);
el_val_t sux_tum2_present(el_val_t slot);
el_val_t sux_tum2_past(el_val_t slot);
el_val_t sux_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t sux_is_animate(el_val_t noun);
el_val_t sux_case_suffix(el_val_t gram_case);
el_val_t sux_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t sux_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t sux_verb_chain(el_val_t agent, el_val_t verb, el_val_t patient, el_val_t tense);
el_val_t sux_realize_sentence(el_val_t intent, el_val_t agent, el_val_t predicate, el_val_t patient, el_val_t tense);
el_val_t sux_str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t sux_str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t sux_str_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t sux_str_last2(el_val_t s) {
el_val_t n = str_len(s);
if (n < 2) {
return s;
}
return str_slice(s, (n - 2), n);
return 0;
}
el_val_t sux_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t sux_ergative_suffix(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return EL_STR("-en");
}
return EL_STR("-enden");
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return EL_STR("-en");
}
return EL_STR("-enzen");
}
if (str_eq(number, EL_STR("singular"))) {
return EL_STR("-e");
}
return EL_STR("-e\xc5\xa1");
return 0;
}
el_val_t sux_absolutive_suffix(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return EL_STR("-en");
}
return EL_STR("-enden");
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return EL_STR("-en");
}
return EL_STR("-enzen");
}
return EL_STR("");
return 0;
}
el_val_t sux_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("me");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("dug4");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("du");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("igi-bar");
}
if (str_eq(verb, EL_STR("do"))) {
return EL_STR("ak");
}
if (str_eq(verb, EL_STR("make"))) {
return EL_STR("ak");
}
if (str_eq(verb, EL_STR("bring"))) {
return EL_STR("tum2");
}
if (str_eq(verb, EL_STR("build"))) {
return EL_STR("d\xc3\xb9");
}
if (str_eq(verb, EL_STR("give"))) {
return EL_STR("\xc5\xa1um2");
}
if (str_eq(verb, EL_STR("know"))) {
return EL_STR("zu");
}
if (str_eq(verb, EL_STR("hear"))) {
return EL_STR("\xc4\x9d""e\xc5\xa1tug2 \xc4\x9d""ar");
}
if (str_eq(verb, EL_STR("love"))) {
return EL_STR("ki-a\xc4\x9d""2");
}
if (str_eq(verb, EL_STR("sit"))) {
return EL_STR("tu\xc5\xa1");
}
if (str_eq(verb, EL_STR("stand"))) {
return EL_STR("gub");
}
if (str_eq(verb, EL_STR("come"))) {
return EL_STR("\xc4\x9d""en");
}
if (str_eq(verb, EL_STR("eat"))) {
return EL_STR("gu7");
}
if (str_eq(verb, EL_STR("drink"))) {
return EL_STR("na\xc4\x9d");
}
if (str_eq(verb, EL_STR("write"))) {
return EL_STR("sar");
}
return verb;
return 0;
}
el_val_t sux_personal_suffix(el_val_t slot) {
if (slot == 0) {
return EL_STR("en");
}
if (slot == 1) {
return EL_STR("en");
}
if (slot == 2) {
return EL_STR("");
}
if (slot == 3) {
return EL_STR("enden");
}
if (slot == 4) {
return EL_STR("enzen");
}
return EL_STR("e\xc5\xa1");
return 0;
}
el_val_t sux_me_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("me-en");
}
if (slot == 1) {
return EL_STR("me-en");
}
if (slot == 2) {
return EL_STR("");
}
if (slot == 3) {
return EL_STR("me-en-d\xc3\xa8");
}
if (slot == 4) {
return EL_STR("me-en-z\xc3\xa8-en");
}
return EL_STR("me-e\xc5\xa1");
return 0;
}
el_val_t sux_me_past(el_val_t slot) {
if (slot == 0) {
return EL_STR("ba-me-en");
}
if (slot == 1) {
return EL_STR("ba-me-en");
}
if (slot == 2) {
return EL_STR("ba-me");
}
if (slot == 3) {
return EL_STR("ba-me-en-d\xc3\xa8");
}
if (slot == 4) {
return EL_STR("ba-me-en-z\xc3\xa8-en");
}
return EL_STR("ba-me-e\xc5\xa1");
return 0;
}
el_val_t sux_dug4_present(el_val_t slot) {
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(suf, EL_STR(""))) {
return EL_STR("e");
}
return el_str_concat(EL_STR("e-"), suf);
return 0;
}
el_val_t sux_dug4_past(el_val_t slot) {
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(suf, EL_STR(""))) {
return EL_STR("mu-un-dug4");
}
return el_str_concat(EL_STR("mu-un-dug4-"), suf);
return 0;
}
el_val_t sux_du_present(el_val_t slot) {
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(suf, EL_STR(""))) {
return EL_STR("i-du");
}
return el_str_concat(EL_STR("i-du-"), suf);
return 0;
}
el_val_t sux_du_past(el_val_t slot) {
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(suf, EL_STR(""))) {
return EL_STR("mu-un-du");
}
return el_str_concat(EL_STR("mu-un-du-"), suf);
return 0;
}
el_val_t sux_igibar_present(el_val_t slot) {
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(suf, EL_STR(""))) {
return EL_STR("igi i-bar");
}
return el_str_concat(EL_STR("igi i-bar-"), suf);
return 0;
}
el_val_t sux_igibar_past(el_val_t slot) {
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(suf, EL_STR(""))) {
return EL_STR("igi mu-un-bar");
}
return el_str_concat(EL_STR("igi mu-un-bar-"), suf);
return 0;
}
el_val_t sux_ak_present(el_val_t slot) {
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(suf, EL_STR(""))) {
return EL_STR("i-ak");
}
return el_str_concat(EL_STR("i-ak-"), suf);
return 0;
}
el_val_t sux_ak_past(el_val_t slot) {
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(suf, EL_STR(""))) {
return EL_STR("mu-un-ak");
}
return el_str_concat(EL_STR("mu-un-ak-"), suf);
return 0;
}
el_val_t sux_tum2_present(el_val_t slot) {
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(suf, EL_STR(""))) {
return EL_STR("i-tum2");
}
return el_str_concat(EL_STR("i-tum2-"), suf);
return 0;
}
el_val_t sux_tum2_past(el_val_t slot) {
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(suf, EL_STR(""))) {
return EL_STR("mu-un-tum2");
}
return el_str_concat(EL_STR("mu-un-tum2-"), suf);
return 0;
}
el_val_t sux_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = sux_map_canonical(verb);
el_val_t slot = sux_slot(person, number);
if (str_eq(v, EL_STR("me"))) {
if (str_eq(tense, EL_STR("present"))) {
return sux_me_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sux_me_past(slot);
}
return sux_me_present(slot);
}
if (str_eq(v, EL_STR("dug4"))) {
if (str_eq(tense, EL_STR("present"))) {
return sux_dug4_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sux_dug4_past(slot);
}
return sux_dug4_past(slot);
}
if (str_eq(v, EL_STR("du"))) {
if (str_eq(tense, EL_STR("present"))) {
return sux_du_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sux_du_past(slot);
}
return sux_du_past(slot);
}
if (str_eq(v, EL_STR("igi-bar"))) {
if (str_eq(tense, EL_STR("present"))) {
return sux_igibar_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sux_igibar_past(slot);
}
return sux_igibar_past(slot);
}
if (str_eq(v, EL_STR("ak"))) {
if (str_eq(tense, EL_STR("present"))) {
return sux_ak_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sux_ak_past(slot);
}
return sux_ak_past(slot);
}
if (str_eq(v, EL_STR("tum2"))) {
if (str_eq(tense, EL_STR("present"))) {
return sux_tum2_present(slot);
}
if (str_eq(tense, EL_STR("past"))) {
return sux_tum2_past(slot);
}
return sux_tum2_past(slot);
}
el_val_t suf = sux_personal_suffix(slot);
if (str_eq(tense, EL_STR("present"))) {
if (str_eq(suf, EL_STR(""))) {
return el_str_concat(EL_STR("i-"), v);
}
return el_str_concat(el_str_concat(el_str_concat(EL_STR("i-"), v), EL_STR("-")), suf);
}
if (str_eq(suf, EL_STR(""))) {
return el_str_concat(EL_STR("mu-"), v);
}
return el_str_concat(el_str_concat(el_str_concat(EL_STR("mu-"), v), EL_STR("-")), suf);
return 0;
}
el_val_t sux_is_animate(el_val_t noun) {
if (sux_str_ends(noun, EL_STR("di\xc4\x9dir"))) {
return 1;
}
if (sux_str_ends(noun, EL_STR("dingir"))) {
return 1;
}
if (str_eq(noun, EL_STR("lugal"))) {
return 1;
}
if (str_eq(noun, EL_STR("nin"))) {
return 1;
}
if (str_eq(noun, EL_STR("en"))) {
return 1;
}
if (str_eq(noun, EL_STR("ensi2"))) {
return 1;
}
if (str_eq(noun, EL_STR("dumu"))) {
return 1;
}
if (str_eq(noun, EL_STR("dam"))) {
return 1;
}
if (str_eq(noun, EL_STR("ama"))) {
return 1;
}
if (str_eq(noun, EL_STR("ad"))) {
return 1;
}
if (str_eq(noun, EL_STR("a2-dam"))) {
return 1;
}
if (str_eq(noun, EL_STR("lu2"))) {
return 1;
}
if (str_eq(noun, EL_STR("munus"))) {
return 1;
}
if (str_eq(noun, EL_STR("ur"))) {
return 1;
}
if (str_eq(noun, EL_STR("sa\xc4\x9d"))) {
return 1;
}
if (str_eq(noun, EL_STR("gudu4"))) {
return 1;
}
if (str_eq(noun, EL_STR("sanga"))) {
return 1;
}
if (str_eq(noun, EL_STR("ugula"))) {
return 1;
}
if (str_eq(noun, EL_STR("dub-sar"))) {
return 1;
}
if (str_eq(noun, EL_STR("nar"))) {
return 1;
}
if (str_eq(noun, EL_STR("sukkal"))) {
return 1;
}
if (sux_str_ends(noun, EL_STR("d-"))) {
return 1;
}
return 0;
return 0;
}
el_val_t sux_case_suffix(el_val_t gram_case) {
if (str_eq(gram_case, EL_STR("absolutive"))) {
return EL_STR("");
}
if (str_eq(gram_case, EL_STR("ergative"))) {
return EL_STR("-e");
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return EL_STR("-ak");
}
if (str_eq(gram_case, EL_STR("dative"))) {
return EL_STR("-ra");
}
if (str_eq(gram_case, EL_STR("locative"))) {
return EL_STR("-a");
}
if (str_eq(gram_case, EL_STR("ablative"))) {
return EL_STR("-ta");
}
if (str_eq(gram_case, EL_STR("comitative"))) {
return EL_STR("-da");
}
if (str_eq(gram_case, EL_STR("equative"))) {
return EL_STR("-gin");
}
if (str_eq(gram_case, EL_STR("terminative"))) {
return EL_STR("-\xc5\xa1""e");
}
return EL_STR("");
return 0;
}
el_val_t sux_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t csuf = sux_case_suffix(gram_case);
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("absolutive"))) {
return noun;
}
el_val_t suf_len = str_len(csuf);
el_val_t bare_suf = str_slice(csuf, 1, suf_len);
return el_str_concat(noun, bare_suf);
}
el_val_t animate = sux_is_animate(noun);
el_val_t plural_stem = EL_STR("");
if (animate) {
plural_stem = el_str_concat(noun, EL_STR("ene"));
}
if (!animate) {
plural_stem = el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("absolutive"))) {
return plural_stem;
}
el_val_t suf_len2 = str_len(csuf);
el_val_t bare_suf2 = str_slice(csuf, 1, suf_len2);
return el_str_concat(plural_stem, bare_suf2);
return 0;
}
el_val_t sux_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
return sux_decline(noun, gram_case, number);
return 0;
}
el_val_t sux_verb_chain(el_val_t agent, el_val_t verb, el_val_t patient, el_val_t tense) {
el_val_t conjugated = sux_conjugate(verb, tense, EL_STR("third"), EL_STR("singular"));
if (str_eq(patient, EL_STR(""))) {
return el_str_concat(el_str_concat(agent, EL_STR(" ")), conjugated);
}
el_val_t agent_erg = el_str_concat(agent, EL_STR("e"));
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(agent_erg, EL_STR(" ")), patient), EL_STR(" ")), conjugated);
return 0;
}
el_val_t sux_realize_sentence(el_val_t intent, el_val_t agent, el_val_t predicate, el_val_t patient, el_val_t tense) {
if (str_eq(intent, EL_STR("assert"))) {
return sux_verb_chain(agent, predicate, patient, tense);
}
if (str_eq(intent, EL_STR("question"))) {
el_val_t assertion = sux_verb_chain(agent, predicate, patient, tense);
return el_str_concat(assertion, EL_STR("-a"));
}
if (str_eq(intent, EL_STR("describe"))) {
if (str_eq(patient, EL_STR(""))) {
return el_str_concat(el_str_concat(el_str_concat(agent, EL_STR(" ")), predicate), EL_STR("-am3"));
}
return el_str_concat(el_str_concat(el_str_concat(agent, EL_STR(" ")), patient), EL_STR("-am3"));
}
return sux_verb_chain(agent, predicate, patient, tense);
return 0;
}
-29
View File
@@ -1,29 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn sux_str_ends(s: String, suf: String) -> Bool
extern fn sux_str_drop_last(s: String, n: Int) -> String
extern fn sux_str_last_char(s: String) -> String
extern fn sux_str_last2(s: String) -> String
extern fn sux_slot(person: String, number: String) -> Int
extern fn sux_ergative_suffix(person: String, number: String) -> String
extern fn sux_absolutive_suffix(person: String, number: String) -> String
extern fn sux_map_canonical(verb: String) -> String
extern fn sux_personal_suffix(slot: Int) -> String
extern fn sux_me_present(slot: Int) -> String
extern fn sux_me_past(slot: Int) -> String
extern fn sux_dug4_present(slot: Int) -> String
extern fn sux_dug4_past(slot: Int) -> String
extern fn sux_du_present(slot: Int) -> String
extern fn sux_du_past(slot: Int) -> String
extern fn sux_igibar_present(slot: Int) -> String
extern fn sux_igibar_past(slot: Int) -> String
extern fn sux_ak_present(slot: Int) -> String
extern fn sux_ak_past(slot: Int) -> String
extern fn sux_tum2_present(slot: Int) -> String
extern fn sux_tum2_past(slot: Int) -> String
extern fn sux_conjugate(verb: String, tense: String, person: String, number: String) -> String
extern fn sux_is_animate(noun: String) -> Bool
extern fn sux_case_suffix(gram_case: String) -> String
extern fn sux_decline(noun: String, gram_case: String, number: String) -> String
extern fn sux_noun_phrase(noun: String, gram_case: String, number: String, definite: String) -> String
extern fn sux_verb_chain(agent: String, verb: String, patient: String, tense: String) -> String
extern fn sux_realize_sentence(intent: String, agent: String, predicate: String, patient: String, tense: String) -> String
-1243
View File
File diff suppressed because it is too large Load Diff
-23
View File
@@ -1,23 +0,0 @@
// auto-generated by elc --emit-header — do not edit
extern fn sw_str_ends(s: String, suf: String) -> Bool
extern fn sw_str_drop_last(s: String, n: Int) -> String
extern fn sw_str_first_char(s: String) -> String
extern fn sw_str_first2(s: String) -> String
extern fn sw_str_first3(s: String) -> String
extern fn sw_str_last_char(s: String) -> String
extern fn sw_is_class1_noun(noun: String) -> Bool
extern fn sw_noun_class(noun: String) -> String
extern fn sw_subj_prefix(person: String, number: String, noun_class: String) -> String
extern fn sw_obj_prefix(person: String, number: String, noun_class: String) -> String
extern fn sw_tense_marker(tense: String) -> String
extern fn sw_verb_final(tense: String, negative: Bool) -> String
extern fn sw_neg_subj_prefix(person: String, number: String, noun_class: String) -> String
extern fn sw_verb_stem(infinitive: String) -> String
extern fn sw_conjugate(verb_stem: String, person: String, number: String, noun_class: String, tense: String) -> String
extern fn sw_negative(verb_stem: String, person: String, number: String, noun_class: String, tense: String) -> String
extern fn sw_noun_plural(noun: String) -> String
extern fn sw_adj_prefix(noun_class: String, number: String) -> String
extern fn sw_agree_adj(adj_stem: String, noun_class: String, number: String) -> String
extern fn sw_demonstrative(noun_class: String, number: String, proximity: String) -> String
extern fn sw_copula_present(person: String, number: String, use_case: String) -> String
extern fn sw_copula_neg_present(person: String, number: String) -> String
-335
View File
@@ -1,335 +0,0 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t txb_drop(el_val_t s, el_val_t n);
el_val_t txb_ends(el_val_t s, el_val_t suf);
el_val_t txb_slot(el_val_t person, el_val_t number);
el_val_t txb_pres1_suffix(el_val_t slot);
el_val_t txb_kam_present(el_val_t slot);
el_val_t txb_ya_present(el_val_t slot);
el_val_t txb_wes_present(el_val_t slot);
el_val_t txb_lyut_present(el_val_t slot);
el_val_t txb_wak_present(el_val_t slot);
el_val_t txb_map_canonical(el_val_t verb);
el_val_t txb_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t txb_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t txb_decline_fem(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t txb_detect_gender(el_val_t noun);
el_val_t txb_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t txb_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t txb_drop(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t txb_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t txb_slot(el_val_t person, el_val_t number) {
if (str_eq(person, EL_STR("first"))) {
if (str_eq(number, EL_STR("singular"))) {
return 0;
}
return 3;
}
if (str_eq(person, EL_STR("second"))) {
if (str_eq(number, EL_STR("singular"))) {
return 1;
}
return 4;
}
if (str_eq(number, EL_STR("singular"))) {
return 2;
}
return 5;
return 0;
}
el_val_t txb_pres1_suffix(el_val_t slot) {
if (slot == 0) {
return EL_STR("au");
}
if (slot == 1) {
return EL_STR("\xc3\xa4t");
}
if (slot == 2) {
return EL_STR("em");
}
if (slot == 3) {
return EL_STR("emane");
}
if (slot == 4) {
return EL_STR("em");
}
return EL_STR("em");
return 0;
}
el_val_t txb_kam_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("kam");
}
if (slot == 1) {
return EL_STR("k\xc3\xa4m");
}
if (slot == 2) {
return EL_STR("k\xc3\xa4m");
}
if (slot == 3) {
return EL_STR("kamn\xc3\xa4\xe1\xb9\x83");
}
if (slot == 4) {
return EL_STR("kamn\xc3\xa4\xe1\xb9\x83");
}
return EL_STR("kamn\xc3\xa4\xe1\xb9\x83");
return 0;
}
el_val_t txb_ya_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("yau");
}
if (slot == 1) {
return EL_STR("y\xc3\xa4t");
}
if (slot == 2) {
return EL_STR("y\xc3\xa4m");
}
if (slot == 3) {
return EL_STR("ym\xc3\xa4\xe1\xb9\x83");
}
if (slot == 4) {
return EL_STR("ym\xc3\xa4\xe1\xb9\x83");
}
return EL_STR("y\xc3\xa4nm\xc3\xa4\xe1\xb9\x83");
return 0;
}
el_val_t txb_wes_present(el_val_t slot) {
if (slot == 2) {
return EL_STR("ste");
}
return EL_STR("wes");
return 0;
}
el_val_t txb_lyut_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("lyutau");
}
if (slot == 1) {
return EL_STR("lyut\xc3\xa4t");
}
if (slot == 2) {
return EL_STR("lyutem");
}
if (slot == 3) {
return EL_STR("lyutemane");
}
if (slot == 4) {
return EL_STR("lyutem");
}
return EL_STR("lyutem");
return 0;
}
el_val_t txb_wak_present(el_val_t slot) {
if (slot == 0) {
return EL_STR("wakau");
}
if (slot == 1) {
return EL_STR("wak\xc3\xa4t");
}
if (slot == 2) {
return EL_STR("wakem");
}
if (slot == 3) {
return EL_STR("wakemane");
}
if (slot == 4) {
return EL_STR("wakem");
}
return EL_STR("wakem");
return 0;
}
el_val_t txb_map_canonical(el_val_t verb) {
if (str_eq(verb, EL_STR("be"))) {
return EL_STR("wes");
}
if (str_eq(verb, EL_STR("come"))) {
return EL_STR("k\xc3\xa4m");
}
if (str_eq(verb, EL_STR("go"))) {
return EL_STR("y\xc3\xa4");
}
if (str_eq(verb, EL_STR("see"))) {
return EL_STR("lyut");
}
if (str_eq(verb, EL_STR("speak"))) {
return EL_STR("wak");
}
if (str_eq(verb, EL_STR("say"))) {
return EL_STR("wak");
}
return verb;
return 0;
}
el_val_t txb_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t v = txb_map_canonical(verb);
el_val_t slot = txb_slot(person, number);
if (str_eq(v, EL_STR("wes"))) {
if (str_eq(tense, EL_STR("present"))) {
return txb_wes_present(slot);
}
return v;
}
if (str_eq(v, EL_STR("k\xc3\xa4m"))) {
if (str_eq(tense, EL_STR("present"))) {
return txb_kam_present(slot);
}
return v;
}
if (str_eq(v, EL_STR("y\xc3\xa4"))) {
if (str_eq(tense, EL_STR("present"))) {
return txb_ya_present(slot);
}
return v;
}
if (str_eq(v, EL_STR("lyut"))) {
if (str_eq(tense, EL_STR("present"))) {
return txb_lyut_present(slot);
}
return v;
}
if (str_eq(v, EL_STR("wak"))) {
if (str_eq(tense, EL_STR("present"))) {
return txb_wak_present(slot);
}
return v;
}
if (str_eq(tense, EL_STR("present"))) {
return el_str_concat(v, txb_pres1_suffix(slot));
}
return v;
return 0;
}
el_val_t txb_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("e"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("e"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("entse"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("ene"));
}
return el_str_concat(noun, EL_STR("e"));
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("i"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("i"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("entwetse"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("ene"));
}
return el_str_concat(noun, EL_STR("i"));
return 0;
}
el_val_t txb_decline_fem(el_val_t noun, el_val_t gram_case, el_val_t number) {
if (str_eq(number, EL_STR("singular"))) {
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("antse"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("ane"));
}
return el_str_concat(noun, EL_STR("a"));
}
if (str_eq(gram_case, EL_STR("nominative"))) {
return el_str_concat(noun, EL_STR("\xc3\xa4"));
}
if (str_eq(gram_case, EL_STR("accusative"))) {
return el_str_concat(noun, EL_STR("\xc3\xa4"));
}
if (str_eq(gram_case, EL_STR("genitive"))) {
return el_str_concat(noun, EL_STR("antse"));
}
if (str_eq(gram_case, EL_STR("dative"))) {
return el_str_concat(noun, EL_STR("ane"));
}
return el_str_concat(noun, EL_STR("\xc3\xa4"));
return 0;
}
el_val_t txb_detect_gender(el_val_t noun) {
return EL_STR("masculine");
return 0;
}
el_val_t txb_decline(el_val_t noun, el_val_t gram_case, el_val_t number) {
el_val_t gender = txb_detect_gender(noun);
if (str_eq(gender, EL_STR("feminine"))) {
return txb_decline_fem(noun, gram_case, number);
}
return txb_decline_masc(noun, gram_case, number);
return 0;
}
el_val_t txb_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) {
return txb_decline(noun, gram_case, number);
return 0;
}

Some files were not shown because too many files have changed in this diff Show More