Outdated egg!
This is an egg for CHICKEN 4, the unsupported old release. You're almost certainly looking for the CHICKEN 5 version of this egg, if it exists.
If it does not exist, there may be equivalent functionality provided by another egg; have a look at the egg index. Otherwise, please consider porting this egg to the current version of CHICKEN.
TOC »
honu
Usage
(require-extension honu)
Author
Documentation
This is a parser for "Honu" syntax.
Honu syntax resembles Java, instead of Scheme. Like Scheme, however, Honu has no fixed syntax. Honu supports extensibility through a base syntax of H-expressions, which are analogous to S-expressions.
Ignoring whitespace, an H-expression is either
- a number
- an identifier
- a string
- a character
- a sequence of H-expressions between parentheses
- a sequence of H-expressions between square brackets
- a sequence of H-expressions between curly braces
- a comment followed by an H-expression
- #; followed by two H-expressions
- #hx followed by an H-expression
- #sx followed by an S-expression
Whitespace for H-expressions is as in Scheme: any character for which char-whitespace? returns true counts as a whitespace.
Numbers
The syntax for Honu numbers is the same as for Java. The S-expression encoding of a particular H-expression number is the obvious Scheme number.
Identifiers
The syntax for Honu identifiers is the union of Java identifiers plus semicolon (;), comma (,), and a set of operator identifiers. An operator identifier is any combination of the following characters:
+ - _ = ? : < > . ! % ^ & * / ~ |
The S-expression encoding of an H-expression identifier is the obvious Scheme symbol. Input is parsed to form maximally long identifiers. For example, the input int->int; is parsed as four H-expressions:
int, ->, int and ;.
Strings
The syntax for an H-expression string is exactly the same as for an S-expression string, and an H-expression string is represented by the obvious Scheme string.
Characters
The syntax for an H-expression character is the same as for an H-expression string that has a single content character, except that a single quote ('}) surrounds the character instead of double quotes ()). The S-expression representation of an H-expression character is the obvious Scheme character.
Parentheses, Brackets, and Braces
A parenthesized (), bracketed [], or braced {} H-expression sequence is represented by a Scheme list. The first element of the list is #%parens for a parenthesized sequence, #%brackets for a brackets sequence, or #%braces for a braced sequence. The remaining elements are the Scheme representation for the parenthesized, bracketed, or braced H-expressions in order.
Comments
An H-expression comment starts with either // or /* . In the former case, the comment runs until a linefeed or return. In the second case, the comment runs until */ , but /* .... */ comments can be nested. Comments are treated like whitespace.
#; starts an H-expression comment, as in Scheme. It is followed by an H-expression to be treated as whitespace. Note that #; is equivalent to #sx#;#hx.
Interface
read-honu
- read-honu #!key port line-numbers lnwrap flavorprocedure
Reads a single honu expression from PORT, which defaults to the value of (current-input-port) . If SHOW-LINE-NUMBERS is given and true, then parsing errors will report the offending line-number (as obtained by port-position. The optional argument WRAP may be given to wrap each read item into a user-definable structure, or to perform user-specific conversion. WRAP is called for each H-expression with the expression and the current line number as arguments replacing the H-expression with the result.
FLAVOR should be a symbol and adds additional special handling:
- vanilla
- default behaviour.
- prolog
- allows the characters #\\ and #\@ as operator characters, allows % ... as single-line comments (but not // ...), reads '...' as symbol.
- javascript
- reads '...' as string.
Previously to version 2.1 of this egg, read-honu had the following signature:
- read-honu #!optional PORT LINE-NUMBERS WRAPprocedure
This argument-list syntax is still supported but deprecated.
License
Copyright (c) 2006-2013, Felix L. Winkelmann. All rights reserved. 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 ASIS, 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.
Version history
- 2.1
- switched to keyword-based argument syntax for read-honu; added flavors
- 1.9
- allow \ as operator character
- 1.8
- ???
- 1.7
- fixed handling of comments
- 1.6
- fixed testcase
- 1.5
- ported to CHICKEN 4
- 1.4
- added support for static linking
- 1.3
- optional wrapper function argument
- 1.2
- Fixed incomplete floating-point number parsing
- 1.1
- Better error message for unexpected closing parens/brackets
- 1.0
- Initial release