9 months agooceani-tests: add test for declaring a CondScope variable
NeilBrown [Sat, 30 Oct 2021 04:49:08 +0000 (15:49 +1100)]
oceani-tests: add test for declaring a CondScope variable

If a variable was declared in all branches of a structures command, it
may or may not be declared as something else afterwards.
We need to test both options.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani-tests: add test for unknown field name.
NeilBrown [Sat, 30 Oct 2021 04:25:40 +0000 (15:25 +1100)]
oceani-tests: add test for unknown field name.

Test that we get error if unknown field is requested.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani: improve test coverage
NeilBrown [Sat, 30 Oct 2021 04:19:39 +0000 (15:19 +1100)]
oceani: improve test coverage

Add a tool 'mark-untest' which adds comments to untested lines.
Then resolve some of them, either adding more tests, or marking
lines as NOTEST

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani-tests: make it possible to skip valgrind tests.
NeilBrown [Sat, 30 Oct 2021 04:00:03 +0000 (15:00 +1100)]
oceani-tests: make it possible to skip valgrind tests.

valgrind tests are slow and not always wanted, particilarly when
examining coverage.  So make it easy to skip them.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agoocean: change program to receive argc and argv
NeilBrown [Sat, 30 Oct 2021 03:23:46 +0000 (14:23 +1100)]
ocean: change program to receive argc and argv

Rather than a list of strings, a "program" now receives and arg count,
and an array of strings with that size.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani: move variable values to a stack frame.
NeilBrown [Sun, 17 Oct 2021 10:03:01 +0000 (21:03 +1100)]
oceani: move variable values to a stack frame.

We have two frames - one for global values (currently always constant)
and one for local variables.
When we get functions, the local variable frame will be managed with a
stack of frames.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani: fix some incorrect section headers.
NeilBrown [Sun, 17 Oct 2021 09:29:16 +0000 (20:29 +1100)]
oceani: fix some incorrect section headers.

section header that just introduce code are 6 deep, not 2.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani: clean up interp_prog()
NeilBrown [Sun, 17 Oct 2021 02:45:18 +0000 (13:45 +1100)]
oceani: clean up interp_prog()

In particular, use dup_value() to save the command arguments.
But also re-arrange code to make steps a bit cleaner.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani: add parse_context arg to all interp functions, and a few others.
NeilBrown [Sun, 17 Oct 2021 02:35:58 +0000 (13:35 +1100)]
oceani: add parse_context arg to all interp functions, and a few others.

When I switch variables to use a stack frame, I'll need the
parse_context available more broadly (as it will hold the stack).
So add it to a selection of functions now.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani: differentiate static-sized arrays from others.
NeilBrown [Sat, 16 Oct 2021 05:58:42 +0000 (16:58 +1100)]
oceani: differentiate static-sized arrays from others.

Some arrays will always have the same size - a static size.
Others might have a different size each time their scope is entered, if
the size is calculates from a variable.

The latter need to be reallocated whenever scope is entered, the former
do not.

This will matter when we create call frames to be able to handle

So detect and handle the difference now.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani: don't allocate init value for non-initialized fields.
NeilBrown [Sat, 16 Oct 2021 05:27:41 +0000 (16:27 +1100)]
oceani: don't allocate init value for non-initialized fields.

Struct fields that aren't explicitly initialised must be initialized to
a 'null' value.  This can happen at interp-time.  There is no need to
allocate a null value when parsing.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani: implement struct field initialisation properly.
NeilBrown [Sat, 16 Oct 2021 05:09:59 +0000 (16:09 +1100)]
oceani: implement struct field initialisation properly.

I wasn't testing default initial values for struct fields, so of course
it didn't work.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani: move ->prepare_type call (back) into val_alloc()
NeilBrown [Thu, 14 Oct 2021 02:59:34 +0000 (13:59 +1100)]
oceani: move ->prepare_type call (back) into val_alloc()

This ensures it is called for struct fields as well.

Signed-off-by: NeilBrown <neil@brown.name>
9 months agooceani: handle variable-sized arrays better.
NeilBrown [Thu, 14 Oct 2021 02:43:02 +0000 (13:43 +1100)]
oceani: handle variable-sized arrays better.

An array with size set by a constant variable(!) might have a different
size each time the declaration is encountered.  So we need to
re-evaluate the size each time.
We currently re-evaluate the size only if it is zero.

So for numerical-constant sized arrays, evaluate size during parsing.
For other arrays, re-evaulate each time using a new prepare_type method.

