{"id":20649169,"url":"https://github.com/liulinboyi/pineapple-ts","last_synced_at":"2025-04-17T01:23:14.940Z","repository":{"id":109597779,"uuid":"328343805","full_name":"liulinboyi/pineapple-ts","owner":"liulinboyi","description":"Pineapple语言是一个简单的编程语言演示。它包含了一个手写的递归降序解析器。该语言现在应该是图灵完整的。Pineapple lang is a simple programming language demo. It contains a handwritten recursive descending parser.The language should now be Turing complete.","archived":false,"fork":false,"pushed_at":"2021-08-12T05:47:30.000Z","size":358,"stargazers_count":13,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-11T16:08:27.418Z","etag":null,"topics":["pineapple","pineapple-lang-demo"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liulinboyi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-01-10T09:13:49.000Z","updated_at":"2025-03-15T06:56:23.000Z","dependencies_parsed_at":"2023-03-24T07:34:25.810Z","dependency_job_id":null,"html_url":"https://github.com/liulinboyi/pineapple-ts","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liulinboyi%2Fpineapple-ts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liulinboyi%2Fpineapple-ts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liulinboyi%2Fpineapple-ts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liulinboyi%2Fpineapple-ts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liulinboyi","download_url":"https://codeload.github.com/liulinboyi/pineapple-ts/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249296132,"owners_count":21246256,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pineapple","pineapple-lang-demo"],"created_at":"2024-11-16T17:13:00.346Z","updated_at":"2025-04-17T01:23:14.927Z","avatar_url":"https://github.com/liulinboyi.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pineapple-ts\n\n## [移植初版分支在这里！](https://github.com/liulinboyi/pineapple-ts/tree/0.0.1)\n\n### 敏捷开发，主要是思路，细节不是很完美\n\n### 可以用[在线解析EBNF](https://bottlecaps.de/rr/ui)\n### EBNF：\n```\nSourceCharacter ::=  #x0009 | #x000A | #x000D | [#x0020-#xFFFF] // 大部分的 Unicode \nName            ::= [_A-Za-z][_0-9A-Za-z]* // 标识符名称第一部分只能出现一次，后面部分零次或多次 \nStringCharacter ::= SourceCharacter - '\"' // - '\"' 代表不包含双引号 \", 即 StringCharacter 是 SourceCharacter 但不包含双引号. (String 要用双引号作为结束/闭合的标记) \nInteger         ::= [0-9]+\nNumber          ::= Integer Ignored\nString          ::= '\"' '\"' Ignored | '\"' StringCharacter '\"' Ignored\nVariable        ::= \"$\" Name Ignored // 变量 \nAssignment      ::= Variable Ignored '=' Ignored ( String | Number |  Variable | Expressions) Ignored\nPrint           ::= \"print\" \"(\" Ignored Variable Ignored \")\" Ignored\nStatement       ::= Print | Assignment\nSourceCode      ::= Statement+ \nComment         ::= Ignored \"#\" SourceCharacter // 注释 \n// BinaryExpression::= (Variable | Number) Ignored Operator1 Ignored (Variable | Number)\nCompare        ::= \"\u003e\" | \"\u003c\" | \"==\" | \"\u003e=\" | \"\u003c=\"\nOperator1        ::= \"+\" | \"-\"\nOperator2        ::= \"*\" | \"/\"\nExpressions ::= Term Expressions_tail\nExpressions_tail ::= (Operator1 Term)? // 0个或一个\nTerm            ::= Factor Term_tail\nTerm_tail       ::= (Operator2 Factor)? // 0个或一个\nFactor          ::= Number | \"(\" Expressions \")\"\nFunctionDeclaration ::= \"func\" Ignored Name Ignored \"(\" Variable (\",\" Variable)* \")\" BlockStatement // eg: 1: func foo ($a) {}  2: func foo ($a[,$b][,$c]) {}   (\",\" Variable)*这部分是一个或多个\nBlockStatement  ::= \"{\" Ignored (IfStatement | CallFunction | Print | Assignment | ReturnStatement ) Ignored \"}\"\nReturnStatement ::= \"return\" (Expressions | Variable)\nCallFunction    ::= Name \"(\" (Variable | Number) (\",\" (Variable | Number))* \")\" Ignored\nIfStatement     ::= \"if\" Ignored \"(\" Variable Ignored Operator Ignored Variable \")\" Ignored BlockStatement Ignored \"else\" Ignored BlockStatement Ignored\n\n```\npineapple-ts移植于[pineapple language Go语言版本](https://github.com/karminski/pineapple)，后以移植初版(pineapple-ts)为蓝本，实现后续功能。\n\nPineapple-ts is transplanted to the pineapple language Go language version, and then the original version of pineapple-ts is transplanted as the model to achieve the follow-up functions.\n\n## pineapple(Go 语言版本)\nTypeScript implementation of pineapple language (https://github.com/karminski/pineapple) as a personal exercise.\n\n[karminski/pineapple](https://github.com/karminski/pineapple)\n\n## 说明\npineapple lang 是一个简单的编程语言 demo. 它包含了个手写的递归下降解析器. \n\n该语言现在应该是图灵完备的. \n\npineapple 的主要目的是让编译原理初学者有一个预热, 简单了解一个编程语言是怎么构建的.\n\n\nPineapple lang is a simple programming language demo. It contains a handwritten recursive descending parser.\n\nThe language should now be Turing complete.\n\nThe main purpose of pineapple is to give beginners of compilation principles a warm-up and a simple understanding of how a programming language is built.\n\n## 运行\n```\nnpm install\nnpm run test\n```\n\n## Contributors\n- [karminski](https://github.com/karminski)\n- [liulinboyi](https://github.com/liulinboyi)\n\n\n#### 最后把代码转成[JavaScript的AST](https://astexplorer.net/)，然后使用[javascript的解释器canjs](https://github.com/jrainlau/canjs)执行代码.\n\n#### 最后算是完成大部分了，实现了递归调用，解决了求斐波那契数问题。\n\n```\n# 求斐波那契数\nfunc Fibonacci($a) {\n\n\tif($a == 0) {\n\t\treturn 0\n\t}\n\t\n\tif ($a == 1) {\n\t\treturn 1\n\t}\n\n\tif($a == 2) {\n\t\treturn 1\n\t}\n\n\t$_a = $a - 1\n\n\t$_b = $a - 2\n\n\t$aa = Fibonacci($_a)\n\n\t$bb = Fibonacci($_b)\n\n\treturn $aa + $bb\n}\n\n$res = Fibonacci(7)\n\nprint($res)\n```\n## 对应JavaScript中的代码如下\n```javascript\n// 求斐波那契数\nfunction Fibonacci($a) {\n\n\tif($a == 0) {\n\t\treturn 0\n\t}\n\n\tif($a == 1) {\n\t\treturn 1\n\t}\n\t\n\tif ($a == 2) {\n\t\treturn 1\n\t}\n\n\tlet $_a = $a - 1\n\n\tlet $_b = $a - 2\n\n\tlet $aa = Fibonacci($_a)\n\n\tlet $bb = Fibonacci($_b)\n\n\treturn $aa + $bb\n}\n\nlet $res = Fibonacci(7)\n\nconsole.log($res)\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliulinboyi%2Fpineapple-ts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliulinboyi%2Fpineapple-ts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliulinboyi%2Fpineapple-ts/lists"}