{"id":16130236,"url":"https://github.com/lambdacasserole/haha-parser","last_synced_at":"2025-04-06T14:16:33.639Z","repository":{"id":52535334,"uuid":"209400727","full_name":"lambdacasserole/haha-parser","owner":"lambdacasserole","description":"Unofficial, handwritten parser aimed at transpilation of the HAHA language.","archived":false,"fork":false,"pushed_at":"2021-04-26T19:32:05.000Z","size":133,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-12T20:19:37.943Z","etag":null,"topics":["education","formal-methods","formal-verification","hoare-logic","parser","verification"],"latest_commit_sha":null,"homepage":"","language":"Java","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/lambdacasserole.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}},"created_at":"2019-09-18T20:43:58.000Z","updated_at":"2019-11-04T12:42:03.000Z","dependencies_parsed_at":"2022-09-14T08:51:48.818Z","dependency_job_id":null,"html_url":"https://github.com/lambdacasserole/haha-parser","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lambdacasserole%2Fhaha-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lambdacasserole%2Fhaha-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lambdacasserole%2Fhaha-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lambdacasserole%2Fhaha-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lambdacasserole","download_url":"https://codeload.github.com/lambdacasserole/haha-parser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247492546,"owners_count":20947545,"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":["education","formal-methods","formal-verification","hoare-logic","parser","verification"],"created_at":"2024-10-09T22:15:03.571Z","updated_at":"2025-04-06T14:16:33.621Z","avatar_url":"https://github.com/lambdacasserole.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hoare Advanced Homework Assistant Parser\nUnofficial, handwritten parser aimed at transpilation of the HAHA language.\n\n![Logo](assets/logo.svg)\n\n## Overview\nThis is a from-scratch implementation of a parser for the language of the [Hoare Advanced Homework Assistant \\(HAHA\\)](http://haha.mimuw.edu.pl/). Most language constructs are supported, but there are currently some limitations (see below). This implementation does not draw on any of the files originally shipped with HAHA, and is entirely handwritten (i.e. was not generated by a parser generator). I needed this working quickly and at the time grappling with the likes of ANTLR just wasn't worth it.\n\nThis parser is primarily aimed at the transpilation of simple HAHA program to other languages (such as Java, C, C++ etc.) and is therefore currently missing many features.\n\n## Installation\nYou can pull this package into your Maven project straight from here using JitPack. Add JitPack as a repository first:\n\n```\n\u003crepositories\u003e\n    \u003crepository\u003e\n        \u003cid\u003ejitpack.io\u003c/id\u003e\n        \u003curl\u003ehttps://jitpack.io\u003c/url\u003e\n    \u003c/repository\u003e\n\u003c/repositories\u003e\n```\n\nThen add this project as a dependency:\n\n```\n\u003cdependencies\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.github.lambdacasserole\u003c/groupId\u003e\n        \u003cartifactId\u003ehaha-parser\u003c/artifactId\u003e\n        \u003cversion\u003ev1.2\u003c/version\u003e\n    \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n## Quickstart\nSee below for some code that'll get you started quite quickly parsing HAHA code.\n\n```java\nimport java.io.File;\nimport java.io.IOException;\n\nimport com.sauljohnson.haha.parser.*;\nimport com.sauljohnson.haha.parser.model.Program;\n\nimport org.apache.commons.io.FileUtils;\n\npublic class QuickHahaParserTest {\n\n    /**\n     * The application entry point.\n     *\n     * @param args the command-line arguments to the application\n     */\n    public static void main(String[] args) {\n        try {\n            // Read in source code.\n            String source = FileUtils.readFileToString(new File(\"my_file.haha\"));\n            \n            // Tokenize source.\n            Tokenizer tokenizer = new HahaTokenizer();\n            Token[] tokens = tokenizer.tokenize(source);\n            \n            // Filter out empty statements (i.e. consecutive punctuators).\n            TokenStreamTransformer emptyStatementFilter = new ConsecutiveTokenFilter(TokenType.PUNCTUATOR);\n            TokenStream tokenStream = emptyStatementFilter.transform(new TokenStream(tokens));\n            \n            // Parse program.\n            Program result = Program.parse(streamTransformer.transform(tokenStream));\n            \n            // TODO: Interact with the resulting parse tree here.\n        } catch (IOException e) {\n            e.printStackTrace(); // File read error.\n        } catch (TokenizationException e) {\n            e.printStackTrace(); // Tokenizer error.\n        } catch (ParseException e) {\n            e.printStackTrace(); // Parser error.\n        }\n    }\n}\n\n```\n\n## Limitations\nThis parser is currently subject to some limitations:\n* Parsing does not descend all the way to the expression level. Conditional/loop predicates and the right-hand side of assignments are all left unparsed.\n* Predicates, axioms, invariants, preconditions, and postconditions are left unparsed.\n\n## Contributing\nFor most intents and purposes, this project is considered to fulfil its original use case. Bug fixes and suggestions are welcome, however, from any member of the community.\n\n## Acknowledgements\nA big thank you to the team at the [University of Warsaw](https://mimuw.edu.pl/en) behind [HAHA](http://haha.mimuw.edu.pl/). This really is an awesome tool for teaching software verification! By name, they're:\n* [Tadeusz Sznuk](http://www.mimuw.edu.pl/~tsznuk/)\n* Jacek Chrząszcz\n* [Aleksy Schubert](http://www.mimuw.edu.pl/~alx/)\n* Jakub Zakrzewski\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flambdacasserole%2Fhaha-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flambdacasserole%2Fhaha-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flambdacasserole%2Fhaha-parser/lists"}