Accept more syntaxes as range specifications for [*], [=], and [->].
* src/ltlparse/ltlscan.ll (OP_SQBKT_SEP): Accept ":" and "to" in addition to ".." and ",". (OP_UNBOUNDED): Recognize "$" for the rule below. * src/ltlparse/ltlparse.yy: Accept [OP1:$] as a synonym for [OP1:], for people used to SVA's syntax. * src/ltltest/equals.test: Test these syntaxes.
This commit is contained in:
parent
4fd4f83ed6
commit
754ff36b01
3 changed files with 22 additions and 13 deletions
|
|
@ -97,6 +97,7 @@ using namespace spot::ltl;
|
||||||
%token OP_GOTO_OPEN "opening bracket for goto operator"
|
%token OP_GOTO_OPEN "opening bracket for goto operator"
|
||||||
%token OP_SQBKT_CLOSE "closing bracket"
|
%token OP_SQBKT_CLOSE "closing bracket"
|
||||||
%token <num> OP_SQBKT_NUM "number for square bracket operator"
|
%token <num> OP_SQBKT_NUM "number for square bracket operator"
|
||||||
|
%token OP_UNBOUNDED "unbounded mark"
|
||||||
%token OP_SQBKT_SEP "separator for square bracket operator"
|
%token OP_SQBKT_SEP "separator for square bracket operator"
|
||||||
%token OP_UCONCAT "universal concat operator"
|
%token OP_UCONCAT "universal concat operator"
|
||||||
%token OP_ECONCAT "existential concat operator"
|
%token OP_ECONCAT "existential concat operator"
|
||||||
|
|
@ -190,13 +191,14 @@ enderror: error END_OF_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
OP_SQBKT_SEP_opt: | OP_SQBKT_SEP
|
OP_SQBKT_SEP_unbounded: OP_SQBKT_SEP | OP_SQBKT_SEP OP_UNBOUNDED
|
||||||
|
OP_SQBKT_SEP_opt: | OP_SQBKT_SEP_unbounded
|
||||||
error_opt: | error
|
error_opt: | error
|
||||||
|
|
||||||
/* for [*i..j] and [=i..j] */
|
/* for [*i..j] and [=i..j] */
|
||||||
sqbracketargs: OP_SQBKT_NUM OP_SQBKT_SEP OP_SQBKT_NUM OP_SQBKT_CLOSE
|
sqbracketargs: OP_SQBKT_NUM OP_SQBKT_SEP OP_SQBKT_NUM OP_SQBKT_CLOSE
|
||||||
{ $$.min = $1; $$.max = $3; }
|
{ $$.min = $1; $$.max = $3; }
|
||||||
| OP_SQBKT_NUM OP_SQBKT_SEP OP_SQBKT_CLOSE
|
| OP_SQBKT_NUM OP_SQBKT_SEP_unbounded OP_SQBKT_CLOSE
|
||||||
{ $$.min = $1; $$.max = bunop::unbounded; }
|
{ $$.min = $1; $$.max = bunop::unbounded; }
|
||||||
| OP_SQBKT_SEP OP_SQBKT_NUM OP_SQBKT_CLOSE
|
| OP_SQBKT_SEP OP_SQBKT_NUM OP_SQBKT_CLOSE
|
||||||
{ $$.min = 0U; $$.max = $2; }
|
{ $$.min = 0U; $$.max = $2; }
|
||||||
|
|
@ -208,11 +210,11 @@ sqbracketargs: OP_SQBKT_NUM OP_SQBKT_SEP OP_SQBKT_NUM OP_SQBKT_CLOSE
|
||||||
/* [->i..j] has default values that are different than [*] and [=]. */
|
/* [->i..j] has default values that are different than [*] and [=]. */
|
||||||
gotoargs: OP_GOTO_OPEN OP_SQBKT_NUM OP_SQBKT_SEP OP_SQBKT_NUM OP_SQBKT_CLOSE
|
gotoargs: OP_GOTO_OPEN OP_SQBKT_NUM OP_SQBKT_SEP OP_SQBKT_NUM OP_SQBKT_CLOSE
|
||||||
{ $$.min = $2; $$.max = $4; }
|
{ $$.min = $2; $$.max = $4; }
|
||||||
| OP_GOTO_OPEN OP_SQBKT_NUM OP_SQBKT_SEP OP_SQBKT_CLOSE
|
| OP_GOTO_OPEN OP_SQBKT_NUM OP_SQBKT_SEP_unbounded OP_SQBKT_CLOSE
|
||||||
{ $$.min = $2; $$.max = bunop::unbounded; }
|
{ $$.min = $2; $$.max = bunop::unbounded; }
|
||||||
| OP_GOTO_OPEN OP_SQBKT_SEP OP_SQBKT_NUM OP_SQBKT_CLOSE
|
| OP_GOTO_OPEN OP_SQBKT_SEP OP_SQBKT_NUM OP_SQBKT_CLOSE
|
||||||
{ $$.min = 1U; $$.max = $3; }
|
{ $$.min = 1U; $$.max = $3; }
|
||||||
| OP_GOTO_OPEN OP_SQBKT_SEP OP_SQBKT_CLOSE
|
| OP_GOTO_OPEN OP_SQBKT_SEP_unbounded OP_SQBKT_CLOSE
|
||||||
{ $$.min = 1U; $$.max = bunop::unbounded; }
|
{ $$.min = 1U; $$.max = bunop::unbounded; }
|
||||||
| OP_GOTO_OPEN OP_SQBKT_CLOSE
|
| OP_GOTO_OPEN OP_SQBKT_CLOSE
|
||||||
{ $$.min = $$.max = 1U; }
|
{ $$.min = $$.max = 1U; }
|
||||||
|
|
|
||||||
|
|
@ -116,8 +116,15 @@ flex_set_buffer(const char* buf, int start_tok)
|
||||||
yylloc->step();
|
yylloc->step();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<sqbracket>","|".." return token::OP_SQBKT_SEP;
|
/* .. is from PSL and EDL
|
||||||
|
: is from Verilog and PSL
|
||||||
|
to is from VHDL
|
||||||
|
, is from Perl */
|
||||||
|
<sqbracket>","|".."|":"|"to" return token::OP_SQBKT_SEP;
|
||||||
|
|
||||||
|
/* In SVA you use [=1:$] instead of [=1..]. We will also
|
||||||
|
accept [=1..$] and [=1:]. */
|
||||||
|
<sqbracket>"$" return token::OP_UNBOUNDED;
|
||||||
|
|
||||||
/* & and | come from Spin. && and || from LTL2BA.
|
/* & and | come from Spin. && and || from LTL2BA.
|
||||||
/\, \/, and xor are from LBTT.
|
/\, \/, and xor are from LBTT.
|
||||||
|
|
|
||||||
|
|
@ -127,13 +127,13 @@ run 0 ../equals '{a[*0]}' '{[*0]}'
|
||||||
run 0 ../equals '{a[*..]}' '{a[*]}'
|
run 0 ../equals '{a[*..]}' '{a[*]}'
|
||||||
run 0 ../equals '{a[*2..3][*4..5]}' '{a[*8..15]}'
|
run 0 ../equals '{a[*2..3][*4..5]}' '{a[*8..15]}'
|
||||||
run 0 ../equals '{a[*4..5][*2..3]}' '{a[*4..5][*2..3]}'
|
run 0 ../equals '{a[*4..5][*2..3]}' '{a[*4..5][*2..3]}'
|
||||||
run 0 ../equals '{a[*2..3][*]}' '{a[*2..3][*]}'
|
run 0 ../equals '{a[*2:3][*]}' '{a[*2 to 3][*]}'
|
||||||
run 0 ../equals '{a[*1..3][*]}' '{a[*]}'
|
run 0 ../equals '{a[*1..3][*]}' '{a[*]}'
|
||||||
run 0 ../equals '{a[*][*2..3]}' '{a[*]}'
|
run 0 ../equals '{a[*][*2..3]}' '{a[*]}'
|
||||||
run 0 ../equals '{a[*..3][*2]}' '{a[*..6]}'
|
run 0 ../equals '{a[*..3][*2]}' '{a[*..6]}'
|
||||||
run 0 ../equals '{a[*..3][*..2]}' '{a[*..6]}'
|
run 0 ../equals '{a[*..3][*to2]}' '{a[*:6]}'
|
||||||
run 0 ../equals '{a[*..3][*2..]}' '{a[*]}'
|
run 0 ../equals '{a[*..3][*2..$]}' '{a[*]}'
|
||||||
run 0 ../equals '{a[*..3][*2..]}' '{a[*]}'
|
run 0 ../equals '{a[*..3][*2:]}' '{a[*]}'
|
||||||
run 0 ../equals '{a[*1..]}' '{a[+]}'
|
run 0 ../equals '{a[*1..]}' '{a[+]}'
|
||||||
run 0 ../equals '{a[+][*1..3]}' '{a[+]}'
|
run 0 ../equals '{a[+][*1..3]}' '{a[+]}'
|
||||||
run 0 ../equals '{a[*1..3][+]}' '{a[+]}'
|
run 0 ../equals '{a[*1..3][+]}' '{a[+]}'
|
||||||
|
|
@ -147,15 +147,15 @@ run 0 ../equals '{0[=0]}' '{[*]}'
|
||||||
run 0 ../equals '{0[=0..10]}' '{*}'
|
run 0 ../equals '{0[=0..10]}' '{*}'
|
||||||
run 0 ../equals '{0[=0..]}' '{*}'
|
run 0 ../equals '{0[=0..]}' '{*}'
|
||||||
run 0 ../equals '{1[=0]}' '{[*0]}'
|
run 0 ../equals '{1[=0]}' '{[*0]}'
|
||||||
run 0 ../equals '{1[=1..2]}' '{[*1..2]}'
|
run 0 ../equals '{1[=1..2]}' '{[*1,2]}'
|
||||||
run 0 ../equals '{1[=..4]}' '{1[*..4]}'
|
run 0 ../equals '{1[=..4]}' '{1[*..4]}'
|
||||||
run 0 ../equals '{b[=0]}' '{(!b)[*]}'
|
run 0 ../equals '{b[=0]}' '{(!b)[*]}'
|
||||||
run 0 ../equals '{b[=0..]}' '{*}'
|
run 0 ../equals '{b[=0to$]}' '{*}'
|
||||||
|
|
||||||
run 0 ../equals '{0[->10..100];b}' '0'
|
run 0 ../equals '{0[->10..100];b}' '0'
|
||||||
run 0 ../equals '{0[->1..];b}' '0'
|
run 0 ../equals '{0[->1..];b}' '0'
|
||||||
run 0 ../equals '{0[->0..100];b}' '{b}'
|
run 0 ../equals '{0[->0,100];b}' '{b}'
|
||||||
run 0 ../equals '{0[->0..];b}' '{b}'
|
run 0 ../equals '{0[->0..$];b}' '{b}'
|
||||||
run 0 ../equals '{1[->0];b}' '{b}'
|
run 0 ../equals '{1[->0];b}' '{b}'
|
||||||
run 0 ../equals '{1[->10,20];b}' '{[*10..20];b}'
|
run 0 ../equals '{1[->10,20];b}' '{[*10..20];b}'
|
||||||
run 0 ../equals '{1[->..];b}' '{[*1..];b}'
|
run 0 ../equals '{1[->..];b}' '{[*1..];b}'
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue