34 lines
1.7 KiB
Plaintext
34 lines
1.7 KiB
Plaintext
[[wp:S-Expression|S-Expressions]] are one convenient way to parse and store data.
|
|
|
|
|
|
;Task:
|
|
Write a simple reader and writer for S-Expressions that handles quoted and unquoted strings, integers and floats.
|
|
|
|
The reader should read a single but nested S-Expression from a string and store it in a suitable datastructure (list, array, etc).
|
|
|
|
Newlines and other whitespace may be ignored unless contained within a quoted string.
|
|
|
|
“<tt>()</tt>” inside quoted strings are not interpreted, but treated as part of the string.
|
|
|
|
Handling escaped quotes inside a string is optional; thus “<tt>(foo"bar)</tt>” maybe treated as a string “<tt>foo"bar</tt>”, or as an error.
|
|
|
|
For this, the reader need not recognize “<tt>\</tt>” for escaping, but should, in addition, recognize numbers if the language has appropriate datatypes.
|
|
|
|
Languages that support it may treat unquoted strings as symbols.
|
|
|
|
Note that with the exception of “<tt>()"</tt>” (“<tt>\</tt>” if escaping is supported) and whitespace there are no special characters. Anything else is allowed without quotes.
|
|
|
|
The reader should be able to read the following input
|
|
<syntaxhighlight lang="lisp">((data "quoted data" 123 4.5)
|
|
(data (!@# (4.5) "(more" "data)")))</syntaxhighlight>
|
|
and turn it into a native datastructure. (see the [[#Pike|Pike]], [[#Python|Python]] and [[#Ruby|Ruby]] implementations for examples of native data structures.)
|
|
|
|
The writer should be able to take the produced list and turn it into a new S-Expression.
|
|
Strings that don't contain whitespace or parentheses () don't need to be quoted in the resulting S-Expression, but as a simplification, any string may be quoted.
|
|
|
|
|
|
;Extra Credit:
|
|
Let the writer produce pretty printed output with indenting and line-breaks.
|
|
<br><br>
|
|
|