Do away with operandNotTable -- it's not needed now we have state, and it breaks stuff

This commit is contained in:
Adam Sampson 2007-04-30 02:51:46 +00:00
parent 6c9293fa7b
commit db1c16c2cb
4 changed files with 27 additions and 17 deletions

View File

@ -986,8 +986,7 @@ conversionMode :: OccParser (A.ConversionMode, A.Expression)
conversionMode
= do { sROUND; o <- noTypeContext operand; return (A.Round, o) }
<|> do { sTRUNC; o <- noTypeContext operand; return (A.Trunc, o) }
-- This uses operandNotTable to resolve the "x[y]" ambiguity.
<|> do { o <- noTypeContext operandNotTable; return (A.DefaultConversion, o) }
<|> do { o <- noTypeContext operand; return (A.DefaultConversion, o) }
<?> "conversion mode and operand"
--}}}
--{{{ operands
@ -997,16 +996,6 @@ operand
operand' :: OccParser A.Expression
operand'
= table
<|> operandNotTable'
<?> "operand'"
operandNotTable :: OccParser A.Expression
operandNotTable
= maybeSubscripted "operand other than table" operandNotTable' A.SubscriptedExpr typeOfExpression
operandNotTable' :: OccParser A.Expression
operandNotTable'
= do { m <- md; v <- variable; return $ A.ExprVariable m v }
<|> literal
<|> do { sLeftR; e <- expression; sRightR; return e }
@ -1021,7 +1010,8 @@ operandNotTable'
<|> do { m <- md; sOFFSETOF; sLeftR; t <- dataType; sComma; f <- fieldName; sRightR; return $ A.OffsetOf m t f }
<|> do { m <- md; sTRUE; return $ A.True m }
<|> do { m <- md; sFALSE; return $ A.False m }
<?> "operand other than table'"
<|> table
<?> "operand"
--}}}
--{{{ variables, channels, timers, ports
variable :: OccParser A.Variable

View File

@ -3,10 +3,7 @@ Bugs in the ordered syntax in the occam2.1 manual
-- Things I've worked around in Parse.hs
x[y] is ambiguous -- fixed by splitting operand into a version that permits
tables and a version that doesn't.
x ! y is ambiguous.
"x[y]" and "x ! y" are both ambiguous unless you have an idea of what x is.
"SIZE cs" where cs is an array of channels isn't allowed.

View File

@ -0,0 +1,16 @@
-- from cgtest07
PROC P ()
BYTE b:
[1]BYTE bs:
INT n:
SEQ
-- With extra brackets...
ASSERT ((INT 'e') = (INT ("Hello"[INT ([BYTE 10, BYTE 10, BYTE 1][42 \ 10])])))
-- Bits of it
b := BYTE 10
bs := [BYTE 10]
-- But this triggers the operandNotTable problem
n := INT [BYTE 10][0]
-- As it appeared (in occam2.1-legal form) in the cgtest
ASSERT ((INT 'e') = (INT ("Hello"[INT [BYTE 10, BYTE 10, BYTE 1][42 \ 10]])))
:

View File

@ -0,0 +1,7 @@
PROC P ()
PRI PAR
SKIP
SKIP
SKIP
SKIP
: