Add support for block strings
Signed-off-by: Jeremie Dimino <jdimino@janestreet.com>
This commit is contained in:
parent
b7afc006ee
commit
5b01ed8246
|
@ -56,6 +56,10 @@ type escape_sequence =
|
||||||
| Other
|
| Other
|
||||||
|
|
||||||
let escaped_buf = Buffer.create 256
|
let escaped_buf = Buffer.create 256
|
||||||
|
|
||||||
|
type block_string_line_kind =
|
||||||
|
| With_escape_sequences
|
||||||
|
| Raw
|
||||||
}
|
}
|
||||||
|
|
||||||
let comment = ';' [^ '\n' '\r']*
|
let comment = ';' [^ '\n' '\r']*
|
||||||
|
@ -143,7 +147,8 @@ and quoted_string_after_escaped_newline strict = parse
|
||||||
|
|
||||||
and escape_sequence strict = parse
|
and escape_sequence strict = parse
|
||||||
| newline
|
| newline
|
||||||
{ Newline }
|
{ Lexing.new_line lexbuf;
|
||||||
|
Newline }
|
||||||
| ['\\' '\'' '"' 'n' 't' 'b' 'r'] as c
|
| ['\\' '\'' '"' 'n' 't' 'b' 'r'] as c
|
||||||
{ let c =
|
{ let c =
|
||||||
match c with
|
match c with
|
||||||
|
@ -223,7 +228,7 @@ and token = parse
|
||||||
| '"'
|
| '"'
|
||||||
{ Buffer.clear escaped_buf;
|
{ Buffer.clear escaped_buf;
|
||||||
let start = Lexing.lexeme_start_p lexbuf in
|
let start = Lexing.lexeme_start_p lexbuf in
|
||||||
let s = quoted_string true lexbuf in
|
let s = dune_quoted_string lexbuf in
|
||||||
lexbuf.lex_start_p <- start;
|
lexbuf.lex_start_p <- start;
|
||||||
Quoted_string s
|
Quoted_string s
|
||||||
}
|
}
|
||||||
|
@ -231,3 +236,71 @@ and token = parse
|
||||||
{ Token.Atom (A s) }
|
{ Token.Atom (A s) }
|
||||||
| eof
|
| eof
|
||||||
{ Eof }
|
{ Eof }
|
||||||
|
|
||||||
|
and dune_quoted_string = parse
|
||||||
|
| "\\|"
|
||||||
|
{ block_string_start With_escape_sequences lexbuf }
|
||||||
|
| "\\>"
|
||||||
|
{ block_string_start Raw lexbuf }
|
||||||
|
| ""
|
||||||
|
{ quoted_string true lexbuf }
|
||||||
|
|
||||||
|
and block_string_start kind = parse
|
||||||
|
| newline as s
|
||||||
|
{ Lexing.new_line lexbuf;
|
||||||
|
Buffer.add_string escaped_buf s;
|
||||||
|
block_string_after_newline lexbuf
|
||||||
|
}
|
||||||
|
| ' '
|
||||||
|
{ match kind with
|
||||||
|
| With_escape_sequences -> block_string lexbuf
|
||||||
|
| Raw -> raw_block_string lexbuf
|
||||||
|
}
|
||||||
|
| eof
|
||||||
|
{ Buffer.contents escaped_buf
|
||||||
|
}
|
||||||
|
| _
|
||||||
|
{ error lexbuf "There must be at least one space after \"\\|"
|
||||||
|
}
|
||||||
|
|
||||||
|
and block_string = parse
|
||||||
|
| newline as s
|
||||||
|
{ Lexing.new_line lexbuf;
|
||||||
|
Buffer.add_string escaped_buf s;
|
||||||
|
block_string_after_newline lexbuf
|
||||||
|
}
|
||||||
|
| '\\'
|
||||||
|
{ match escape_sequence true lexbuf with
|
||||||
|
| Newline -> block_string_after_newline lexbuf
|
||||||
|
| Other -> block_string lexbuf
|
||||||
|
}
|
||||||
|
| _ as c
|
||||||
|
{ Buffer.add_char escaped_buf c;
|
||||||
|
block_string lexbuf
|
||||||
|
}
|
||||||
|
| eof
|
||||||
|
{ Buffer.contents escaped_buf
|
||||||
|
}
|
||||||
|
|
||||||
|
and block_string_after_newline = parse
|
||||||
|
| blank* "\"\\|"
|
||||||
|
{ block_string_start With_escape_sequences lexbuf }
|
||||||
|
| blank* "\"\\>"
|
||||||
|
{ block_string_start Raw lexbuf }
|
||||||
|
| ""
|
||||||
|
{ Buffer.contents escaped_buf
|
||||||
|
}
|
||||||
|
|
||||||
|
and raw_block_string = parse
|
||||||
|
| newline as s
|
||||||
|
{ Lexing.new_line lexbuf;
|
||||||
|
Buffer.add_string escaped_buf s;
|
||||||
|
block_string_after_newline lexbuf
|
||||||
|
}
|
||||||
|
| _ as c
|
||||||
|
{ Buffer.add_char escaped_buf c;
|
||||||
|
raw_block_string lexbuf
|
||||||
|
}
|
||||||
|
| eof
|
||||||
|
{ Buffer.contents escaped_buf
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,14 @@
|
||||||
test-cases/bad-alias-error
|
test-cases/bad-alias-error
|
||||||
(progn (run ${exe:cram.exe} -test run.t) (diff? run.t run.t.corrected))))))
|
(progn (run ${exe:cram.exe} -test run.t) (diff? run.t run.t.corrected))))))
|
||||||
|
|
||||||
|
(alias
|
||||||
|
((name block-strings)
|
||||||
|
(deps ((package dune) (files_recursively_in test-cases/block-strings)))
|
||||||
|
(action
|
||||||
|
(chdir
|
||||||
|
test-cases/block-strings
|
||||||
|
(progn (run ${exe:cram.exe} -test run.t) (diff? run.t run.t.corrected))))))
|
||||||
|
|
||||||
(alias
|
(alias
|
||||||
((name byte-code-only)
|
((name byte-code-only)
|
||||||
(deps ((package dune) (files_recursively_in test-cases/byte-code-only)))
|
(deps ((package dune) (files_recursively_in test-cases/byte-code-only)))
|
||||||
|
@ -521,6 +529,7 @@
|
||||||
(deps
|
(deps
|
||||||
((alias aliases)
|
((alias aliases)
|
||||||
(alias bad-alias-error)
|
(alias bad-alias-error)
|
||||||
|
(alias block-strings)
|
||||||
(alias byte-code-only)
|
(alias byte-code-only)
|
||||||
(alias c-stubs)
|
(alias c-stubs)
|
||||||
(alias configurator)
|
(alias configurator)
|
||||||
|
@ -583,6 +592,7 @@
|
||||||
(deps
|
(deps
|
||||||
((alias aliases)
|
((alias aliases)
|
||||||
(alias bad-alias-error)
|
(alias bad-alias-error)
|
||||||
|
(alias block-strings)
|
||||||
(alias byte-code-only)
|
(alias byte-code-only)
|
||||||
(alias c-stubs)
|
(alias c-stubs)
|
||||||
(alias configurator)
|
(alias configurator)
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
; Example script taken from re2
|
||||||
|
|
||||||
|
; With normal strings
|
||||||
|
(alias
|
||||||
|
((name old)
|
||||||
|
(action (echo "\
|
||||||
|
ARFLAGS=rsc
|
||||||
|
CXX=g++
|
||||||
|
CXXFLAGS=\"-Wall -O3 -g -pthread\"
|
||||||
|
if ! ${.ARCH_SIXTYFOUR}; then
|
||||||
|
CXX=\"$CXX -m32\"
|
||||||
|
fi
|
||||||
|
${.MAKE} -s -C libre2 clean
|
||||||
|
${.MAKE} -s -C libre2 \\
|
||||||
|
ARFLAGS=\"$ARFLAGS\" \\
|
||||||
|
CXX=\"$CXX\" \\
|
||||||
|
CXXFLAGS=\"$CXXFLAGS\" \\
|
||||||
|
obj/libre2.a obj/so/libre2.so
|
||||||
|
cp libre2/obj/libre2.a libre2_c_stubs.a
|
||||||
|
cp libre2/obj/so/libre2.so dllre2_c_stubs.so
|
||||||
|
${.MAKE} -s -C libre2 clean
|
||||||
|
"))))
|
||||||
|
|
||||||
|
; With block strings
|
||||||
|
(alias
|
||||||
|
((name new)
|
||||||
|
(action (echo "\> ARFLAGS=rsc
|
||||||
|
"\> CXX=g++
|
||||||
|
"\> CXXFLAGS="-Wall -O3 -g -pthread"
|
||||||
|
"\> if ! ${.ARCH_SIXTYFOUR}; then
|
||||||
|
"\> CXX="$CXX -m32"
|
||||||
|
"\> fi
|
||||||
|
"\> ${.MAKE} -s -C libre2 clean
|
||||||
|
"\> ${.MAKE} -s -C libre2 \
|
||||||
|
"\> ARFLAGS="$ARFLAGS" \
|
||||||
|
"\> CXX="$CXX" \
|
||||||
|
"\> CXXFLAGS="$CXXFLAGS" \
|
||||||
|
"\> obj/libre2.a obj/so/libre2.so
|
||||||
|
"\> cp libre2/obj/libre2.a libre2_c_stubs.a
|
||||||
|
"\> cp libre2/obj/so/libre2.so dllre2_c_stubs.so
|
||||||
|
"\> ${.MAKE} -s -C libre2 clean
|
||||||
|
))))
|
||||||
|
|
||||||
|
(alias
|
||||||
|
((name quoting-test)
|
||||||
|
(action (echo "\| normal: \065
|
||||||
|
"\> raw: \065
|
||||||
|
))))
|
|
@ -0,0 +1,37 @@
|
||||||
|
$ dune build @old
|
||||||
|
ARFLAGS=rsc
|
||||||
|
CXX=g++
|
||||||
|
CXXFLAGS="-Wall -O3 -g -pthread"
|
||||||
|
if ! ${.ARCH_SIXTYFOUR}; then
|
||||||
|
CXX="$CXX -m32"
|
||||||
|
fi
|
||||||
|
${.MAKE} -s -C libre2 clean
|
||||||
|
${.MAKE} -s -C libre2 \
|
||||||
|
ARFLAGS="$ARFLAGS" \
|
||||||
|
CXX="$CXX" \
|
||||||
|
CXXFLAGS="$CXXFLAGS" \
|
||||||
|
obj/libre2$ext_lib obj/so/libre2$ext_dll
|
||||||
|
cp libre2/obj/libre2$ext_lib libre2_c_stubs$ext_lib
|
||||||
|
cp libre2/obj/so/libre2$ext_dll dllre2_c_stubs$ext_dll
|
||||||
|
${.MAKE} -s -C libre2 clean
|
||||||
|
|
||||||
|
$ dune build @new
|
||||||
|
ARFLAGS=rsc
|
||||||
|
CXX=g++
|
||||||
|
CXXFLAGS="-Wall -O3 -g -pthread"
|
||||||
|
if ! ${.ARCH_SIXTYFOUR}; then
|
||||||
|
CXX="$CXX -m32"
|
||||||
|
fi
|
||||||
|
${.MAKE} -s -C libre2 clean
|
||||||
|
${.MAKE} -s -C libre2 \
|
||||||
|
ARFLAGS="$ARFLAGS" \
|
||||||
|
CXX="$CXX" \
|
||||||
|
CXXFLAGS="$CXXFLAGS" \
|
||||||
|
obj/libre2$ext_lib obj/so/libre2$ext_dll
|
||||||
|
cp libre2/obj/libre2$ext_lib libre2_c_stubs$ext_lib
|
||||||
|
cp libre2/obj/so/libre2$ext_dll dllre2_c_stubs$ext_dll
|
||||||
|
${.MAKE} -s -C libre2 clean
|
||||||
|
|
||||||
|
$ dune build @quoting-test
|
||||||
|
normal: A
|
||||||
|
raw: \065
|
Loading…
Reference in New Issue