Merge pull request #1404 from Kodiologist/unicode_literals
Simplify string parsing with `unicode_literals`
This commit is contained in:
commit
c69f8ebb79
@ -2,12 +2,13 @@
|
|||||||
# This file is part of Hy, which is free software licensed under the Expat
|
# This file is part of Hy, which is free software licensed under the Expat
|
||||||
# license. See the LICENSE.
|
# license. See the LICENSE.
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from ast import literal_eval
|
|
||||||
|
|
||||||
from rply import ParserGenerator
|
from rply import ParserGenerator
|
||||||
|
|
||||||
from hy._compat import PY3, str_type
|
from hy._compat import str_type
|
||||||
from hy.models import (HyBytes, HyComplex, HyCons, HyDict, HyExpression,
|
from hy.models import (HyBytes, HyComplex, HyCons, HyDict, HyExpression,
|
||||||
HyFloat, HyInteger, HyKeyword, HyList, HySet, HyString,
|
HyFloat, HyInteger, HyKeyword, HyList, HySet, HyString,
|
||||||
HySymbol)
|
HySymbol)
|
||||||
@ -265,38 +266,13 @@ def t_empty_list(p):
|
|||||||
return HyList([])
|
return HyList([])
|
||||||
|
|
||||||
|
|
||||||
if PY3:
|
|
||||||
def uni_hystring(s):
|
|
||||||
return HyString(literal_eval(s))
|
|
||||||
|
|
||||||
def hybytes(s):
|
|
||||||
return HyBytes(literal_eval('b'+s))
|
|
||||||
|
|
||||||
else:
|
|
||||||
def uni_hystring(s):
|
|
||||||
return HyString(literal_eval('u'+s))
|
|
||||||
|
|
||||||
def hybytes(s):
|
|
||||||
return HyBytes(literal_eval(s))
|
|
||||||
|
|
||||||
|
|
||||||
@pg.production("string : STRING")
|
@pg.production("string : STRING")
|
||||||
@set_boundaries
|
@set_boundaries
|
||||||
def t_string(p):
|
def t_string(p):
|
||||||
# remove trailing quote
|
# Replace the single double quotes with triple double quotes to allow
|
||||||
s = p[0].value[:-1]
|
# embedded newlines.
|
||||||
# get the header
|
s = eval(p[0].value.replace('"', '"""', 1)[:-1] + '"""')
|
||||||
header, s = s.split('"', 1)
|
return (HyString if isinstance(s, str_type) else HyBytes)(s)
|
||||||
# remove unicode marker (this is redundant because Hy string
|
|
||||||
# literals already, by default, generate Unicode literals
|
|
||||||
# under Python 2)
|
|
||||||
header = header.replace("u", "")
|
|
||||||
# remove bytes marker, since we'll need to exclude it for Python 2
|
|
||||||
is_bytestring = "b" in header
|
|
||||||
header = header.replace("b", "")
|
|
||||||
# build python string
|
|
||||||
s = header + '"""' + s + '"""'
|
|
||||||
return (hybytes if is_bytestring else uni_hystring)(s)
|
|
||||||
|
|
||||||
|
|
||||||
@pg.production("string : PARTIAL_STRING")
|
@pg.production("string : PARTIAL_STRING")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user