1:- module(tidylog_atom_punc, [punctuation//1]).    2
    3% Define unquoted atom
    4
    5:- use_module(library(tidylog/common), [ when_generating//1
    6                                       , when_parsing//1
    7                                       ]).    8
    9punctuation(A) -->
   10    when_generating(atom_codes(A,Codes)),
   11
   12    ( grawlix(Codes)
   13    ; solo(Codes)
   14    ; brackets(Codes)
   15    ),
   16
   17    when_parsing(atom_codes(A,Codes)).
   18
   19
   20grawlix([C|Codes]) -->
   21    [C],
   22    { grawlix_char(C) },
   23    grawlix_(Codes).
   24
   25grawlix_([C|Codes]) -->
   26    [C],
   27    { grawlix_char(C) },
   28    grawlix_(Codes).
   29grawlix_([]) -->
   30    [].
   31
   32
   33grawlix_char(0'#). %' placate syntax highlighters
   34grawlix_char(0'$). %'
   35grawlix_char(0'&). %'
   36grawlix_char(0'*). %'
   37grawlix_char(0'+). %'
   38grawlix_char(0'-). %'
   39grawlix_char(0'.). %'
   40grawlix_char(0'/). %'
   41grawlix_char(0':). %'
   42grawlix_char(0'<). %'
   43grawlix_char(0'=). %'
   44grawlix_char(0'>). %'
   45grawlix_char(0'?). %'
   46grawlix_char(0'@). %'
   47grawlix_char(0'^). %'
   48grawlix_char(0'~). %'
   49
   50
   51solo([0';]) --> %'
   52    ";".
   53solo([0'!]) --> %'
   54    "!".
   55
   56
   57brackets([0'[, 0']]) -->
   58    "[]".
   59brackets([0'{,0'}]) -->
   60    "{}"