]> ocean-lang.org Git - ocean/log
ocean
6 years agooceani: detect and report tails on numbers and strings. StoneyCreek StoneyCreek-2
NeilBrown [Mon, 19 Feb 2018 06:48:44 +0000 (17:48 +1100)]
oceani: detect and report tails on numbers and strings.

Currently illegal, so we should say so.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoscanner: capture the tail of a string.
NeilBrown [Mon, 19 Feb 2018 06:47:00 +0000 (17:47 +1100)]
scanner: capture the tail of a string.

A string can have a tail,
   "hello"xy

where the "xy" might one day have a meaning (utf8? utf16??).

We should capture that.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agooceani: track where each variable was declared.
NeilBrown [Mon, 19 Feb 2018 06:08:11 +0000 (17:08 +1100)]
oceani: track where each variable was declared.

This allows better error messages when they are
redeclared.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agooceani: minimal error tracking.
NeilBrown [Mon, 19 Feb 2018 05:58:40 +0000 (16:58 +1100)]
oceani: minimal error tracking.

1/ If the parser hits an error, catch it at eof by having
    Program -> ERROR
2/ Allow the presence of and error to be recorded in the context.
3/ If an error occured, don't try to run, and do exit with an error
   status.

Now, at last, we get told where the error was.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agooceani: handle NULL from parse_oceani()
NeilBrown [Mon, 19 Feb 2018 05:54:03 +0000 (16:54 +1100)]
oceani: handle NULL from parse_oceani()

If the parsed finds nothing, it will return a pointer
to a NULL.  We need to be careful not to deref this
in printing, analysis, or execution.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agooceani: Expression etc should be 'exec', not 'binode'.
NeilBrown [Mon, 19 Feb 2018 05:46:04 +0000 (16:46 +1100)]
oceani: Expression etc should be 'exec', not 'binode'.

As a 'var' and a 'val' are possible expressions,
'binode' isn't correct.  This is obvious when you
consider that I needed to case $1 for a var or var
before assigning it to $0 for Factor -> Value etc.

So change all these to expect the more generic 'struct exec *'.

Without this change, error handling can try to free a var as though it
was a binode, and get into trouble.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoparsergen: enable error handling.
NeilBrown [Mon, 19 Feb 2018 05:40:06 +0000 (16:40 +1100)]
parsergen: enable error handling.

The error handling code currently aborts early because
it was badly broken.
After recent changes it works well enough for experimenting,
so remove the exit(1) and other unnecessary code, and
let's experiment.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoparsergen: improve symbol-discard in error handling.
NeilBrown [Mon, 19 Feb 2018 05:38:12 +0000 (16:38 +1100)]
parsergen: improve symbol-discard in error handling.

As we don't keep the full look-ahead set, we need to pay a
bit more attention when discarding input symbols, looking
for one we recognize.  We need to consider anything
that can be shifted in any state we can reach by simple
shifting.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoparsergen: be careful shifting TK_error
NeilBrown [Mon, 19 Feb 2018 05:31:14 +0000 (16:31 +1100)]
parsergen: be careful shifting TK_error

shift() behaved a little differently when p.tos == 0,
and if the stack is completely empty, there is little
point trying to shift TK_error as there is no state
to work with.

So rearrange the loop slightly.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoparsergen: document min_prefix and starts_line.
NeilBrown [Mon, 19 Feb 2018 05:23:27 +0000 (16:23 +1100)]
parsergen: document min_prefix and starts_line.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoparsergen: remove symbol synthesis option.
NeilBrown [Mon, 19 Feb 2018 04:32:46 +0000 (15:32 +1100)]
parsergen: remove symbol synthesis option.

This idea never worked, and cannot work as we cannot
magically synthesis the ast node to go with a synthesized
symbol.
If we want to synthesize something on error, we just use
a production like
   foo -> ERRROR ${ $0 = a_new_for(); }$

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoscanner: fix calculation of column.
NeilBrown [Sun, 18 Feb 2018 05:10:59 +0000 (16:10 +1100)]
scanner: fix calculation of column.