Signed-off-by: NeilBrown <neil@brown.name>
10 months agooceani: fix a couple of issues
NeilBrown [Tue, 12 Oct 2021 10:28:47 +0000 (21:28 +1100)]
oceani: fix a couple of issues

1/ when a variable declared in a loop was re-initialized, we didn't free
   the old value before allocating a new one.
2/ When assigning to an out-of-bounds array index, created an rval,
   but never freed it.

Signed-off-by: NeilBrown <neil@brown.name>
10 months agooceani - discard anon_typelist
NeilBrown [Sat, 9 Oct 2021 21:14:04 +0000 (08:14 +1100)]
oceani - discard anon_typelist

Don't keep anon types on a separate list, use the same list but given
them an empty name.

This allows us to use add_type() for adding all types.

Signed-off-by: NeilBrown <neil@brown.name>
10 months agooceani: drop 'array' field from the 'value' union.
NeilBrown [Sat, 9 Oct 2021 01:05:51 +0000 (12:05 +1100)]
oceani: drop 'array' field from the 'value' union.

This field was never used - we use the generic 'ptr'.

Signed-off-by: NeilBrown <neil@brown.name>
10 months agoparsergen: require all terms to be declared if any are.
NeilBrown [Thu, 7 Oct 2021 00:13:44 +0000 (11:13 +1100)]
parsergen: require all terms to be declared if any are.

The previous implementation only required all terms used for the first
time after a $TERM declaration to be declared.  That isn't really

So change it to only set the default symbol type of Term after all the
grammar is parsed, and then only if not $TERM declarations were found.

This highlights that various terminals in ocean weren't declared, so
declare them now.

Signed-off-by: NeilBrown <neil@brown.name>
10 months agooceani: drop parse_value method for types.
NeilBrown [Sat, 2 Oct 2021 22:57:40 +0000 (09:57 +1100)]
oceani: drop parse_value method for types.

The args to 'program' are now all strings.  The program itself needs to
convert to numbers etc as needed.
So we don't need 'parse_value' any more.

Signed-off-by: NeilBrown <neil@brown.name>
10 months agoocean: introduce prefix op for string->number conversion.
NeilBrown [Sat, 2 Oct 2021 22:36:50 +0000 (09:36 +1100)]
ocean: introduce prefix op for string->number conversion.

Rather than having magic conversion of command line args to numbers as
needed, introduce '$' as a prefix op to to the conversion.
This is a step towards changing 'program' to be a 'main' function.

Signed-off-by: NeilBrown <neil@brown.name>
10 months agooceani: separate types out from values
NeilBrown [Wed, 29 Sep 2021 22:21:15 +0000 (08:21 +1000)]
oceani: separate types out from values

Rather than embed the type in ever value, keep it separate.
This allows arrays without duplicating the member-type information.

Also review and clean up the commentary.

Signed-off-by: NeilBrown <neil@brown.name>
16 months agoparsergen: add missing {}
NeilBrown [Tue, 6 Apr 2021 22:02:20 +0000 (08:02 +1000)]
parsergen: add missing {}

These have ALWAYS been missing, yet the code mostly worked.  Weird.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: doco updates
NeilBrown [Wed, 10 Mar 2021 05:14:20 +0000 (16:14 +1100)]
parsergen: doco updates

Minor revision to descriptive text following all the recent changes.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: don't bother with indent_depth
NeilBrown [Wed, 10 Mar 2021 04:26:59 +0000 (15:26 +1100)]
parsergen: don't bother with indent_depth

We don't need to store the indent_depth if we just shift the bit-stack
up and down.  <<1 pushes a zero, >>1 pops, |=1 changes the zero to one.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agooceani: updates for new approach to parsing indents.
NeilBrown [Wed, 10 Mar 2021 01:37:46 +0000 (12:37 +1100)]
oceani: updates for new approach to parsing indents.

Now that IN is a valid stand-alone token, it makes sense to change the
grammar for ocean.
We don't need the ':' before an indent if there is some other terminal
there.  So:


doesn't require any ':'.
We use the ':' to separate an expression from following statements,
in 'if' and 'while' and 'case'.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoUpdate indent_test grammer to align with new approach
NeilBrown [Wed, 10 Mar 2021 01:13:05 +0000 (12:13 +1100)]
Update indent_test grammer to align with new approach

Indents are now now handled very differently.  Update itest
grammar to match.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: add support for EOL token
NeilBrown [Wed, 10 Mar 2021 00:49:24 +0000 (11:49 +1100)]
parsergen: add support for EOL token

