From f2b6e574e993b4fc7ec7e96f6fc8e74a675e5599 Mon Sep 17 00:00:00 2001 From: Eric Harris-Braun Date: Sun, 17 Jul 2016 12:42:10 -0400 Subject: [PATCH] d_build_def_semtrex now handles optionality in defs correctly --- spec/ceptr_specs.c | 4 ++-- spec/def_spec.h | 14 ++++++++++---- src/def.c | 17 ++++++++++++++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/spec/ceptr_specs.c b/spec/ceptr_specs.c index b6d04c5e..c0835502 100644 --- a/spec/ceptr_specs.c +++ b/spec/ceptr_specs.c @@ -73,8 +73,8 @@ int main(int argc, const char **argv) { testAccumulator(); testProtocol(); - /* /\**** receptor tests *\/ */ - /* /\* /\\* testGroup(); *\\/ *\/ */ + /**** receptor tests */ + /* testGroup(); */ testHTTP(); diff --git a/spec/def_spec.h b/spec/def_spec.h index efb15b57..e6c56ea3 100644 --- a/spec/def_spec.h +++ b/spec/def_spec.h @@ -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() { diff --git a/src/def.c b/src/def.c index ada80cab..91f0bf6f 100644 --- a/src/def.c +++ b/src/def.c @@ -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); @@ -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)); } @@ -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);