When we stripe the expected indent from the
start of each line, we need to update 'col'
to correctly account for tabs.
Previous code effectively assumed tabs were 4 spaces.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoscanner: improve text and fix typos.
NeilBrown [Sun, 18 Feb 2018 05:10:12 +0000 (16:10 +1100)]
scanner: improve text and fix typos.

Improve the text about 'marks' to explain the difficulty
with comments and '/'.
Fix a few typos.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agooceani - add error reporting for type errors
NeilBrown [Sat, 17 Feb 2018 08:20:53 +0000 (19:20 +1100)]
oceani - add error reporting for type errors

This is still rough, but it is at least a
basis to work on.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoscanner: fix silly error calling indent_tab()
NeilBrown [Sat, 17 Feb 2018 08:19:34 +0000 (19:19 +1100)]
scanner: fix silly error calling indent_tab()

Wrong sort of value is passed.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agooceani: pass parse_context through propagate_types
NeilBrown [Sat, 17 Feb 2018 08:02:57 +0000 (19:02 +1100)]
oceani: pass parse_context through propagate_types

This will allow more context for error messages.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agooceani: fix type analysis for 'while' condition.
NeilBrown [Sat, 17 Feb 2018 01:01:08 +0000 (12:01 +1100)]
oceani: fix type analysis for 'while' condition.

The condition in a 'while' can always return Bool,
or may return some other consistent type.
This requires extra subtlety in analysis.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoNew lang: Stoney Creek
NeilBrown [Wed, 31 Jan 2018 03:25:16 +0000 (14:25 +1100)]
New lang: Stoney Creek

This is the second iteration of language design.
it adds scopes variables.
Variables must be declared before use, but they
can be declared in both branches of an 'if', then
used afterwards as the one variable.

No hole-in-scope is allowed: names that are declared
cannot be redeclared in a subordinate scope.

A test program is included:
   make sayhello

Note that there are no useful error messages yet.
That is the next step.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoscanner: fix parsing of comments.
NeilBrown [Sun, 11 Feb 2018 08:07:55 +0000 (19:07 +1100)]
scanner: fix parsing of comments.

If '/' is a known mark, then "//" and "/*" comments don't get
parsed properly.  Add handling for this case.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoparsergen.mdc: add precedence handling
NeilBrown [Mon, 29 Jan 2018 05:20:01 +0000 (16:20 +1100)]
parsergen.mdc: add precedence handling

This hasn't been documented properly in the text yet, but
the example has been changed to work and it seems good.

There is no support for precedence to select between two
reductions because I don't believe that ever happens :-) and
I haven't done anything special for non-associative because
I don't know what I would do.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agoparsergen: record line number of reduce fragments.
NeilBrown [Tue, 6 Feb 2018 05:42:01 +0000 (16:42 +1100)]
parsergen: record line number of reduce fragments.

If there is an error in a code fragment used to handle
a 'reduce' action, we need the compiler to report the
correct line from the grammar file.
This information is easily available from the scanner,
we just need to pass it along.

Signed-off-by: NeilBrown <neil@brown.name>
6 years agooceani/parsergen: assorted text improvements.
NeilBrown [Mon, 29 Jan 2018 07:29:03 +0000 (18:29 +1100)]
oceani/parsergen: assorted text improvements.

Mostly typo fixes with a few improvements to clarity
or content.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agooceani.mk: make sure libstring.o gets built
NeilBrown [Tue, 17 Feb 2015 03:25:36 +0000 (14:25 +1100)]
oceani.mk: make sure libstring.o gets built

There is probably a nicer way to do this, but this seems to work.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoMore new files to .gitignore FallsCreek FallsCreek-1
NeilBrown [Mon, 13 Oct 2014 01:20:54 +0000 (12:20 +1100)]
More new files to .gitignore