And EOL token is generated when a NEWLINE is found and an EOL can be
shifted.  This allows a product to declare that it must finish at the
end of a line, without consuming the NEWLINE.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: implement new handling of IN/OUT and NEWLINE
NeilBrown [Wed, 10 Mar 2021 00:38:55 +0000 (11:38 +1100)]
parsergen: implement new handling of IN/OUT and NEWLINE

IN/OUT are now expected in the grammar.
In a state where an IN can be shifted, IN symbols are significant to the
grammar.  IN symbols appearing anywhere else are ignored (except for how
they affect NEWLINEs).

OUT symbols are ignored precisely when the matching IN was ignored.

NEWLINEs are ignored if the most recent IN was ignored, otherwise they
are significant for the grammar.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: split out heart-of-the-parser code
NeilBrown [Wed, 10 Mar 2021 00:12:50 +0000 (11:12 +1100)]
parsergen: split out heart-of-the-parser code

This finishes the break up of the core parser code.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: split out the "shift or ignore" section of parsing.
NeilBrown [Wed, 10 Mar 2021 00:00:23 +0000 (11:00 +1100)]
parsergen: split out the "shift or ignore" section of parsing.

This will make it easier to document.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: split out reduce step of parser
NeilBrown [Tue, 9 Mar 2021 23:56:15 +0000 (10:56 +1100)]
parsergen: split out reduce step of parser

Split out the "reduce" code so it can be more easily documented.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: split out error handling.
NeilBrown [Tue, 9 Mar 2021 23:51:19 +0000 (10:51 +1100)]
parsergen: split out error handling.

I want to split up the core parsing into the different parts so they can
be documented better.
Firstly: split out error handling.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: add support for "special" terminals.
NeilBrown [Fri, 5 Mar 2021 10:24:14 +0000 (21:24 +1100)]
parsergen: add support for "special" terminals.

We will want a new terminal "EOL", which is like "NEWLINE", but
different.  There is currently no room in the numbering for something
like that, so make some room.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: remove special case of newline conflicts
NeilBrown [Fri, 5 Mar 2021 10:26:55 +0000 (21:26 +1100)]
parsergen: remove special case of newline conflicts

newlines are no longer interesting in avoiding conflicts, so remove the
special case handling.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: remove tracking of indents and line starts etc.
NeilBrown [Fri, 5 Mar 2021 10:01:17 +0000 (21:01 +1100)]
parsergen: remove tracking of indents and line starts etc.

We will want some of this back, but in a very different form.
So remove it all for now.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: remove newline_only
NeilBrown [Fri, 5 Mar 2021 09:41:47 +0000 (20:41 +1100)]
parsergen: remove newline_only

newline_only is not wanted any more.  It wasn't being set anyway.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: remove starts_line and min_prefix
NeilBrown [Fri, 5 Mar 2021 09:37:34 +0000 (20:37 +1100)]
parsergen: remove starts_line and min_prefix

Neither of these are wanted any more.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: remove line_like information.
NeilBrown [Fri, 5 Mar 2021 09:31:32 +0000 (20:31 +1100)]
parsergen: remove line_like information.

I'm going to change the 2D nature of the parser over several patches.
First I remove what I don't want, then I add what I do.
During this series, tests won't work!

First: line_like nad relate code is removed.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: don't use static buffer for result value.
NeilBrown [Fri, 26 Feb 2021 06:33:43 +0000 (17:33 +1100)]
parsergen: don't use static buffer for result value.

Add the size of the result value to the per-state information, so it can
be allocated before calling do_reduce(), thus removing the need for a
overly large static buffer.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: do not create empty goto arrays
NeilBrown [Wed, 24 Feb 2021 08:57:08 +0000 (19:57 +1100)]
parsergen: do not create empty goto arrays

These empty arrays are a waste of space ...  assuming they take up

Using NULL is more ideomatic.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparergen: fix bug in deriving itemsets
NeilBrown [Fri, 5 Mar 2021 10:17:51 +0000 (21:17 +1100)]
parergen: fix bug in deriving itemsets

The code to check if an item had already been added, was wrong.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: make "code" arg to "gen_reduce" more obvious.
NeilBrown [Fri, 5 Mar 2021 10:29:56 +0000 (21:29 +1100)]
parsergen: make "code" arg to "gen_reduce" more obvious.

