Skip to content

Commit

Permalink
d_build_def_semtrex now handles optionality in defs correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
zippy committed Jul 17, 2016
1 parent efb8bbf commit f2b6e57
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 9 deletions.
4 changes: 2 additions & 2 deletions spec/ceptr_specs.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ int main(int argc, const char **argv) {
testAccumulator();
testProtocol();

/* /\**** receptor tests *\/ */
/* /\* /\\* testGroup(); *\\/ *\/ */
/**** receptor tests */
/* testGroup(); */

testHTTP();

Expand Down
14 changes: 10 additions & 4 deletions spec/def_spec.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,17 +187,23 @@ void testDefSemtrex() {
_t_free(stx);

stx = _d_build_def_semtrex(r->sem,HTTP_REQUEST,0);
spec_is_str_equal(t2s(stx),"(SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_LINE) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_VERSION) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:VERSION_MAJOR)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:VERSION_MINOR)))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_METHOD)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_SEGMENTS) (SEMTREX_ZERO_OR_MORE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_SEGMENT)))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_FILE) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:FILE_NAME)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:FILE_EXTENSION)))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_QUERY) (SEMTREX_ZERO_OR_MORE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_QUERY_PARAMS) (SEMTREX_ZERO_OR_MORE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_QUERY_PARAM) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:PARAM_KEY)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:PARAM_VALUE)))))))))))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_HEADERS) (SEMTREX_ZERO_OR_MORE (SEMTREX_OR (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_HEADER) (SEMTREX_OR (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_HOST)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_USER_AGENT)))) (SEMTREX_OR (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_GENERAL_HEADER) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HEADER_KEY)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HEADER_VALUE)))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_ENTITY_HEADER) (SEMTREX_OR (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:CONTENT_TYPE) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:MEDIA_TYPE_IDENT)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:MEDIA_SUBTYPE_IDENT)) (SEMTREX_ZERO_OR_MORE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:MEDIA_PARAM) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:PARAM_KEY)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:PARAM_VALUE))))))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:CONTENT_ENCODING)))))))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_BODY))))");
spec_is_str_equal(_dump_semtrex(G_sem,stx,buf),"/HTTP_REQUEST/(HTTP_REQUEST_LINE/(HTTP_REQUEST_VERSION/(VERSION_MAJOR,VERSION_MINOR),HTTP_REQUEST_METHOD,HTTP_REQUEST_PATH/(HTTP_REQUEST_PATH_SEGMENTS/HTTP_REQUEST_PATH_SEGMENT*,HTTP_REQUEST_PATH_FILE/(FILE_NAME,FILE_EXTENSION),HTTP_REQUEST_PATH_QUERY/HTTP_REQUEST_PATH_QUERY_PARAMS/HTTP_REQUEST_PATH_QUERY_PARAM/(PARAM_KEY,PARAM_VALUE)**)),HTTP_REQUEST_HEADERS/HTTP_REQUEST_HEADER/(HTTP_REQUEST_HOST|HTTP_REQUEST_USER_AGENT)|(HTTP_GENERAL_HEADER/(HEADER_KEY,HEADER_VALUE)|HTTP_ENTITY_HEADER/(CONTENT_TYPE/(MEDIA_TYPE_IDENT,MEDIA_SUBTYPE_IDENT,MEDIA_PARAM/(PARAM_KEY,PARAM_VALUE)*)|CONTENT_ENCODING))*,HTTP_REQUEST_BODY)");
spec_is_str_equal(t2s(stx),"(SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_LINE) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_VERSION) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:VERSION_MAJOR)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:VERSION_MINOR)))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_METHOD)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_SEGMENTS) (SEMTREX_ZERO_OR_MORE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_SEGMENT)))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_FILE) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:FILE_NAME)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:FILE_EXTENSION)))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_QUERY) (SEMTREX_ZERO_OR_MORE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_QUERY_PARAMS) (SEMTREX_ZERO_OR_MORE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_PATH_QUERY_PARAM) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:PARAM_KEY)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:PARAM_VALUE)))))))))))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_HEADERS) (SEMTREX_ZERO_OR_MORE (SEMTREX_OR (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_HEADER) (SEMTREX_OR (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_HOST)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_USER_AGENT)))) (SEMTREX_OR (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_GENERAL_HEADER) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HEADER_KEY)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HEADER_VALUE)))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_ENTITY_HEADER) (SEMTREX_OR (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:CONTENT_TYPE) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:MEDIA_TYPE_IDENT)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:MEDIA_SUBTYPE_IDENT)) (SEMTREX_ZERO_OR_MORE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:MEDIA_PARAM) (SEMTREX_SEQUENCE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:PARAM_KEY)) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:PARAM_VALUE))))))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:CONTENT_ENCODING)))))))) (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:HTTP_REQUEST_BODY) (SEMTREX_ZERO_OR_MORE (SEMTREX_SYMBOL_ANY)))))");
spec_is_str_equal(_dump_semtrex(G_sem,stx,buf),"/HTTP_REQUEST/(HTTP_REQUEST_LINE/(HTTP_REQUEST_VERSION/(VERSION_MAJOR,VERSION_MINOR),HTTP_REQUEST_METHOD,HTTP_REQUEST_PATH/(HTTP_REQUEST_PATH_SEGMENTS/HTTP_REQUEST_PATH_SEGMENT*,HTTP_REQUEST_PATH_FILE/(FILE_NAME,FILE_EXTENSION),HTTP_REQUEST_PATH_QUERY/HTTP_REQUEST_PATH_QUERY_PARAMS/HTTP_REQUEST_PATH_QUERY_PARAM/(PARAM_KEY,PARAM_VALUE)**)),HTTP_REQUEST_HEADERS/HTTP_REQUEST_HEADER/(HTTP_REQUEST_HOST|HTTP_REQUEST_USER_AGENT)|(HTTP_GENERAL_HEADER/(HEADER_KEY,HEADER_VALUE)|HTTP_ENTITY_HEADER/(CONTENT_TYPE/(MEDIA_TYPE_IDENT,MEDIA_SUBTYPE_IDENT,MEDIA_PARAM/(PARAM_KEY,PARAM_VALUE)*)|CONTENT_ENCODING))*,HTTP_REQUEST_BODY/.*)");

//debug_enable(D_STX_MATCH);
spec_is_true(_t_match(stx,G_http_req_example));
debug_disable(D_STX_MATCH+D_STX_BUILD);

_t_free(stx);

_r_free(r);
//! [testDefSemtrex]

stx = _d_build_def_semtrex(r->sem,ASCII_CHARS,0);
spec_is_str_equal(t2s(stx),"(SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:ASCII_CHARS) (SEMTREX_ONE_OR_MORE (SEMTREX_SYMBOL_LITERAL (SEMTREX_SYMBOL:ASCII_CHAR))))");
spec_is_str_equal(_dump_semtrex(r->sem,stx,buf),"/ASCII_CHARS/ASCII_CHAR+");

_t_free(stx);

//! [Testdefsemtrex]
}

void testDefSysDefs() {
Expand Down
17 changes: 14 additions & 3 deletions src/def.c
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,9 @@ Protocol _d_define_protocol(SemTable *sem,T *def,Context c) {
T *__d_build_def_semtrex(SemTable *sem,T *def,T *stx) {
Symbol def_sym = _t_symbol(def);
if (semeq(def_sym,STRUCTURE_SYMBOL)) {
stx = _d_build_def_semtrex(sem,*(Symbol *)_t_surface(def),stx);
Symbol sym = *(Symbol *)_t_surface(def);
if (!semeq(NULL_SYMBOL,sym))
stx = _d_build_def_semtrex(sem,sym,stx);
}
else if (semeq(def_sym,STRUCTURE_SEQUENCE)) {
int i,c = _t_children(def);
Expand Down Expand Up @@ -395,10 +397,20 @@ T *__d_build_def_semtrex(SemTable *sem,T *def,T *stx) {
stx = last;
}
}
else if (semeq(def_sym,STRUCTURE_ANYTHING)) {
stx = _t_newr(stx,SEMTREX_ZERO_OR_MORE);
stx = _t_newr(stx,SEMTREX_SYMBOL_ANY);
if (_t_children(def))
__d_build_def_semtrex(sem,_t_child(def,1),stx);
}
else if (semeq(def_sym,STRUCTURE_ZERO_OR_MORE)) {
stx = _t_newr(stx,SEMTREX_ZERO_OR_MORE);
__d_build_def_semtrex(sem,_t_child(def,1),stx);
}
else if (semeq(def_sym,STRUCTURE_ONE_OR_MORE)) {
stx = _t_newr(stx,SEMTREX_ONE_OR_MORE);
__d_build_def_semtrex(sem,_t_child(def,1),stx);
}
else {
raise_error("translation from %s not implemented\n",_sem_get_name(sem,def_sym));
}
Expand All @@ -422,9 +434,8 @@ T * _d_build_def_semtrex(SemTable *sem,Symbol s,T *parent) {
T *stx = _sl(parent,s);

//printf("building semtrex for %s\n",_sem_get_name(sem,s));

Structure st = _sem_get_symbol_structure(sem,s);
if (!(is_sys_structure(st))) {
if (!semeq(st,NULL_STRUCTURE)) {
T *structure = _sem_get_def(sem,st);
T *def = _t_child(structure,StructureDefDefIdx);
__d_build_def_semtrex(sem,def,stx);
Expand Down

0 comments on commit f2b6e57

Please sign in to comment.