Support reading the new style of neverclaim output by Spin 6.24+.

* src/neverparse/neverclaimparse.yy, src/neverparse/neverclaimscan.ll:
Allow transitions between do..od, recognize atomic and assert.
* src/neverparse/parsedecl.hh: Pass the error_list to the lexer.
* src/tgbatest/neverclaimread.test: Add a test case.
This commit is contained in:
Alexandre Duret-Lutz 2013-07-09 06:14:38 +02:00
parent ff102d3d94
commit 327bd2d621
4 changed files with 162 additions and 28 deletions

View file

@ -1,5 +1,5 @@
/* Copyright (C) 2010, 2011 Laboratoire de Recherche et Développement de
** l'Epita (LRDE).
/* Copyright (C) 2010, 2011, 2013 Laboratoire de Recherche et
** Développement de l'Epita (LRDE).
**
** This file is part of Spot, a model checking library.
**
@ -23,6 +23,7 @@
%{
#include <string>
#include "neverparse/parsedecl.hh"
#include "misc/escape.hh"
#define YY_USER_ACTION \
yylloc->columns(yyleng);
@ -30,9 +31,13 @@
#define YY_NEVER_INTERACTIVE 1
typedef neverclaimyy::parser::token token;
static int parent_level = 0;
static bool missing_parent = false;
%}
%x in_par
eol \n|\r|\n\r|\r\n
%%
@ -50,11 +55,46 @@ eol \n|\r|\n\r|\r\n
"skip" return token::SKIP;
"if" return token::IF;
"fi" return token::FI;
"do" return token::DO;
"od" return token::OD;
"->" return token::ARROW;
"goto" return token::GOTO;
"false"|"0" return token::FALSE;
"atomic" return token::ATOMIC;
"assert" return token::ASSERT;
("!"[ \t]*)?"(".*")"|"true"|"1" {
("!"[ \t]*)?"(" {
parent_level = 1;
BEGIN(in_par);
yylval->str = new std::string(yytext,yyleng);
}
<in_par>{
"(" {
++parent_level;
yylval->str->append(yytext, yyleng);
}
")" {
yylval->str->append(yytext, yyleng);
if (!--parent_level)
{
BEGIN(0);
spot::trim(*yylval->str);
return token::FORMULA;
}
}
[^()]+ yylval->str->append(yytext, yyleng);
<<EOF>> {
unput(')');
if (!missing_parent)
error_list.push_back(
spot::neverclaim_parse_error(*yylloc,
"missing closing parenthese"));
missing_parent = true;
}
}
"true"|"1" {
yylval->str = new std::string(yytext, yyleng);
return token::FORMULA;
}
@ -95,5 +135,6 @@ namespace spot
neverclaimyyclose()
{
fclose(yyin);
missing_parent = false;
}
}