Call it "pre_reduce" so we know where the code goes.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: improve usage message
NeilBrown [Fri, 5 Mar 2021 10:30:54 +0000 (21:30 +1100)]
parsergen: improve usage message

Now usage message is slightly better.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agooceani: add missing space in usage message.
NeilBrown [Fri, 5 Mar 2021 22:15:06 +0000 (09:15 +1100)]
oceani: add missing space in usage message.

Wrapping long strings is a bad idea anyway.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: fix some problems with choose_sym()
NeilBrown [Fri, 5 Mar 2021 09:20:36 +0000 (20:20 +1100)]
parsergen: fix some problems with choose_sym()

This would sometimes give wrong result, particularly bad when it is
larger than body_size.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: move the 'follow' declaration
NeilBrown [Fri, 5 Mar 2021 09:18:14 +0000 (20:18 +1100)]
parsergen: move the 'follow' declaration

The 'follow' field is currently used before declared, which is poor
form.  Move it.

Also remove a stray '## functions' section that is redundant.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: move "Memory allocation" section.
NeilBrown [Fri, 5 Mar 2021 09:16:22 +0000 (20:16 +1100)]
parsergen: move "Memory allocation" section.

This movement isn't really significant yet, but it will help a bit
later, and I want to get it out of the way.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: some missing 'free' calls.
NeilBrown [Fri, 5 Mar 2021 09:14:29 +0000 (20:14 +1100)]
parsergen: some missing 'free' calls.

Well... one missing call, and some places were we need to do something a
bit more.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: change 'again' to 'check_again'.
NeilBrown [Fri, 5 Mar 2021 09:11:04 +0000 (20:11 +1100)]
parsergen: change 'again' to 'check_again'.

Sometimes I use 'again', sometimes 'check_again'.
Change all to use 'check_again'.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: assorted updates to descriptive text.
NeilBrown [Fri, 5 Mar 2021 09:07:55 +0000 (20:07 +1100)]
parsergen: assorted updates to descriptive text.

Some of these are fixed for typos or poor grammar.  Others update the
text to more closely match the code.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen.mdc: remove tracking of left-recursive symbols.
NeilBrown [Fri, 5 Mar 2021 08:24:11 +0000 (19:24 +1100)]
parsergen.mdc: remove tracking of left-recursive symbols.

left-recursive symbols are no longer interesting, so remove the code and

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: guard against tos going negative.
NeilBrown [Wed, 10 Mar 2021 00:58:08 +0000 (11:58 +1100)]
parsergen: guard against tos going negative.

Don't continue the parse loop if tos hits zero.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: change how reserved_words are stored
NeilBrown [Fri, 5 Mar 2021 08:20:22 +0000 (19:20 +1100)]
parsergen: change how reserved_words are stored

Rather than a simple array with holes, have a dense array mapping number
to name.  This will enable a future change which adds names that don't
have numbers assigned.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoparsergen: rename item_index() to item_dot()
NeilBrown [Fri, 5 Mar 2021 08:17:27 +0000 (19:17 +1100)]
parsergen: rename item_index() to item_dot()

The name "dot" fits better with documentation which described the nature
of an "item" when generating LR parsing tables.

Also change the arg to item_num() from 'index' to 'dot'.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agotests: restore coverage testing.
NeilBrown [Fri, 5 Mar 2021 08:04:45 +0000 (19:04 +1100)]
tests: restore coverage testing.

I don't know what changed, but coverage testing stopped working.
Fixed now.

Also add some "|| exit 1" to fail quickly when needed.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoindent-test: enhance the tests a bit.
NeilBrown [Fri, 5 Mar 2021 08:00:52 +0000 (19:00 +1100)]
indent-test: enhance the tests a bit.

In particular, test for "else" both indented and unindented.

Signed-off-by: NeilBrown <neil@brown.name>
17 months agoindent-test: minor improvements:
NeilBrown [Fri, 5 Mar 2021 07:58:10 +0000 (18:58 +1100)]
indent-test: minor improvements:

1/ add rule to build itest.code

2/ diffs now display correct as "old" and generated as "new"

3/ remove some noise that should never have been there.

Signed-off-by: NeilBrown <neil@brown.name>
22 months agoparsergen: add more power to symbol references in generated code
NeilBrown [Sun, 11 Oct 2020 03:49:07 +0000 (14:49 +1100)]
parsergen: add more power to symbol references in generated code

As well as symbol references like "$2", you can now use references
with letters like "$Ss".  This will find the shortest symbol in the
production that contains all the given letters in the given order.
There must be a unique shortest symbol.

