Fix some more shift/reduce conflicts

refs #7800
This commit is contained in:
Gunnar Beutner 2014-11-23 12:06:47 +01:00
parent e8e4268a28
commit 9a49e085cd
4 changed files with 20 additions and 11 deletions

View File

@ -287,6 +287,7 @@ in return T_IN;
}
[\r\n]+ { yycolumn -= strlen(yytext) - 1; if (!ignore_newlines) return T_NEWLINE; }
<<EOF>> { if (!yyextra->m_Eof) { yyextra->m_Eof = true; return T_NEWLINE; } else { yyterminate(); } }
. return yytext[0];
%%

View File

@ -1,5 +1,5 @@
%{
#define YYDEBUG 1
#define YYDEBUG 1
/******************************************************************************
* Icinga 2 *
@ -255,7 +255,8 @@ Expression *ConfigCompiler::Compile(void)
m_Expressions.push(std::vector<Expression *>());
try {
yyparse(this);
if (yyparse(this) != 0)
BOOST_THROW_EXCEPTION(ConfigError("Syntax error"));
DictExpression *expr = new DictExpression(m_Expressions.top());
m_Expressions.pop();
@ -278,28 +279,27 @@ Expression *ConfigCompiler::Compile(void)
%}
%%
statements: /* empty */
| statements statement
statements: statement sep
| statements statement sep
;
statement: type | library | constant
{ }
| newlines
{ }
| lterm
{
printf("lterm!\n");
m_Expressions.top().push_back($1);
}
;
library: T_LIBRARY T_STRING sep
library: T_LIBRARY T_STRING
{
context->HandleLibrary($2);
free($2);
}
;
constant: T_CONST identifier T_SET rterm sep
constant: T_CONST identifier T_SET rterm
{
VMFrame frame;
ScriptVariable::Ptr sv = ScriptVariable::Set($2, $4->Evaluate(frame));
@ -329,7 +329,7 @@ type: T_TYPE identifier
m_Type->Register();
}
}
type_inherits_specifier typerulelist sep
type_inherits_specifier typerulelist
{
TypeRuleList::Ptr ruleList = *$5;
delete $5;
@ -589,7 +589,7 @@ lterm: T_LOCAL indexer combined_set_op rterm
$$ = new SetExpression(*$1, $2, $3, false, DebugInfoRange(@1, @3));
delete $1;
}
| T_INCLUDE rterm sep
| T_INCLUDE rterm
{
VMFrame frame;
$$ = context->HandleInclude($2->Evaluate(frame), false, DebugInfoRange(@1, @2));

View File

@ -41,7 +41,7 @@ std::vector<String> ConfigCompiler::m_IncludeSearchDirs;
* @param zone The zone.
*/
ConfigCompiler::ConfigCompiler(const String& path, std::istream *input, const String& zone)
: m_Path(path), m_Input(input), m_Zone(zone)
: m_Path(path), m_Input(input), m_Zone(zone), m_Eof(false)
{
InitializeScanner();
}

View File

@ -29,6 +29,11 @@
#include <iostream>
#include <boost/function.hpp>
typedef union YYSTYPE YYSTYPE;
typedef void *yyscan_t;
int yylex(YYSTYPE *context, icinga::DebugInfo *di, yyscan_t scanner);
namespace icinga
{
@ -73,11 +78,14 @@ private:
String m_Zone;
void *m_Scanner;
bool m_Eof;
static std::vector<String> m_IncludeSearchDirs;
void InitializeScanner(void);
void DestroyScanner(void);
friend int ::yylex(YYSTYPE *context, icinga::DebugInfo *di, yyscan_t scanner);
};
class I2_CONFIG_API ConfigFragmentRegistry : public Registry<ConfigFragmentRegistry, String>