aboutsummaryrefslogtreecommitdiffstats
path: root/src/parse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.cpp')
-rw-r--r--src/parse.cpp24
1 files changed, 13 insertions, 11 deletions
diff --git a/src/parse.cpp b/src/parse.cpp
index 4f2c723..b61b971 100644
--- a/src/parse.cpp
+++ b/src/parse.cpp
@@ -55,9 +55,9 @@ eat_char(Cursor& cur, istream& in, const char character)
static const AST*
read_string(Cursor& cur, istream& in)
{
- Cursor loc = cur;
- string str;
- char c;
+ const Cursor loc = cur;
+ string str;
+ char c;
eat_char(cur, in, '"');
while ((c = read_char(cur, in)) != '"') {
switch (c) {
@@ -89,13 +89,14 @@ read_line_comment(Cursor& cur, istream& in)
static const AST*
read_list(PEnv& penv, Cursor& cur, istream& in)
{
- List list;
-
+ const Cursor loc = cur;
+ List list;
eat_char(cur, in, '(');
while (true) {
skip_space(cur, in);
if (in.peek() == ')') {
eat_char(cur, in, ')');
+ list.head->loc = loc;
return list.head;
} else {
list.push_back(penv.parse(cur, in));
@@ -127,9 +128,9 @@ read_special(Cursor& cur, istream& in)
static const AST*
read_number(Cursor& cur, istream& in)
{
- Cursor loc = cur;
- string str;
- char c;
+ const Cursor loc = cur;
+ string str;
+ char c;
while ((c = in.peek()) != EOF) {
if (isdigit(c) || c == '.')
str += read_char(cur, in);
@@ -146,8 +147,9 @@ read_number(Cursor& cur, istream& in)
static const AST*
read_symbol(PEnv& penv, Cursor& cur, istream& in)
{
- string str;
- char c;
+ const Cursor loc = cur;
+ string str;
+ char c;
while ((c = in.peek()) != EOF) {
if (!isspace(c) && c != ')' && c != '(' && c != EOF && c != -1)
str += read_char(cur, in);
@@ -155,7 +157,7 @@ read_symbol(PEnv& penv, Cursor& cur, istream& in)
break;
}
- return penv.sym(str, cur);
+ return penv.sym(str, loc);
}
/// Read an expression from @a in