If that same symbol occurs multiple times, later instances can be given
with a numeric suffix such as "$Ss2".

Signed-off-by: NeilBrown <neil@brown.name>
22 months agoparsergen: update description of $<N
NeilBrown [Sun, 11 Oct 2020 01:18:57 +0000 (12:18 +1100)]
parsergen: update description of $<N

This applies to structures as well as pointers.

Signed-off-by: NeilBrown <neil@brown.name>
22 months agoparsergen: allow terminals to be declared.
NeilBrown [Sat, 10 Oct 2020 23:34:06 +0000 (10:34 +1100)]
parsergen: allow terminals to be declared.

By default, any non-virtual symbol that does not appear in the head of a
product is assumed to be a Terminal.
For larger grammars, this misses out of an opportunity to detect errors.
So allow a "$TERM" line to list terminals (that do no appear in
precedence lines).  If any $TERM line is given, then generate error
if any symbol appears in a production but is not declared, either
as terminal or non-terminal.

Signed-off-by: NeilBrown <neil@brown.name>
22 months agoparsergen: avoid infinite loop on error.
NeilBrown [Sat, 10 Oct 2020 22:50:12 +0000 (09:50 +1100)]
parsergen: avoid infinite loop on error.

If the grammar allows "ERROR" in a recursive location, error handling
can loop for every.

 foo -> foo bar
 foo -> ERROR

Rather than detect and reject such grammars, detect the infinite loop
as it start, and discard an extra token.

i.e.  if error handling doesn't discard any tokens from the input
stream, and another error is triggered before anything is shifted, then
we force the next error handling phase to discard at least one token,
or to abort if that token is EOF.

Signed-off-by: NeilBrown <neil@brown.name>
22 months agoparsergen: sort virtual symbols to send of list
NeilBrown [Tue, 6 Oct 2020 07:11:15 +0000 (18:11 +1100)]
parsergen: sort virtual symbols to send of list

virtual symbols are used internally to parsergen
and of no interest to the parser.  So they shouldn't
appear in the non_term[] array.

So assign them higher numbers so the nonterminals are dense, and only
include non-virtual non-terminals in the non_term[] array.

Signed-off-by: NeilBrown <neil@brown.name>
22 months agoparsegen: detect left-recursive symbols in non-final position.
NeilBrown [Tue, 6 Oct 2020 06:02:22 +0000 (17:02 +1100)]
parsegen: detect left-recursive symbols in non-final position.

A left-recursive symbol that appear other than at the end of a
production causes problem for indent-based parsing, as describe in the
document.  So teach parsergen to be able to report them.

Ocean currently has several of these, which I'll need to look into at a
later date.

Signed-off-by: NeilBrown <neil@brown.name>
22 months agoscanner: change the meaning of ignoring comment tokens.
NeilBrown [Tue, 6 Oct 2020 04:44:46 +0000 (15:44 +1100)]
scanner: change the meaning of ignoring comment tokens.

Previously ignoring comment tokens meant they were still parsed, but not
returned.  The only way to stop them being parsed was to declare
known marks for the start symbols.

This made is not possible for parsergen to define a language that had
a known mark that would otherwise start a comment.

So change the ignoring of comment tokens to mean they aren't parsed.  If
you want to parse comments but not return them, leave the new
"return_comments" field as so.  In the unusual case that you want to
return comments set return_comments to 1.

Confirm that this has the desired effect by added in "//" as an
integer-division operator to the sample calculator.

Signed-off-by: NeilBrown <neil@brown.name>
22 months agoindent_test: fix makefile
NeilBrown [Mon, 5 Oct 2020 23:00:31 +0000 (10:00 +1100)]
indent_test: fix makefile

Maybe 'make' has changed a little to be less forgiving, but 'make itest'
isn't working now.  All of LDLIBS are included in the 'cc' line, but
there are no dependencies to make sure they have been built.

The problem is that I'm using LDLIBS for different programs which need
different libs.  This isn't such a good idea.
So change indent_test to use itestLDLIBS and itestCFLAGS.

Signed-off-by: NeilBrown <neil@brown.name>
23 months agoRename string.h and number.h headers
NeilBrown [Fri, 11 Sep 2020 07:53:49 +0000 (17:53 +1000)]
Rename string.h and number.h headers

Having a "string.h" is potentially confusing as there
is a standard <string.h>
So rename it and for consistency, rename number.h too.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: add token location to tracing
NeilBrown [Fri, 28 Jun 2019 09:40:11 +0000 (19:40 +1000)]
parsergen: add token location to tracing