Signed-off-by: NeilBrown <neil@brown.name>
9 years agooceani: propagate_types should ignore NULL better.
NeilBrown [Mon, 13 Oct 2014 01:17:37 +0000 (12:17 +1100)]
oceani: propagate_types should  ignore NULL better.

A 'NULL' is an empty statement (e.g. 'skip') or something else
that is expected to be absent, like the left-hand-side of a unary operator.

So report that it returns Vnone, but don't worry about what is
expected.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agooceani: accept newlines at start of {block}
NeilBrown [Sun, 12 Oct 2014 23:39:06 +0000 (10:39 +1100)]
oceani: accept newlines at start of {block}

This  is needed for

~~~~~~
program {
code
}
~~~~~~

to work.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agooceani: accept MULTI_STRING as well as STRING
NeilBrown [Sun, 12 Oct 2014 23:38:05 +0000 (10:38 +1100)]
oceani: accept MULTI_STRING as well as STRING

The scanner produces two types of strings - we need to accept
them both.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agooceani: allow number of command line to be negative.
NeilBrown [Sun, 12 Oct 2014 23:36:39 +0000 (10:36 +1100)]
oceani: allow number of command line to be negative.

number_parse doesn't expect leading sign, so handle it explicitly.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoParsergen: abort on error.
NeilBrown [Sun, 12 Oct 2014 23:35:06 +0000 (10:35 +1100)]
Parsergen: abort on error.

The error handling is currently completely broken and goes
into an infinite loop.
Just abort for now.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agooceani: don't try to print a 'then' clause for a switch.
NeilBrown [Sat, 11 Oct 2014 06:07:25 +0000 (17:07 +1100)]
oceani: don't try to print a 'then' clause for a switch.

'switch' doesn't have a 'then', so don't try to print it.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agooceani: memdup argument strings when assigning to a variable.
NeilBrown [Sat, 11 Oct 2014 06:04:11 +0000 (17:04 +1100)]
oceani: memdup argument strings when assigning to a variable.

string values are assumed to be in malloced memory, so
when assigning a string from the command line, copy it to malloced
memory.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agooceani: remove the 'style' link
NeilBrown [Fri, 10 Oct 2014 06:46:06 +0000 (17:46 +1100)]
oceani: remove the 'style' link

Signed-off-by: NeilBrown <neil@brown.name>
9 years agooceani: add proper 'then' handling.
NeilBrown [Tue, 7 Oct 2014 06:06:11 +0000 (17:06 +1100)]
oceani: add proper 'then' handling.

I hadn't thought about this properly before..

Signed-off-by: NeilBrown <neil@brown.name>
9 years agooceani: initial interpreted for "ocean".
NeilBrown [Fri, 3 Oct 2014 05:54:03 +0000 (15:54 +1000)]
oceani: initial interpreted for "ocean".

This is a very preliminary interpreter for a preliminary
language which is building towards being "ocean".
I call this the "Falls Creek" version.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agopargergen: typo: i, not 1. workingparser
NeilBrown [Tue, 7 Oct 2014 06:05:20 +0000 (17:05 +1100)]
pargergen: typo: i, not 1.

This makes some newline handling break.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: update description to match current reality.
NeilBrown [Fri, 3 Oct 2014 04:52:16 +0000 (14:52 +1000)]
parsergen: update description to match current reality.

In partcular, the handling of indents and newlines was a
bit out-dated.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: remove special casing for pop(0).
NeilBrown [Fri, 3 Oct 2014 04:30:36 +0000 (14:30 +1000)]
parsergen: remove special casing for pop(0).

If pop() is asked to remove nothing from the stack, it now
does exactly the right thing and returns the value that we want.
So some special-casing can be removed.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoindent_test: integrate into Makefile scheme nicely.
NeilBrown [Fri, 3 Oct 2014 04:01:45 +0000 (14:01 +1000)]
indent_test: integrate into Makefile scheme nicely.

