Skip to main content

module lang::sexp::\syntax::SExp

rascal-Not specified

Syntax definition for S-Expressions, based on http://people.csail.mit.edu/rivest/Sexp.txt

Usage​

import lang::sexp::\syntax::SExp;

Dependencies​

import String;
import IO;

syntax SExp​

start syntax SExp
= string: String
| \list: "(" SExp* ")"
;

syntax String​

syntax String
= simple: SimpleString
| display: Display SimpleString
;

syntax SimpleString​

syntax SimpleString
= raw: Raw
| token: Token
| base64: Base64
| hex: HexaDecimal
| quoted: QuotedString
;

syntax Display​

syntax Display
= bracket "[" SimpleString "]"
;

syntax Raw​

syntax Raw
= raw: Decimal >> [:] ":" !>> [\ \t\n\r] Bytes
;

syntax Decimal​

lexical Decimal
= [1-9][0-9]* !>> [0-9]
| [0]
;

syntax Bytes​

lexical Bytes
= ![]*;

syntax Token​

lexical Token
= TokenChar+ !>> [a-zA-Z0-9\-./_:*+=]
;

syntax Base64​

syntax Base64
= bracket "|" Base64Char* "|" // nb: whitespace allowed
;

syntax HexaDecimal​

syntax HexaDecimal
= bracket "#" HexDigit* "#";

syntax QuotedString​

lexical QuotedString
= [\"] QSChar* [\"]
;

syntax QSChar​

lexical QSChar
= ![\"\'\\\n\r]
| [\\][btvnfr\"\'\\]
| [\\][0-7][0-7][0-7]
| [\\][x] HexDigit HexDigit
| [\\][\n\r]
| [\\][\r][\n]
| [\\][\n][\r]
;

syntax Whitespace​

layout Whitespace
= WS* !>> [\ \t\n\r]
;

syntax WS​

lexical WS
= [\ \t\n\r]
;

syntax TokenChar​

lexical TokenChar
= Alpha
| DecimalDigit
| SimplePunc
;

syntax Alpha​

lexical Alpha
= [a-zA-Z]
;

syntax DecimalDigit​

lexical DecimalDigit
= [0-9]
;

syntax HexDigit​

lexical HexDigit
= [0-9A-Fa-f]
;

syntax SimplePunc​

lexical SimplePunc
= [\-./_:*+=]
;

syntax Base64Char​

lexical Base64Char
= Alpha
| DecimalDigit
| [+/=]
;

function raw​

Raw raw(Decimal d, Bytes bs)

function unparse​

str unparse(Bytes _)

str unparse(Decimal _)