diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/utilities/nttools/texpand/lexer.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'pkg/utilities/nttools/texpand/lexer.x')
-rw-r--r-- | pkg/utilities/nttools/texpand/lexer.x | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/pkg/utilities/nttools/texpand/lexer.x b/pkg/utilities/nttools/texpand/lexer.x new file mode 100644 index 00000000..cb4d5d7c --- /dev/null +++ b/pkg/utilities/nttools/texpand/lexer.x @@ -0,0 +1,114 @@ +include "lexoper.h" + +define start_ 90 + +# LEXER -- Lexically analyze a rule base +# +# B.Simon 25-Apr-88 Original + +procedure lexer (rb, oper, value, maxch) + +pointer rb # i: Pointer to descriptor of rule base +int oper # o: Operator type found +char value[ARB] # o: Text of operator +int maxch # i: Maximum length of string +#-- +char dic_text[2] +int junk, old_index, dic_index, dic_oper[5] +pointer sp, ch, blanks + +data dic_oper /SEPOPR, IMPOPR, OROPR, ANDOPR, EQOPR/ +string dict "/;/=>/||/&&/=/" + +bool streq() +int getline(), ctowrd(), span(), nospan(), strdic() + +begin + # Allocate an array to hold whitespace + + call smark (sp) + call salloc (blanks, SZ_LINE, TY_CHAR) + + # Skip over leading whitespace + +start_ junk = span (" \t", RB_LINE(rb), RB_INDEX(rb), Memc[blanks], SZ_LINE) + + # Branch on first non-white character + + ch = RB_CHARPTR(rb) + + # End of line or beginning of comment + + if (Memc[ch] == '\n' || Memc[ch] == '#' || Memc[ch] == EOS) { + if (getline (RB_FILE(rb), RB_LINE(rb)) == EOF) { + oper = ENDOPR + value[1] = EOS + } else { + RB_NLINE(rb) = RB_NLINE(rb) + 1 + RB_INDEX(rb) = 1 + goto start_ + } + + # Quoted identifier + + } else if (Memc[ch] == '\'' || Memc[ch] == '"') { + junk = ctowrd (RB_LINE(rb), RB_INDEX(rb), value, maxch) + oper = IDOPR + + # Unquoted identifier + + } else if (nospan ("=&|; \t\n", RB_LINE(rb), RB_INDEX(rb), + value, maxch) > 0 ) { + oper = IDOPR + + # Other operator + + } else { + old_index = RB_INDEX(rb) + junk = span ("=>&|;", RB_LINE(rb), RB_INDEX(rb), value, 2) + dic_index = strdic (value, dic_text, 2, dict) + if (dic_index > 0 && streq (value, dic_text)) { + oper = dic_oper[dic_index] + } else { + RB_INDEX(rb) = old_index + junk = ctowrd (RB_LINE(rb), RB_INDEX(rb), value, maxch) + oper = IDOPR + } + } + + call sfree (sp) +end + +# LEXINIT -- Initialize the lexical analyzer + +procedure lexinit (rbase, rb) + +char rbase[ARB] # i: Name of rule base file +pointer rb # o: Pointer to rule base descriptor +#-- + +int open() +errchk calloc, open + +begin + call malloc (rb, RB_LENGTH, TY_INT) + + RB_FILE(rb) = open (rbase, READ_ONLY, TEXT_FILE) + RB_INDEX(rb) = 1 + RB_NLINE(rb) = 0 + RB_LINE(rb) = EOS +end + +#LEXCLOSE -- Close the lexical analyzer + +procedure lexclose (rb) + +pointer rb # i: Pointer to rule base descriptor +#-- + +errchk close, mfree + +begin + call close (RB_FILE(rb)) + call mfree (rb, TY_INT) +end |