11import { parser , type Parser } from '../../parsing.js'
22import { optionallySurroundedByParentheses } from './parentheses.js'
3+ import { whitespace } from './trivia.js'
34
45export type Atom = string
56
@@ -9,31 +10,62 @@ export const isAtom = (value: unknown): value is Atom =>
910export const unit = '' as const
1011
1112export const atomParser : Parser < Atom > = optionallySurroundedByParentheses (
12- parser . map (
13- parser . lazy ( ( ) => parser . oneOf ( [ quotedAtom , unquotedAtom ] ) ) ,
14- output => output . join ( '' ) ,
15- ) ,
13+ parser . lazy ( ( ) => parser . oneOf ( [ quotedAtom , unquotedAtom ] ) ) ,
14+ )
15+
16+ const quotedAtom = parser . map (
17+ parser . sequence ( [
18+ parser . as ( parser . literal ( '"' ) , '' ) ,
19+ parser . map (
20+ parser . zeroOrMore (
21+ parser . oneOf ( [
22+ parser . butNot (
23+ parser . anySingleCharacter ,
24+ parser . oneOf ( [ parser . literal ( '"' ) , parser . literal ( '\\' ) ] ) ,
25+ '`"` or `\\`' ,
26+ ) ,
27+ parser . as ( parser . literal ( '\\"' ) , '"' ) ,
28+ parser . as ( parser . literal ( '\\\\' ) , '\\' ) ,
29+ ] ) ,
30+ ) ,
31+ output => output . join ( '' ) ,
32+ ) ,
33+ parser . as ( parser . literal ( '"' ) , '' ) ,
34+ ] ) ,
35+ ( [ _1 , contents , _2 ] ) => contents ,
1636)
1737
18- const quotedAtom = parser . sequence ( [
19- parser . as ( parser . literal ( '"' ) , '' ) ,
20- parser . map (
21- parser . zeroOrMore (
38+ const unquotedAtom = parser . map (
39+ parser . oneOrMore (
40+ parser . butNot (
41+ parser . anySingleCharacter ,
2242 parser . oneOf ( [
23- parser . butNot (
24- parser . anySingleCharacter ,
25- parser . oneOf ( [ parser . literal ( '"' ) , parser . literal ( '\\' ) ] ) ,
26- '`"` or `\\`' ,
27- ) ,
28- parser . as ( parser . literal ( '\\"' ) , '"' ) ,
29- parser . as ( parser . literal ( '\\\\' ) , '\\' ) ,
43+ whitespace ,
44+ parser . literal ( '"' ) ,
45+ parser . literal ( '{' ) ,
46+ parser . literal ( '}' ) ,
47+ parser . literal ( '[' ) ,
48+ parser . literal ( ']' ) ,
49+ parser . literal ( '(' ) ,
50+ parser . literal ( ')' ) ,
51+ parser . literal ( '<' ) ,
52+ parser . literal ( '>' ) ,
53+ parser . literal ( '#' ) ,
54+ parser . literal ( '&' ) ,
55+ parser . literal ( '|' ) ,
56+ parser . literal ( '\\' ) ,
57+ parser . literal ( '=' ) ,
58+ parser . literal ( ':' ) ,
59+ parser . literal ( ';' ) ,
60+ parser . literal ( ',' ) ,
61+ parser . literal ( '//' ) ,
62+ parser . literal ( '/*' ) ,
63+ parser . literal ( '*/' ) ,
3064 ] ) ,
65+ 'a forbidden character sequence' ,
3166 ) ,
32- output => output . join ( '' ) ,
3367 ) ,
34- parser . as ( parser . literal ( '"' ) , '' ) ,
35- ] )
36-
37- const unquotedAtom = parser . oneOrMore (
38- parser . regularExpression ( / [ ^ \s { } [ \] ( ) < > # & \| \\ = : ; , ] + / ) ,
68+ characters => characters . join ( '' ) ,
3969)
70+
71+ export { unquotedAtom as unquotedAtomParser }
0 commit comments