📄 lp.y
字号:
/* ========================================================================= */
/* NAME : lp.y */
/* ========================================================================= */
%token VAR CONS SIGN AR_M_OP RE_OP END_C COMMA COLON MINIMISE MAXIMISE
%{
#include "lpkit.h"
#include "lpglob.h"
#include "read.h"
/* globals */
char Last_var[NAMELEN];
char Constraint_name[NAMELEN];
int Lin_term_count;
REAL f;
int x;
int Sign;
int isign; /* internal_sign variable to make sure nothing goes wrong */
/* with lookahead */
int make_neg; /* is true after the relational operator is seen in order */
/* to remember if lin_term stands before or after re_op */
int Within_int_decl = FALSE; /* TRUE when we are within an int declaration */
%}
%start inputfile
%%
inputfile :
{
init_read();
isign = 0;
make_neg = 0;
Sign = 0;
}
objective_function
constraints
int_declarations
;
constraints : constraint
| constraints
constraint
;
constraint : real_constraint
| VAR COLON
{
add_constraint_name(Last_var, Rows);
}
real_constraint
;
real_constraint : x_lineair_sum
RE_OP
{
store_re_op();
make_neg = 1;
}
x_lineair_sum
END_C
{
if(Lin_term_count == 0) {
fprintf(stderr, "WARNING line %d: constraint contains no variables\n",
yylineno);
null_tmp_store();
}
if(Lin_term_count > 1)
Rows++;
if(Lin_term_count == 1)
store_bounds();
Lin_term_count = 0;
isign = 0 ;
make_neg = 0;
Constraint_name[0] = '\0';
}
;
int_declarations: /* EMPTY */
| real_int_decls
;
real_int_decls : int_declaration
| real_int_decls int_declaration
;
int_declaration : int_declarator vars END_C
;
int_declarator : VAR {check_decl(Within_int_decl);}
;
vars : VAR {if(!Ignore_decl)add_int_var((char *)yytext);}
| vars VAR {if(!Ignore_decl)add_int_var((char *)yytext);}
| vars COMMA VAR {if(!Ignore_decl)add_int_var((char *)yytext);}
;
x_lineair_sum : x_lineair_term
| SIGN
{
isign = Sign;
}
x_lineair_term
| x_lineair_sum
SIGN
{
isign = Sign;
}
x_lineair_term
;
x_lineair_term : lineair_term
| CONS
{
if ( (isign || !make_neg)
&& !(isign && !make_neg)) /* but not both! */
f = -f;
rhs_store(f);
isign = 0;
}
;
lineair_sum : lineair_term
| SIGN
{
isign = Sign;
}
lineair_term
| lineair_sum
SIGN
{
isign = Sign;
}
lineair_term
;
lineair_term : VAR
{
if ( (isign || make_neg)
&& !(isign && make_neg)) /* but not both! */
var_store(Last_var, Rows, (REAL) -1);
else
var_store(Last_var, Rows, (REAL) 1);
isign = 0;
}
| CONS
VAR
{
if ( (isign || make_neg)
&& !(isign && make_neg)) /* but not both! */
f = -f;
var_store(Last_var, Rows, f);
isign = 0;
}
| CONS
AR_M_OP
VAR
{
if ( (isign || make_neg)
&& !(isign && make_neg)) /* but not both! */
f = -f;
var_store(Last_var, Rows, f);
isign = 0;
}
;
objective_function: MAXIMISE real_of
{
Maximise = TRUE;
}
| MINIMISE real_of
{
Maximise = FALSE;
}
| real_of
;
real_of: lineair_sum
END_C
{
Rows++;
Lin_term_count = 0;
isign = 0;
make_neg = 0;
}
| END_C /* allow empty OF */
{
Rows++;
Lin_term_count = 0;
isign = 0;
make_neg = 0;
}
;
%%
#include "lex.c"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -