parse_aut: add support for #line
Fixes issue #232. * spot/parseaut/parseaut.yy, spot/parseaut/public.hh, spot/parseaut/scanaut.ll: Add support for #line. * tests/core/parseaut.test: Test it. * NEWS: Mention it.
This commit is contained in:
parent
093de290c1
commit
803a61a03d
5 changed files with 63 additions and 16 deletions
6
NEWS
6
NEWS
|
|
@ -191,6 +191,12 @@ New in spot 2.9.6.dev (not yet released)
|
|||
setting SPOT_SIMULATION_REDUCTION environment variable or using the
|
||||
"-x simul-method=..." option (see spot-x(7)).
|
||||
|
||||
- The automaton parser will now recognize lines of the form
|
||||
#line 10 "filename"
|
||||
that may occur *between* the automata of an input stream to specify
|
||||
that error messages should be emitted as if the next automaton
|
||||
was read from "filename" starting on line 10. (Issue #232)
|
||||
|
||||
Python:
|
||||
|
||||
- Bindings for functions related to games.
|
||||
|
|
|
|||
|
|
@ -255,6 +255,7 @@ extern "C" int strverscmp(const char *s1, const char *s2);
|
|||
%token ACCPAIRS "Acceptance-Pairs:"
|
||||
%token ACCSIG "Acc-Sig:";
|
||||
%token ENDOFHEADER "---";
|
||||
%token <str> LINEDIRECTIVE "#line"
|
||||
|
||||
|
||||
%left '|'
|
||||
|
|
@ -338,6 +339,10 @@ extern "C" int strverscmp(const char *s1, const char *s2);
|
|||
|
||||
%%
|
||||
aut: aut-1 { res.h->loc = @$; YYACCEPT; }
|
||||
/* Not how we do not accept garbage before LINEDIRECTIVE. This is because
|
||||
all error will be relative to the specified filename, so that filename
|
||||
must not be changed after any error was reported. */
|
||||
| LINEDIRECTIVE { res.h->filename = *$1; } aut
|
||||
| ENDOFFILE { YYABORT; }
|
||||
| error ENDOFFILE { YYABORT; }
|
||||
| error aut-1
|
||||
|
|
@ -2635,6 +2640,7 @@ namespace spot
|
|||
check_version(r);
|
||||
last_loc = r.h->loc;
|
||||
last_loc.step();
|
||||
filename_ = r.h->filename; // in case it was changed
|
||||
if (r.h->aborted)
|
||||
{
|
||||
if (opts_.ignore_abort)
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ namespace spot
|
|||
/// Format of the automaton.
|
||||
parsed_aut_type type = parsed_aut_type::Unknown;
|
||||
/// Name of the stream (used for displaying syntax errors)
|
||||
const std::string filename;
|
||||
std::string filename;
|
||||
/// \brief Syntax errors that occurred during parsing.
|
||||
///
|
||||
/// Note that the parser does not print any diagnostic.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* -*- coding: utf-8 -*-
|
||||
** Copyright (C) 2014-2018, 2020 Laboratoire de Recherche et Développement
|
||||
** Copyright (C) 2014-2018, 2020, 2021 Laboratoire de Recherche et Développement
|
||||
** de l'Epita (LRDE).
|
||||
**
|
||||
** This file is part of Spot, a model checking library.
|
||||
|
|
@ -90,6 +90,27 @@ identifier [[:alpha:]_][[:alnum:]_.-]*
|
|||
BEGIN(in_COMMENT);
|
||||
yyextra->comment_level = 1;
|
||||
}
|
||||
<INITIAL>"#line"[ \t]+[0-9]+[ \t]+\"[^\"\n]*\" {
|
||||
errno = 0;
|
||||
char* end;
|
||||
unsigned long n = strtoul(yytext + 5, &end, 10);
|
||||
yylval->num = n;
|
||||
if (errno || yylval->num != n)
|
||||
{
|
||||
error_list.push_back(spot::parse_aut_error(*yylloc, "value too large")); }
|
||||
else if (error_list.empty())
|
||||
{
|
||||
char* beg = strchr(end, '"');
|
||||
end = strrchr(beg + 1, '"');
|
||||
yylval->str = new std::string(beg + 1, end);
|
||||
yylloc->initialize(nullptr, n - 1, yylloc->begin.column);
|
||||
return token::LINEDIRECTIVE;
|
||||
}
|
||||
else
|
||||
{
|
||||
error_list.push_back(spot::parse_aut_error(*yylloc, "#line may not occur after any error"));
|
||||
}
|
||||
}
|
||||
<INITIAL>"HOA:" BEGIN(in_HOA); return token::HOA;
|
||||
<INITIAL,in_HOA>"--ABORT--" BEGIN(INITIAL); throw spot::hoa_abort{*yylloc};
|
||||
<INITIAL>"never" BEGIN(in_NEVER); return token::NEVER;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (C) 2014-2018, 2020 Laboratoire de Recherche et Développement de
|
||||
# l'Epita (LRDE).
|
||||
# Copyright (C) 2014-2018, 2020-2021 Laboratoire de Recherche et
|
||||
# Développement de l'Epita (LRDE).
|
||||
#
|
||||
# This file is part of Spot, a model checking library.
|
||||
#
|
||||
|
|
@ -69,6 +69,7 @@ input:2.1-9: ... previously defined here.
|
|||
EOF
|
||||
|
||||
cat >input <<EOF
|
||||
#line 1 "hoa"
|
||||
HOA: v1
|
||||
States: 1
|
||||
Start: 0
|
||||
|
|
@ -80,6 +81,7 @@ State: 0 {0}
|
|||
State: 1 {0}
|
||||
[t] 1
|
||||
--END--
|
||||
#line 1 "lbtt"
|
||||
2 1t
|
||||
2 1
|
||||
1 -1 "b"
|
||||
|
|
@ -103,17 +105,18 @@ EOF
|
|||
|
||||
diff='different state numbers have been used'
|
||||
expecterr input <<EOF
|
||||
input:8.5: state number is larger than state count...
|
||||
input:2.1-9: ... declared here.
|
||||
input:9.8: state number is larger than state count...
|
||||
input:2.1-9: ... declared here.
|
||||
input:10.5: state number is larger than state count...
|
||||
input:2.1-9: ... declared here.
|
||||
input:12.1-19.2: 2 states have been declared, but 3 $diff
|
||||
input:25.5-10: non-Boolean transition label (replaced by true)
|
||||
hoa:8.5: state number is larger than state count...
|
||||
hoa:2.1-9: ... declared here.
|
||||
hoa:9.8: state number is larger than state count...
|
||||
hoa:2.1-9: ... declared here.
|
||||
hoa:10.5: state number is larger than state count...
|
||||
hoa:2.1-9: ... declared here.
|
||||
lbtt:1.1-8.2: 2 states have been declared, but 3 $diff
|
||||
lbtt:14.5-10: non-Boolean transition label (replaced by true)
|
||||
EOF
|
||||
|
||||
cat >input <<EOF
|
||||
#line 1 /* incomplete line directive */
|
||||
HOA: v1
|
||||
States: 1
|
||||
Start: 0
|
||||
|
|
@ -125,15 +128,22 @@ State: 0 {0}
|
|||
State: 0 {0}
|
||||
[t] 0
|
||||
--END--
|
||||
#line 1 "foo" /* line directive at the end is ignored */
|
||||
EOF
|
||||
|
||||
expecterr input <<EOF
|
||||
input:8.2: AP number is larger than the number of APs...
|
||||
input:4.1-5: ... declared here
|
||||
input:9.1-8: redeclaration of state 0
|
||||
input:1.1: syntax error, unexpected invalid token
|
||||
input:9.2: AP number is larger than the number of APs...
|
||||
input:5.1-5: ... declared here
|
||||
input:10.1-8: redeclaration of state 0
|
||||
input:1.1-7: leading garbage was ignored
|
||||
EOF
|
||||
|
||||
cat >input <<EOF
|
||||
#line 0 invalid
|
||||
#line -0 "invalid"
|
||||
#line 99999999999999 "too large"
|
||||
#line 1 "real"
|
||||
HOA: v1
|
||||
States: 0
|
||||
AP: 1 "a" "b"
|
||||
|
|
@ -143,7 +153,11 @@ Acceptance: 0 t
|
|||
EOF
|
||||
|
||||
expecterr input <<EOF
|
||||
input:3.1-13: found 2 atomic propositions instead of the 1 announced
|
||||
input:1.1: syntax error, unexpected invalid token
|
||||
input:3.1-32: value too large
|
||||
input:4.1-14: #line may not occur after any error
|
||||
input:7.1-13: found 2 atomic propositions instead of the 1 announced
|
||||
input:1.1-2.18: leading garbage was ignored
|
||||
EOF
|
||||
|
||||
cat >input <<EOF
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue