55 lines
1.4 KiB
Markdown
55 lines
1.4 KiB
Markdown
|
# Conflicts
|
||
|
|
||
|
Some of the conflicts and issues in the grammar are documented here.
|
||
|
|
||
|
## A variant type that lists a single atomic type
|
||
|
|
||
|
Why can't `[t]` be considered a valid atomic type? (A variant type.)
|
||
|
|
||
|
(This is related to MPR #3835.)
|
||
|
|
||
|
A class type that begins with `[t] foo` could continue as follows:
|
||
|
|
||
|
```
|
||
|
[t] foo -> <class_type>
|
||
|
```
|
||
|
|
||
|
Here `t` is understood as a variant type,
|
||
|
and is used as an actual parameter of the parameterized type `'a foo`.
|
||
|
|
||
|
Or it could continue as follows:
|
||
|
|
||
|
```
|
||
|
[t] foo
|
||
|
```
|
||
|
|
||
|
Here `t` is a type (there is no variant type)
|
||
|
and is used as an actual parameter of the class `['a] foo`.
|
||
|
|
||
|
After we have read the closing bracket and are looking ahead at `foo`,
|
||
|
we need to decide which of the above two situations we have. (The first
|
||
|
situation requires a reduction; the second situation requires shifting.)
|
||
|
But we cannot decide yet; we would need to look at the arrow `->` beyond
|
||
|
`foo` in order to decide. In this example LR(2) is required; in general,
|
||
|
`foo` could be replaced with an arbitrary qualified name, so unbounded
|
||
|
lookahead is required.
|
||
|
|
||
|
As a result of this issue, we must abandon the idea that `[t]` could be
|
||
|
a well-formed variant type. In the syntax of atomic types, instead of:
|
||
|
|
||
|
```
|
||
|
atomic_type: LBRACKET row_field RBRACKET
|
||
|
```
|
||
|
|
||
|
we must use the more restricted form:
|
||
|
|
||
|
```
|
||
|
atomic_type: LBRACKET tag_field RBRACKET
|
||
|
```
|
||
|
|
||
|
In other words, we rule out exactly the following:
|
||
|
|
||
|
```
|
||
|
atomic_type: LBRACKET atomic_type RBRACKET
|
||
|
```
|