diff options
Diffstat (limited to 'web/yacco2/compiler/grammars/angled_string.lex')
-rw-r--r-- | web/yacco2/compiler/grammars/angled_string.lex | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/web/yacco2/compiler/grammars/angled_string.lex b/web/yacco2/compiler/grammars/angled_string.lex new file mode 100644 index 0000000000..23e3929fa3 --- /dev/null +++ b/web/yacco2/compiler/grammars/angled_string.lex @@ -0,0 +1,172 @@ +/* + Copyright Dave Bone 1998 - 2014 + All Rights Reserved. + No part of this document may be reproduced without written consent from the author. + +FILE: angled_string.lex +Dates: 2 mar. 2005 +Purpose: angle bracket filename: Eg <yacco2.h> +Returned: T_angled_string + Err_bad_eos - meta terminal indicating an improper end-of-string + this occurs on eof,eog, or an eol terminal ending the string + Err_bad_esc - bad escape sequence. +Note: Stripped of its bounding <> for ease of use +*/ +/@ +@i "/usr/local/yacco2/copyright.w" +@** |angled_string| Thread.\fbreak +It recognizes +character sequences of example ${<}$ my disc ${>}$ +typically used in a c++ include statement or in my case files to be +read either thru my own include statements or from the +command line. +|esc_seq| thread evaluates the c++ literal character escape sequences buried +inside the angled brackets. +The escape sequences cover the backslash variety --- +octal, hex, and character, and +those pesky unicode types. +Nothing is done with them at present --- only their syntax is +recognized. +The |esc_seq| terminal returned contains the +character string parsed. +The |angled_string| returned contains the enclosed character string +without the bounding angle brackets. +So ${<}$ my disc ${>}$ becomes ``my disc'' without the quotes. +The {\bf empty string} is tollerated. +It is left to the calling grammar to deal with it.\fbreak +\fbreak +Errors:\fbreak +Caused by either an invalid character escape sequence or an improper closing of the +|angled_string| --- an end of line or file etc +before possibly omitted closing +``${>}$'' bracket. +These two conditions are indicated by the 2 error terminals + |Err_bad_esc| and |Err_bad_eos|.\fbreak +\fbreak +Returned T: |T_angled_string| \fbreak +@/ +fsm +(fsm-id "angled_string.lex",fsm-filename angled_string,fsm-namespace NS_angled_string +,fsm-class Cangled_string { + user-prefix-declaration +#include "esc_seq.h" + *** + user-declaration + public: + char ddd_[1024*32]; + int ddd_idx_; + void copy_str_into_buffer(std::string* Str); + void copy_kstr_into_buffer(const char* Str); + *** + user-implementation + void Cangled_string::copy_str_into_buffer(std::string* Str){ + const char* y = Str->c_str(); + int x(0); + for(;y[x]!=0;++x,++ddd_idx_)ddd_[ddd_idx_] = y[x]; + ddd_[ddd_idx_] = 0; + } +/@ +@*3 |copy_kstr_into_buffer|. +@/ + + void Cangled_string::copy_kstr_into_buffer(const char* Str){ + const char* y = Str; + int x(0); + for(;y[x]!=0;++x,++ddd_idx_)ddd_[ddd_idx_] = y[x]; + ddd_[ddd_idx_] = 0; + } + *** + constructor + ddd_idx_ = 0; + ddd_[ddd_idx_] = 0; + *** + op + ddd_idx_ = 0; + ddd_[ddd_idx_] = 0; + *** +} +,fsm-version "1.0" ,fsm-date "17 Juin 2003" +,fsm-debug "false" +,fsm-comments "Angled string lexer: < ... > with c type escape sequences.") +parallel-parser +( + parallel-thread-function + TH_angled_string + *** + parallel-la-boundary + eolr + *** +) +@"/usr/local/yacco2/compiler/grammars/yacco2_T_includes.T" + +rules{ +Rangled_string () +{ + -> Ropen_angle |.|{ + op + Cangled_string* fsm = (Cangled_string*) rule_info__.parser__->fsm_tbl__; + CAbs_lr1_sym* sym = new T_angled_string((const char*)&fsm->ddd_); + sym->set_rc(*rule_info__.parser__->start_token__,__FILE__,__LINE__); + RSVP(sym); + *** + } +} + +Ropen_angle (){ + -> "<" { + op + Cangled_string* fsm = (Cangled_string*) rule_info__.parser__->fsm_tbl__; +loop: + switch (rule_info__.parser__->current_token()->enumerated_id__){ + case T_Enum::T_raw_lf_: goto overrun; + case T_Enum::T_raw_cr_: goto overrun; + case T_Enum::T_LR1_eog_: goto overrun; + case T_Enum::T_raw_gt_than_: goto closestr; + case T_Enum::T_raw_back_slash_: goto escseq; + default: goto other; + } + closestr:{ // end of string + rule_info__.parser__->get_next_token(); + return;// end of angled string + } + overrun:{ + CAbs_lr1_sym* sym = new Err_bad_eos; + sym->set_rc(*rule_info__.parser__->start_token__,__FILE__,__LINE__); + RSVP(sym); + rule_info__.parser__->set_stop_parse(true); + return; + } + escseq:{ // what type of escape + using namespace NS_esc_seq; + Parser::parse_result result = + rule_info__.parser__->start_manually_parallel_parsing(ITH_esc_seq.thd_id__); + if(result == Parser::erred){ + // in this case, it will not happen: here for education + rule_info__.parser__->set_abort_parse(true); + return; + } + // process returned token + Caccept_parse& accept_parm = *rule_info__.parser__->arbitrated_token__; + CAbs_lr1_sym* rtn_tok = accept_parm.accept_token__; + int id = rtn_tok->enumerated_id__; + accept_parm.accept_token__ = 0; + if(id != T_Enum::T_T_esc_seq_) { + RSVP(rtn_tok); + return; + } + T_esc_seq* finc = (T_esc_seq*)(rtn_tok); + fsm->copy_str_into_buffer(finc->esc_data()); + rule_info__.parser__->override_current_token(*accept_parm.la_token__ + ,accept_parm.la_token_pos__); + delete finc; +goto loop; + }; + other:{ + fsm->copy_kstr_into_buffer(rule_info__.parser__->current_token()->id__); + rule_info__.parser__->get_next_token(); +goto loop; + } + *** + } +} +}// end of rules |