@=~ ~p typesetter = texinfo ~p maximum_input_line_length = infinity ~O~~{ ~ ~} ~O~~{ ~ ~} ~O~~{ ~ ~} ~O~~{ ~ ~} ~$~+=~{ #define REPETITION_INFINITE -1 #define REPETITION_ERROR -2 extern int getCharBound(char *s,int coding); extern int ConvertRepetitionRange(char *s); ~} ~$~+=~{ #include #include "regexpr.check.h" int getCharBound(char *s,int coding) { if(s[0]==0) return -1; if(coding == 0) { if(s[1] == 0) return s[0]; else return -1; } char *endptr; int intval; intval=strtol(s, &endptr, (coding==1 ? 8 : coding == 2? 10 : 16) ); if(endptr[0] == 0 && intval>=0) return intval; else return -1; } int ConvertRepetitionRange(char *s) { char *endptr; int intval; if(s[0]==0) return REPETITION_ERROR; intval=strtol(s, &endptr, 10); if(endptr[0] == 0 && intval>=0) return intval; if(!strcmp(s,"*")) return REPETITION_INFINITE; return REPETITION_ERROR; } ~} ~$~+=~{ #include "regexpr.check.h" ~} ~$~+=~{ #define EMPTY_STRING(s) NOT(strcmp(s,"")) #define AND4(a,b,c,d) AND(AND(AND(a,b),c),d) #ifdef __STDC__ #define STR(attr) #attr #else #define STR(attr) "attr" #endif #define SET_DEFAULT_ATTR_VALUE(attr, value) \ IF(SELECT(THIS.attr,isNull()), \ PTGBasicCheckExecute(2,PTGSetAttr2(_currn,STR(attr),value))) TREE SYMBOL RepetitionRange COMPUTE SET_DEFAULT_ATTR_VALUE(persStart,PTGAsIs("0")); SET_DEFAULT_ATTR_VALUE(persEnd,PTGAsIs("*")); END; TREE SYMBOL String COMPUTE IF(EMPTY_STRING(THIS.persValue), message(WARNING, "Empty String! You've forgotten to define a value!", 0, _currn,"view1")); END; TREE SYMBOL RepetitionRange: start: int, end: int, err1: int, err2: int; TREE SYMBOL RepetitionRange COMPUTE SYNT.start=ConvertRepetitionRange(THIS.persStart); SYNT.end=ConvertRepetitionRange(THIS.persEnd); SYNT.err1=LT(THIS.start,0); IF(THIS.err1, message(ERROR, "Left side of Range must be an natural number",0, _currn, "view1")); SYNT.err2=EQ(THIS.end,REPETITION_ERROR); IF(THIS.err2, message(ERROR, "Right side of Range must be an natural number or '*'",0, _currn, "view1")); IF(AND4(NOT(THIS.err1),NOT(THIS.err2),NOT(EQ(THIS.end,REPETITION_INFINITE)),GT(THIS.start,THIS.end)), message(WARNING, "Left side should be less or equal right side", 0 , _currn, "view1")); END; TREE SYMBOL CharInterval: lowerBound: int, upperBound: int; TREE SYMBOL CharInterval COMPUTE SYNT.lowerBound = getCharBound(THIS.persLowerBound,THIS.persLowerBoundCoding); SYNT.upperBound = getCharBound(THIS.persUpperBound,THIS.persUpperBoundCoding); IF(EQ(THIS.lowerBound,NEG(1)), message(ERROR, "Invalid lower bound", 0 , _currn, "view1")); IF(EQ(THIS.upperBound,NEG(1)), message(ERROR, "Invalid upper bound", 0 , _currn, "view1")); IF(AND(GT(THIS.lowerBound,THIS.upperBound), NOT(EQ(THIS.upperBound,NEG(1)))), message(WARNING, "Lower bound should be less or equal upper bound", 0 , _currn, "view1")); END; ~}