When we print the look-ahead token for tracing, add the line/column
location so it can be easily cross-references to the source code.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: only non-terminals should make a state "starts_line"
NeilBrown [Fri, 28 Jun 2019 09:36:49 +0000 (19:36 +1000)]
parsergen: only non-terminals should make a state "starts_line"

If a state is followed by NEWLINE, then it isn't starts_line - more like
It is only non-terminals containing NEWLINEs that cause a state
to be starts_line.
So move the test to after we stop looking at terminals.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani: allow 'then' in simple if statements.
NeilBrown [Sun, 23 Jun 2019 05:37:50 +0000 (15:37 +1000)]
oceani: allow 'then' in simple if statements.

Allow 'then' after "if expression", and don't require a ':' if
it is followed by simple statements.
Similarly "else" doesn't need a colon for simple statements

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani: change parsing for ; at end
NeilBrown [Sun, 23 Jun 2019 04:41:47 +0000 (14:41 +1000)]
oceani: change parsing for ; at end

When we have 'for' and 'then' on the same line, I want to
require a ';' for the 'for' (and 'while').
So change SimpleStatemnts to never end with ';', and require
a ; or Newline after each instance of SimpleStatements.

Hmm... I guess that could be abstracted.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani: modify grammar to not waste stack on newlines
NeilBrown [Sun, 23 Jun 2019 04:29:13 +0000 (14:29 +1000)]
oceani: modify grammar to not waste stack on newlines

Current grammar uses one stack frame per newline for leading
newlines as these productions are right-recursive.  This is
unnecessary and inelegant. Change to use a left-recursive Newlines

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoindent_test: reduce stack usage for preceding NEWLINEs
NeilBrown [Sun, 23 Jun 2019 03:51:46 +0000 (13:51 +1000)]
indent_test: reduce stack usage for preceding NEWLINEs

In the cases where we allow preceding newlines (Statementlist Open Close)
we current use one parse-stack from for each newline.  While there are
unlikely to be many, this is inelegant.
Change the right-recursive form to use a left-recursive Newlines rule
that absorbs one or more NEWLINEs using at most 2 stack frames.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: allow $$OUT to be satisfied are start-of-line.
NeilBrown [Sun, 23 Jun 2019 00:21:14 +0000 (10:21 +1000)]
parsergen: allow $$OUT to be satisfied are start-of-line.

If a $$OUT (or $$NEWLINE) production is being reduced at
start-of-line (with no indents), then that is satisfactory,
we don't need NEWLINE etc as look-ahead.

This means that in cases where this is relevant, the computed
lookahead is wrong - we shouldn't have striped it.
I don't think this matters as it only affects conflict warnings,
and I think these will be reported at a higher level if relevant.
If essense, the $$OUT marking is like a precendence marking which
suppresses shift/reduce warnings as it say that decision is being made
on some basis other than look-ahead.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: allow $$OUT as well as $$NEWLINE
NeilBrown [Sat, 22 Jun 2019 23:00:06 +0000 (09:00 +1000)]
parsergen: allow $$OUT as well as $$NEWLINE

Both of these mean the same thing: the product must end
in a 2-d visible way

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: don't assume TK_newline in look-ahead for lineline
NeilBrown [Sat, 22 Jun 2019 22:56:15 +0000 (08:56 +1000)]
parsergen: don't assume TK_newline in look-ahead for lineline

A linelike production might not have TK_newline in the look-ahead,
so don't assume it.  If it isn't there, make the look-ahead
set empty.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: revert the allowance for "non-critical" conflicts.
NeilBrown [Sun, 16 Jun 2019 02:37:23 +0000 (12:37 +1000)]
parsergen: revert the allowance for "non-critical" conflicts.

Having improved the parsing approach, I don't get any
"non-critical" conflicts any more, and I no longer think
they aren't critical.

Conflicts can often be resolved with precendence if they cannot
be resolved any other way.

So treat all conflict, except shift/reduce on NEWLINE, as genuine

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani-tests: add tests with lots of blank lines.
NeilBrown [Sun, 16 Jun 2019 02:34:40 +0000 (12:34 +1000)]
oceani-tests: add tests with lots of blank lines.

This found some problems with the grammer, which I fixed.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani: convert declarations to new approach to newlines
NeilBrown [Sun, 16 Jun 2019 02:16:44 +0000 (12:16 +1000)]
oceani: convert declarations to new approach to newlines