The test code is now included in indent_test.mdc,
and there is a '.mk'.
  make tests

will run the test.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: update doc for change from 'starts line' to 'line like'
NeilBrown [Fri, 3 Oct 2014 03:37:17 +0000 (13:37 +1000)]
parsergen: update doc for change from 'starts line' to 'line like'

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparse trace: report since_newline rather than newline_permitted
NeilBrown [Fri, 3 Oct 2014 03:29:42 +0000 (13:29 +1000)]
parse trace: report since_newline rather than newline_permitted

The number in newline_permitted isn't interesting.
The number in since_newline is.  So print that.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoindent test: various fixed to match new design.
NeilBrown [Fri, 3 Oct 2014 03:29:14 +0000 (13:29 +1000)]
indent test: various fixed to match new design.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: revise rule for NEWLINE forcing reduce
NeilBrown [Fri, 3 Oct 2014 03:28:32 +0000 (13:28 +1000)]
parsergen: revise rule for NEWLINE forcing reduce

If the whole line is a single symbol, then it isn't appropriate
for a NEWLINE to force a reduce (it may be for an OUT, but as the
NEWLINE shifts (the OUT doesn't) we don't need to push so hard).

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: fix incorrect 'newline_permitted' setting.
NeilBrown [Fri, 3 Oct 2014 03:28:05 +0000 (13:28 +1000)]
parsergen: fix incorrect 'newline_permitted' setting.

If a state 'starts_line', then a newline is explicitly permitted
(once indents have gone), not explicitly denied!

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsegen: pop was not computing start_of_line properly.
NeilBrown [Fri, 3 Oct 2014 03:27:40 +0000 (13:27 +1000)]
parsegen: pop was not computing start_of_line properly.

In there is any line start in the sequence being popped,
then the new symbol is considered to start a line.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: get rid of 'next' in parser_run()
NeilBrown [Fri, 3 Oct 2014 03:26:33 +0000 (13:26 +1000)]
parsergen: get rid of 'next' in parser_run()

It isn't used for anything useful any more.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: next.indents in parser_run is always zero.
NeilBrown [Fri, 3 Oct 2014 03:26:00 +0000 (13:26 +1000)]
parsergen: next.indents in parser_run is always zero.

now that indents are counted with the previous symbol,
next.indents is always zero.  So stop using it or updating it.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: don't pass full frame to parser_trace()
NeilBrown [Fri, 3 Oct 2014 03:25:25 +0000 (13:25 +1000)]
parsergen: don't pass full frame to parser_trace()

parser_trace() only uses 2 fields, so only pass those.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: don't use 'frame' to pass args to shift() or receive from pop()
NeilBrown [Fri, 3 Oct 2014 03:24:36 +0000 (13:24 +1000)]
parsergen: don't use 'frame' to pass args to shift() or receive from pop()

'struct frame' holds a number of fields that shift()
ignores and pop() doesn't fill in.
So it is a bit confusing to see a frame passed in
and mostly ignored.

So just pass in the fields that are actually needed.
This fixes a bug where 'since_newline' was set wrongly when a newline
is shifted.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: fix handling of Newline in parse.
NeilBrown [Fri, 3 Oct 2014 03:22:29 +0000 (13:22 +1000)]
parsergen: fix handling of Newline in parse.

The required handling for 'newline' when not ignored is:

    if the current state can REDUCE and the reduction length is no
    more symbols than the frames-since-start-of-line count, we REDUCE.

'can REDUCE' removes "reduce_size >= 0", not ">".
'not more symbols' means "reduce_size <= tos->since_newline", not "<".

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: fix handling of TK_in during parse.
NeilBrown [Thu, 2 Oct 2014 11:01:41 +0000 (21:01 +1000)]
parsergen: fix handling of TK_in during parse.

Now that an 'in'  it always considered to be *after* a symbol,
we want to apply 'in' token to the current top-of-stack, not to the
'next' frame.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: remove starts_indented.
NeilBrown [Thu, 2 Oct 2014 10:59:55 +0000 (20:59 +1000)]
parsergen: remove starts_indented.

This is no longer used.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: add since_indent to stack frame.
NeilBrown [Thu, 2 Oct 2014 10:58:38 +0000 (20:58 +1000)]
parsergen: add since_indent to stack frame.

This counts frames since last indent.
It is used to determine when an OUT can be canceled and when we must
force a reduction.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: calculate and record "min_prefix" for each state.
NeilBrown [Thu, 2 Oct 2014 10:51:36 +0000 (20:51 +1000)]
parsergen: calculate and record "min_prefix" for each state.

This is needed to determine when we can cancel an TK_out.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: revise "newline_permitted" definition.
NeilBrown [Thu, 2 Oct 2014 10:51:01 +0000 (20:51 +1000)]
parsergen: revise "newline_permitted" definition.

This is in line with "new" approach.  A newline is permitted/expected
if a starts_line state is closer to top of stack than an indent.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: adjust for new definition of line_like symbols.
NeilBrown [Thu, 2 Oct 2014 10:49:59 +0000 (20:49 +1000)]
parsergen: adjust for new definition of line_like symbols.

A symbol is line-like if it is followed by a NEWLINE, or
any symbol which starts with a NEWLINE.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoMore indent_test.cgm mods.
NeilBrown [Thu, 2 Oct 2014 10:49:14 +0000 (20:49 +1000)]
More indent_test.cgm mods.

Still trying to figure it out.

Want to make sure only the right things are line-like.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoNEWLINE must only ever follow a 'linelike' symbol.
NeilBrown [Thu, 2 Oct 2014 10:47:40 +0000 (20:47 +1000)]
NEWLINE must only ever follow a 'linelike' symbol.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoNewline handling stuff
NeilBrown [Thu, 2 Oct 2014 10:45:32 +0000 (20:45 +1000)]
Newline handling stuff

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: various updates.
NeilBrown [Thu, 2 Oct 2014 10:42:04 +0000 (20:42 +1000)]
parsergen: various updates.

- add starts_line flag for symbols
- add starts_newline flag for stack frames

and related changes

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: improve tracing.
NeilBrown [Sun, 22 Jun 2014 05:18:32 +0000 (15:18 +1000)]
parsergen: improve tracing.

1/ perform the "is null?" test on trace find in parser_trace.
   code is cleaner that way

2/ Report the action at each step in the parse.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: fix up stack management
NeilBrown [Sun, 22 Jun 2014 05:12:41 +0000 (15:12 +1000)]
parsergen: fix up stack management

The stack has alternating states and symbols.  I had groups a state
with the following symbol as the first thing pushed is a state and the
next is a symbol.

It works much better to group the other ways.  First we push just state zero.
Then we push some symbol and the state which 'goto' leads to.

In particularly this keeps the 'shift' that happens after "reduce"
quite separate from the 'shift' that happens when the look-ahead is
shifted in.  Previous the post-reduce shift was stealing the indent
information that should have stayed in the look-ahead buffer.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: work-around for indent parsing problem.
NeilBrown [Sun, 15 Jun 2014 08:44:14 +0000 (18:44 +1000)]
parsergen: work-around for indent parsing problem.

These was a problem with my reasoning about parsing indents.
Resolving it properly will take a bit of work, but this little 'fix'
handles an easy case for now.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: fix return of final result.
NeilBrown [Sun, 15 Jun 2014 07:59:27 +0000 (17:59 +1000)]
parsergen: fix return of final result.

We cannot really shift the final result onto the stack, because
there is not 'goto' for '$eof' in that final state.

So if the shift() fails, hold onto the result and ultimately return it.
This means we don't need to pop it off the stack at the end.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: don't leave garbage in the $0 buffer.
NeilBrown [Sat, 31 May 2014 10:14:53 +0000 (20:14 +1000)]
parsergen: don't leave garbage in the $0 buffer.

As this is static it gets reused.  We are likely to free pointers
in it, so after doing that we should make sure it gets zeroed.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: ensure value returned from parser_run is initialised.
NeilBrown [Sat, 31 May 2014 10:14:01 +0000 (20:14 +1000)]
parsergen: ensure value returned from parser_run is initialised.

If we don't accept the program, we currently return an uninitialized
value.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: make sure result in start symbol is returned.
NeilBrown [Sat, 31 May 2014 10:12:20 +0000 (20:12 +1000)]
parsergen: make sure result in start symbol is returned.

Because we synthesize production-zero, we need to make sure
to add the relevant 'code' to it to preserve the returned value.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: pass 'config' in to 'reduce' function.
NeilBrown [Sat, 31 May 2014 05:56:20 +0000 (15:56 +1000)]
parsergen: pass 'config' in to 'reduce' function.

As we only support synthesise attributes and no inherited attributes,
we have no way for the reduce functions to access any context (such
as building a table of variables) except via global variables (yuck).

So pass the 'context' pointer through.  The main program can embed
this in a larger structure which contains relevant context, and
the reduce functions can find that using pointer manipulation.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoparsergen: discard text_cmp now that it is in a library
NeilBrown [Sat, 31 May 2014 05:51:22 +0000 (15:51 +1000)]
parsergen: discard text_cmp now that it is in a library

Signed-off-by: NeilBrown <neil@brown.name>
9 years agomdcode: normalise text_cmp and export it.
NeilBrown [Sat, 31 May 2014 05:47:25 +0000 (15:47 +1000)]
mdcode: normalise text_cmp and export it.

It is silly using a non-standard text order when it isn't really need
and other code might benefit from having this function available.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoindent_test / parsergen: fix various memory leaks.
NeilBrown [Sun, 11 May 2014 07:18:21 +0000 (17:18 +1000)]
indent_test / parsergen: fix various memory leaks.

thanks valgrind...

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoindent_test: make use of new $<N syntax.
NeilBrown [Sun, 11 May 2014 06:59:56 +0000 (16:59 +1000)]
indent_test: make use of new $<N syntax.

This removes a lot of boring code (also removes some code that was wrong.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agopargergen: support $<N in code fragments
NeilBrown [Sun, 11 May 2014 06:58:40 +0000 (16:58 +1000)]
pargergen: support $<N in code fragments

This removes the need to add "$N = NULL" to avoid the referenced structure
being removed.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: review and update text.
NeilBrown [Sun, 11 May 2014 06:04:53 +0000 (16:04 +1000)]
parsergen: review and update text.

Fix lots of typos, improve poor descriptions, and update some text to
match recent changes.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoindent_test: make use of pointers as types for non-terminals.
NeilBrown [Sun, 11 May 2014 05:33:12 +0000 (15:33 +1000)]
indent_test: make use of pointers as types for non-terminals.

As we are building an AST, pointers work much better and clean
up the code a lot.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: allow pointers as well as struct to be associated with nonterminals.
NeilBrown [Sun, 11 May 2014 05:30:53 +0000 (15:30 +1000)]
parsergen: allow pointers as well as struct to be associated with nonterminals.

This makes it a lot easier when building up an AST.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: remove unused 'start' field from grammar.
NeilBrown [Sun, 11 May 2014 04:57:10 +0000 (14:57 +1000)]
parsergen: remove unused 'start' field from grammar.

This field is only used to see if we have found the start symbol yet,
and that can be done using "production_count".

Further, that value actually stored here is "-1" as symbol numbers
haven't been assigned yet.

So discard 'start'.  We know that the real 'start' symbol is whatever
starts production '0'.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agopargergen: make use of --tag for calc grammar
NeilBrown [Sun, 11 May 2014 04:23:10 +0000 (14:23 +1000)]
pargergen: make use of --tag for calc grammar

Rather than placing the 'calc' grammar in a separate file,
add 'calc:' tags to the sections and use --tag option to
extract the grammar directly from the pargergen.mdc file.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: add --tag option.
NeilBrown [Sun, 11 May 2014 04:21:26 +0000 (14:21 +1000)]
parsergen: add --tag option.

Normally parsergen extracts three secctions: header, code, and grammar.
With "--tag foo", it will ignore anything that doesn't start "foo:",
will extract "foo: header", "foo: code", and "foo: grammar", and only
complain if there are other "foo:" headers.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agomdcode.mdc: Allow more sections than just Example: to be ignored.
NeilBrown [Sat, 10 May 2014 10:58:02 +0000 (20:58 +1000)]
mdcode.mdc: Allow more sections than just Example: to be ignored.

"Example:" is no longer a special case.  Any section name with
starts "Word:" for some "Word", does not need to be included in
other sections.
"File:" is still a special case of that and will be stored in the
named file.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: Don't look beyond the bottom of stack...
NeilBrown [Sat, 10 May 2014 23:43:41 +0000 (09:43 +1000)]
parsergen: Don't look beyond the bottom of stack...

If the stack is empty, looking beyond for whether newlines are
permitted is dangerous.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: initialise parser.next properly.
NeilBrown [Sat, 10 May 2014 23:42:02 +0000 (09:42 +1000)]
parsergen: initialise parser.next properly.

Most fields in the 'next' frame should  be initialised to zero,
but some need to be properly initialised.  Otherwise we might not handle
early newlines correctly.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agopargergen: don't ignore first token
NeilBrown [Sat, 10 May 2014 23:40:32 +0000 (09:40 +1000)]
pargergen: don't ignore first token

When parsing the grammar we currently skip the first token by mistake.
It is often a TK_newline so not much is lost.  But not always...

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoScanner: minor text updates
NeilBrown [Tue, 3 Jun 2014 11:17:57 +0000 (21:17 +1000)]
Scanner: minor text updates

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoscanner: make sure parsing finishes properly when no final end-of-line.
NeilBrown [Tue, 3 Jun 2014 11:16:58 +0000 (21:16 +1000)]
scanner: make sure parsing finishes properly when no final end-of-line.

If the last node doesn't end with an end-of-line, we still need
to produce all delayed tokens.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoScanner: parsing of comments and strings must recognise end-of-node
NeilBrown [Tue, 3 Jun 2014 11:15:45 +0000 (21:15 +1000)]
Scanner: parsing of comments and strings must recognise end-of-node

If the file does not end in a newline, then a node might not also.

This requires a little more care in parsing strings and comments.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoscanner: clarify the interaction between parsing marks and comments/strings
NeilBrown [Tue, 3 Jun 2014 11:14:41 +0000 (21:14 +1000)]
scanner: clarify the interaction between parsing marks and comments/strings

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoscanner: fix up detection of comments blended with marks.
NeilBrown [Tue, 3 Jun 2014 11:07:58 +0000 (21:07 +1000)]
scanner: fix up detection of comments blended with marks.

If we see the start of a comment in an unknown mark, we need to
finish the mark before the start of the comment.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoScanner: Capital E and P should be usable for exponents/powers.
NeilBrown [Tue, 3 Jun 2014 10:08:13 +0000 (20:08 +1000)]
Scanner: Capital E and P should be usable for exponents/powers.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agoscanner: provide wchar includes for all clients of library.
NeilBrown [Tue, 3 Jun 2014 10:06:26 +0000 (20:06 +1000)]
scanner: provide wchar includes for all clients of library.

As we tokens found by the scanner contain unicode, we should encourage
clients of the library to include the unicode/wchar headers.

Signed-off-by: NeilBrown <neil@brown.name>
9 years agomdcode.mdc: fix error message slightly.
NeilBrown [Sat, 10 May 2014 10:31:06 +0000 (20:31 +1000)]
mdcode.mdc: fix error message slightly.

It is only sections which code which need to be referenced.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoAdd test parser for indent and linebreak handling.
NeilBrown [Sun, 4 May 2014 11:55:29 +0000 (21:55 +1000)]
Add test parser for indent and linebreak handling.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: fix a couple of typos in text. linebreakparser
NeilBrown [Sun, 4 May 2014 10:41:50 +0000 (20:41 +1000)]
parsergen: fix a couple of typos in text.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: improve tracing of parse for line-oriented details.
NeilBrown [Sun, 4 May 2014 10:40:35 +0000 (20:40 +1000)]
parsergen: improve tracing of parse for line-oriented details.

Report if each state is known to start a line, and if each
frame permits a newline.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: track when newline is permitted, and discard if not.
NeilBrown [Sun, 4 May 2014 10:31:05 +0000 (20:31 +1000)]
parsergen: track when newline is permitted, and discard if not.

A newline is only permitted (as a recognised symbol) if we are
parsing a non-indented line-like segment.
If we have seen an internal indent since the last line-like start,
newline tokens should be ignored.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: compute starts_line for each state.
NeilBrown [Sun, 4 May 2014 10:21:00 +0000 (20:21 +1000)]
parsergen: compute starts_line for each state.

Using the per-symbol "can_eol" we can deduce for each state whether
it is expected to (sometime) start a line-oriented syntax element.

The flag is "starts_line" and is made available to the parser.

Signed-off-by: NeilBrown <neilb@suse.de>
9 years agoparsergen: compute "can_eol" for each symbol.
NeilBrown [Sat, 3 May 2014 21:55:03 +0000 (07:55 +1000)]
parsergen: compute "can_eol" for each symbol.

A symbol is "can_eol" if it can derive a phrase which ends with a
newlike token.
This will allow us to recognise line-like sections of code and
thus know when to ignore newlines and when not to.

Signed-off-by: NeilBrown <neilb@suse.de>
10 years agoparsergen: add handling for TK_IN and TK_OUT indentparser
NeilBrown [Sun, 24 Nov 2013 06:54:02 +0000 (17:54 +1100)]
parsergen: add handling for TK_IN and TK_OUT

Intents are tracked.  The end of an indented region forces certain
reductions.  And indents are managed during error handling.

Signed-off-by: NeilBrown <neilb@suse.de>
10 years agoparsergen: centralise (some of) the collecting of next token.
NeilBrown [Sun, 24 Nov 2013 07:14:11 +0000 (18:14 +1100)]
parsergen: centralise (some of) the collecting of next token.

A future patch will introduce next sites where we want to
discard the current token.
Rather than calling "token_next" at each site, make it possible
to just set "tk = NULL", and the next token will automatically
be collected when needed.

Signed-off-by: NeilBrown <neilb@suse.de>
10 years agoparsergen: recorded a prefered shift-symbol for error recovery.
NeilBrown [Sun, 24 Nov 2013 06:50:09 +0000 (17:50 +1100)]
parsergen: recorded a prefered shift-symbol for error recovery.

When we find there is no valid parse step, one option that we don't
currently try is to synthesize a symbol and shift it.  i.e. insert a
missing symbol.

A future patch will provide a circumstance where this is the ideal
response, so here we choose a symbol which could usefully be shifted.
We choose the one that will get us closest to the end of a production.

Signed-off-by: NeilBrown <neilb@suse.de>
10 years agoparsegen: unify the "next" frame to go onto stack.
NeilBrown [Sun, 24 Nov 2013 06:36:41 +0000 (17:36 +1100)]
parsegen: unify the "next" frame to go onto stack.

We current have a current 'state' in the parser and a 'sym'
which is a local variable passed around in different ways.
Both of these get pushed onto the stack at the next 'shift'.

We will shortly add some more fields to the stack frame, so unify
'state' and 'sym' in to a 'next' struct in the parser struct which can
easily be extended.

Signed-off-by: NeilBrown <neilb@suse.de>