Skip to content

Commit ada2231

Browse files
cyderizezayenz
authored andcommitted
Fix parser to allow par identifiers in var array initialisers
Previously only var identifiers, or par literals were allowed
1 parent 18170c9 commit ada2231

File tree

5 files changed

+93
-8
lines changed

5 files changed

+93
-8
lines changed

Makefile.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,6 +1215,7 @@ FLATZINCTESTSRC0 = \
12151215
test/flatzinc/magicsq_5.cpp \
12161216
test/flatzinc/oss.cpp \
12171217
test/flatzinc/steiner_triples.cpp \
1218+
test/flatzinc/subtyping.cpp \
12181219
test/flatzinc/timetabling.cpp \
12191220
test/flatzinc/trucking.cpp \
12201221
test/flatzinc/on_restart_complete.cpp \

changelog.in

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ Date: 2020-??-??
6969
[DESCRIPTION]
7070
Let's see.
7171

72+
[ENTRY]
73+
Module: flatzinc
74+
What: bug
75+
Rank: minor
76+
[DESCRIPTION]
77+
Allow par identifiers in var array initialisers.
78+
7279
[ENTRY]
7380
Module: flatzinc
7481
What: change

gecode/flatzinc/parser.tab.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2906,7 +2906,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
29062906
{
29072907
SymbolEntry e;
29082908
ParserState* pp = static_cast<ParserState*>(parm);
2909-
if (pp->symbols.get((yyvsp[0].sValue), e) && e.t == ST_INTVAR)
2909+
if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_INTVAR || e.t == ST_INT))
29102910
(yyval.varSpec) = new IntVarSpec(Alias(e.i),false,false);
29112911
else {
29122912
pp->err << "Error: undefined identifier for type int " << (yyvsp[0].sValue)
@@ -2986,7 +2986,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
29862986
{
29872987
SymbolEntry e;
29882988
ParserState* pp = static_cast<ParserState*>(parm);
2989-
if (pp->symbols.get((yyvsp[0].sValue), e) && e.t == ST_FLOATVAR)
2989+
if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_FLOATVAR || e.t == ST_FLOAT))
29902990
(yyval.varSpec) = new FloatVarSpec(Alias(e.i),false,false);
29912991
else {
29922992
pp->err << "Error: undefined identifier for type float " << (yyvsp[0].sValue)
@@ -3065,7 +3065,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
30653065
{
30663066
SymbolEntry e;
30673067
ParserState* pp = static_cast<ParserState*>(parm);
3068-
if (pp->symbols.get((yyvsp[0].sValue), e) && e.t == ST_BOOLVAR)
3068+
if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_BOOLVAR || e.t == ST_BOOL))
30693069
(yyval.varSpec) = new BoolVarSpec(Alias(e.i),false,false);
30703070
else {
30713071
pp->err << "Error: undefined identifier for type bool " << (yyvsp[0].sValue)
@@ -3144,7 +3144,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
31443144
{
31453145
ParserState* pp = static_cast<ParserState*>(parm);
31463146
SymbolEntry e;
3147-
if (pp->symbols.get((yyvsp[0].sValue), e) && e.t == ST_SETVAR)
3147+
if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_SETVAR || e.t == ST_SET))
31483148
(yyval.varSpec) = new SetVarSpec(Alias(e.i),false,false);
31493149
else {
31503150
pp->err << "Error: undefined identifier for type set " << (yyvsp[0].sValue)

gecode/flatzinc/parser.yxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,7 +1327,7 @@ int_init :
13271327
{
13281328
SymbolEntry e;
13291329
ParserState* pp = static_cast<ParserState*>(parm);
1330-
if (pp->symbols.get($1, e) && e.t == ST_INTVAR)
1330+
if (pp->symbols.get($1, e) && (e.t == ST_INTVAR || e.t == ST_INT))
13311331
$$ = new IntVarSpec(Alias(e.i),false,false);
13321332
else {
13331333
pp->err << "Error: undefined identifier for type int " << $1
@@ -1384,7 +1384,7 @@ float_init :
13841384
{
13851385
SymbolEntry e;
13861386
ParserState* pp = static_cast<ParserState*>(parm);
1387-
if (pp->symbols.get($1, e) && e.t == ST_FLOATVAR)
1387+
if (pp->symbols.get($1, e) && (e.t == ST_FLOATVAR || e.t == ST_FLOAT))
13881388
$$ = new FloatVarSpec(Alias(e.i),false,false);
13891389
else {
13901390
pp->err << "Error: undefined identifier for type float " << $1
@@ -1439,7 +1439,7 @@ bool_init :
14391439
{
14401440
SymbolEntry e;
14411441
ParserState* pp = static_cast<ParserState*>(parm);
1442-
if (pp->symbols.get($1, e) && e.t == ST_BOOLVAR)
1442+
if (pp->symbols.get($1, e) && (e.t == ST_BOOLVAR || e.t == ST_BOOL))
14431443
$$ = new BoolVarSpec(Alias(e.i),false,false);
14441444
else {
14451445
pp->err << "Error: undefined identifier for type bool " << $1
@@ -1492,7 +1492,7 @@ set_init :
14921492
{
14931493
ParserState* pp = static_cast<ParserState*>(parm);
14941494
SymbolEntry e;
1495-
if (pp->symbols.get($1, e) && e.t == ST_SETVAR)
1495+
if (pp->symbols.get($1, e) && (e.t == ST_SETVAR || e.t == ST_SET))
14961496
$$ = new SetVarSpec(Alias(e.i),false,false);
14971497
else {
14981498
pp->err << "Error: undefined identifier for type set " << $1

test/flatzinc/subtyping.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2+
/*
3+
* Main authors:
4+
* Jason Nguyen <[email protected]>
5+
*
6+
* Copyright:
7+
* Jason nguyen, 2023
8+
*
9+
* This file is part of Gecode, the generic constraint
10+
* development environment:
11+
* http://www.gecode.org
12+
*
13+
* Permission is hereby granted, free of charge, to any person obtaining
14+
* a copy of this software and associated documentation files (the
15+
* "Software"), to deal in the Software without restriction, including
16+
* without limitation the rights to use, copy, modify, merge, publish,
17+
* distribute, sublicense, and/or sell copies of the Software, and to
18+
* permit persons to whom the Software is furnished to do so, subject to
19+
* the following conditions:
20+
*
21+
* The above copyright notice and this permission notice shall be
22+
* included in all copies or substantial portions of the Software.
23+
*
24+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30+
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31+
*
32+
*/
33+
34+
#include "test/flatzinc.hh"
35+
36+
namespace Test { namespace FlatZinc {
37+
38+
namespace {
39+
/// Helper class to create and register tests
40+
class Create {
41+
public:
42+
43+
/// Perform creation and registration
44+
Create(void) {
45+
(void) new FlatZincTest("subtyping::1",
46+
R"FZN(
47+
bool: pb = true;
48+
int: pi = 1;
49+
float: pf = 1.5;
50+
set of int: ps = {1, 3};
51+
var bool: vb :: output_var;
52+
var 1..1: vi :: output_var;
53+
var 1.5..1.5: vf :: output_var;
54+
var set of 1..1: vs :: output_var;
55+
array [1..3] of var bool: vba = [vb, pb, true];
56+
array [1..3] of var int: via = [vi, pi, 3];
57+
array [1..3] of var float: vfa = [vf, pf, 3.5];
58+
array [1..3] of var set of int: vsa = [vs, ps, {1}];
59+
constraint bool_eq(vb, pb);
60+
constraint set_card(vs, pi);
61+
solve satisfy;
62+
)FZN",
63+
R"OUT(vb = true;
64+
vf = 1.5;
65+
vi = 1;
66+
vs = 1..1;
67+
----------
68+
)OUT");
69+
}
70+
};
71+
72+
Create c;
73+
}
74+
75+
}}
76+
77+
// STATISTICS: test-flatzinc

0 commit comments

Comments
 (0)