There are now no conflicts.  Yay!!

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani: re-indent DeclareStruct
NeilBrown [Sun, 16 Jun 2019 01:37:03 +0000 (11:37 +1000)]
oceani: re-indent DeclareStruct

It wasn't indented to easily allow alternate productions.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agogitignore - add coverage_scanner
NeilBrown [Sun, 16 Jun 2019 01:35:00 +0000 (11:35 +1000)]
gitignore - add coverage_scanner

This is a tmp file - should have been ignored before.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsegen: fix up look-ahead for $$NEWLINE items.
NeilBrown [Sun, 16 Jun 2019 01:31:54 +0000 (11:31 +1000)]
parsegen: fix up look-ahead for $$NEWLINE items.

I was discarding all non-newlines from the lookahead
in the wrong place.
I need to do it based on the productions added, not
the item the are generated by.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani: change NEWLINE parsing in statements to new model.
NeilBrown [Sun, 16 Jun 2019 00:16:07 +0000 (10:16 +1000)]
oceani: change NEWLINE parsing in statements to new model.

The new module is:

 A list of line-like things must access a newline first:
  Statementlist -> Statements
                | NEWLINE Statementlist

 Any line-like thing must reduce to a single symbol:
   SimpleStatementLine IfPart WhilePart CasePart etc
 An individual line-like thing must allow following newlines
   IfHead -> if Expression Block
           | IfHead NEWLINE

 A block that can be multi-line or single-line should be marked with
 This will require a NEWLINE to reduce it, but won't swollow the newline.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoindent_test: adjust grammer to handle blank lines better.
NeilBrown [Sat, 15 Jun 2019 23:47:58 +0000 (09:47 +1000)]
indent_test: adjust grammer to handle blank lines better.

This uses the new $$NEWLINE are other techniques to ensure
blank lines are handled well.
We also test that adding blank lines everywhere doesn't break

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoident_test: declare precedence for 'else'
NeilBrown [Sat, 15 Jun 2019 23:20:30 +0000 (09:20 +1000)]
ident_test: declare precedence for 'else'

By declaring precedence for 'else', we suppress conflict warnings
Normally newlines and indents will resolve any conflict, but
if not, else associates to the right - it should be shifted, not cause
a reduce (which is the default anyway)

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoindent_test: make testing easier - and include expected output
NeilBrown [Sat, 15 Jun 2019 23:17:58 +0000 (09:17 +1000)]
indent_test: make testing easier - and include expected output

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: allow non-virtual symbol to carry precedence.
NeilBrown [Sat, 15 Jun 2019 23:14:03 +0000 (09:14 +1000)]
parsergen: allow non-virtual symbol to carry precedence.

When a production has $$foo to explicity set precedence, the 'foo'
doesn't really need to be virtual, it just needs to actually
carry a precedence.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: introuce $$NEWINE pseudo-precedence.
NeilBrown [Sat, 15 Jun 2019 22:29:16 +0000 (08:29 +1000)]
parsergen: introuce $$NEWINE pseudo-precedence.

Sometimes we need a produce to be terminated by a newline, but we
don't want to consume the newline with a "shift".
Case in point is:
   Block -> : StatementList

Which can be used with
   Statement -> if Expression Block
   StatementList -> Statement

I want this to parse:

   if something: if otherthing: action

which might seem a little odd, but is syntactically sensible.
The NEWLINE at the end is requred, and must close both nested Statements.
The NEWLINE will already cause a REDUCE, but if we don't have
   Block -> : Statementlist NEWLINE
then something else could force a reduce, and we don't want that.
So introduce a marking "$$NEWLINE" which is similar to imposing a precedence
on a production.  Now

   Block -> : StatementList $$NEWLINE

means that a NEWLINE is required to end a Block, but it isn't
shifted.  If anything else if found here, it is an error.

We also allow $eof and OUT to reduce this production.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: allow $<1 to be used for structs as well as pointer.
NeilBrown [Sat, 15 Jun 2019 22:25:23 +0000 (08:25 +1000)]
parsergen: allow $<1 to be used for structs as well as pointer.

A future patch will want to use this for non-pointers, so make it
work - it is more consistent this way anyway.

Also: update to parsers to use $< where possible.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoOceani: be sure to set precedence on required terminals.
NeilBrown [Mon, 10 Jun 2019 06:51:31 +0000 (16:51 +1000)]
Oceani: be sure to set precedence on required terminals.

In some cases I was only setting on nonterminals which derived the
terminals.  That set it for the reduction, but not the terminal.

Also remove an ERROR production that duplicates one from Declaration

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: don't report conflicts resolved by precedence.
NeilBrown [Mon, 10 Jun 2019 06:34:55 +0000 (16:34 +1000)]
parsergen: don't report conflicts resolved by precedence.

If precedence information has been given which can resolve
a conflict, then don't report it.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani: convert expression parsing to use precedences.
NeilBrown [Sun, 9 Jun 2019 23:11:05 +0000 (09:11 +1000)]
oceani: convert expression parsing to use precedences.

As precedences are now working (and largely have been for a long time).
it is time to start using them for oceani.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: flip ordering of precedence declarations.
NeilBrown [Sun, 9 Jun 2019 23:00:43 +0000 (09:00 +1000)]
parsergen: flip ordering of precedence declarations.

Change so first precedence declaration is the lowest precedence.
This is consistent with bison, and will make converting
'oceani' easer.
When not using precedence, it is easier to do the lowest
precedence first - so keep for approach.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani: use 'bracket' printing for expressions.
NeilBrown [Sun, 9 Jun 2019 22:49:08 +0000 (08:49 +1000)]
oceani: use 'bracket' printing for expressions.

Adding brackets to expression printing removes and ambiguity.
As I'm about to change expression parsing, I want to be able to
see that the result is correct.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoparsergen: include virtual symbols in table of non-terminals
NeilBrown [Sun, 9 Jun 2019 22:35:36 +0000 (08:35 +1000)]
parsergen: include virtual symbols in table of non-terminals

Symbol numbers assigned in grammar_analyse are in three groups:
 - predefined (NUMBER, STRING, etc)
 - Terminals
 - everything else: non-terminals and virtual.

When creating the non_term[] list of names, we need to include
virtual symbols in there, otherwise lookup by symbol-number
might find the wrong value - or might reach beyond end of array.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani: labels only in 'use' statement.
NeilBrown [Sun, 9 Jun 2019 05:55:21 +0000 (15:55 +1000)]
oceani: labels only in 'use' statement.

A variable is only set as a label if it appear at top
level of "use" statement - otherwise it is "unknown".

This makes error messages more meaningful.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agooceani: add more syntax error handling.
NeilBrown [Sun, 9 Jun 2019 00:15:39 +0000 (10:15 +1000)]
oceani: add more syntax error handling.

We catch some errors earlier so more errors can be
reported in a single run.
The indent structure make recovery easy!

As we might abort out of a var scope, we only insist the scope
is balanced in there are no parser errors.

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoscanner: hide impossible code from coverage testing.
NeilBrown [Sun, 9 Jun 2019 00:03:44 +0000 (10:03 +1000)]
scanner: hide impossible code from coverage testing.

The code in "white space" section is truly impossible, as
we don't return WEOF untile ->node is NULL, and when that
happens, ->col is set to 0.

Other code is only "mostly dead".

This brings coverage to 95%

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoscanner: test for errors with multi-line objects crossing node.
NeilBrown [Sat, 8 Jun 2019 23:54:39 +0000 (09:54 +1000)]
scanner: test for errors with multi-line objects crossing node.

multi-line strings and comments musn't cross nodes.
Testing this increases coverage above 94%

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoscanner: improve transition from node to node.
NeilBrown [Sat, 8 Jun 2019 23:42:05 +0000 (09:42 +1000)]
scanner: improve transition from node to node.

When we are at the end of a node, it is wrong to use do_strip() as
that looks beyond the end of the node.
It is better, once we have determined to accept the newline at the
end of a node (i.e. once no unget is possible), to move to the
start of the next node, and assess column position and indents from
that perspective.
Do this removes some tests on at_son/at_eon, and make some code a
bit more transparent - for example the flag that say whether an "out"
is next now depends on where a newline was recently seen, which makes
more sense than whether we were at the start of a node (out and newline
alternate in some contexts).

Also: add the test which found this problem.   This requires a
new set of tests - tests which can scan tokens from multiple nodes.

Now that we are testing node transitions, the coverage has jumped
over 92%

Signed-off-by: NeilBrown <neil@brown.name>
3 years agoscanner: allow a section to be specified.
NeilBrown [Sat, 8 Jun 2019 10:27:15 +0000 (20:27 +1000)]
scanner: allow a section to be specified.

If --section arg is given, only report on that section.

Signed-off-by: NeilBrown <neil@brown.name>