93 #if defined(WINDOWS) || defined(LINUX)
112 #define GET_CHAR ch=*source
113 #define VAR vars[count]
124 #define TOKEN_DIRTY_WORD 2
126 #define TOKEN_CLOSE 4
127 #define TOKEN_LINEEND 5
128 #define TOKEN_SPACE 6
129 #define TOKEN_ERROR 7
140 #define MODE_BARRED 3
141 #define MODE_BACKSLASHED 4
143 #define MODE_SEMITILDE 6
144 #define MODE_SEMICOLON 7
145 #define MODE_TILDESPACE 8
147 #define MODE_GREATER 10
156 #define PAT_TILDE 0x000001
157 #define PAT_PUSH 0x000002
158 #define PAT_NEXT 0x000004
159 #define PAT_DIRTY 0x000008
160 #define PAT_MUTATED 0x000010
161 #define PAT_RETURN_TO_WORD 0x000020
162 #define PAT_RETURN_TO_SELF 0x000040
163 #define PAT_GOTO 0x000080
164 #define PAT_TOKEN 0x000100
165 #define PAT_RETURN 0x000200
166 #define PAT_ERROR_POS 0x000400
167 #define PAT_ERROR 0x000800
168 #define PAT_RETURN_TO_CALLER 0x001000
169 #define PAT_NEXT2 0x002000
180 #define PAT_TOKEN_END PAT_TOKEN+(TOKEN_END<<PAT_SHIFT)
181 #define PAT_TOKEN_SPACE PAT_TOKEN+(TOKEN_SPACE<<PAT_SHIFT)
182 #define PAT_TOKEN_WORD PAT_TOKEN+(TOKEN_WORD<<PAT_SHIFT)
183 #define PAT_TOKEN_LINE PAT_TOKEN+(TOKEN_LINEEND<<PAT_SHIFT)
184 #define PAT_TOKEN_OPEN PAT_TOKEN+(TOKEN_OPEN<<PAT_SHIFT)
185 #define PAT_TOKEN_CLOSE PAT_TOKEN+(TOKEN_CLOSE<<PAT_SHIFT)
187 #define PAT_GOTO_SPACE PAT_GOTO+(MODE_SPACE<<PAT_SHIFT)
188 #define PAT_GOTO_WORD PAT_GOTO+(MODE_WORD<<PAT_SHIFT)
189 #define PAT_GOTO_BACKSLASHED PAT_GOTO+(MODE_BACKSLASHED<<PAT_SHIFT)
190 #define PAT_GOTO_BARRED PAT_GOTO+(MODE_BARRED<<PAT_SHIFT)
191 #define PAT_GOTO_SEMICOLON PAT_GOTO+(MODE_SEMICOLON<<PAT_SHIFT)
192 #define PAT_GOTO_TILDE PAT_GOTO+(MODE_TILDE<<PAT_SHIFT)
193 #define PAT_GOTO_TILDESPACE PAT_GOTO+(MODE_TILDESPACE<<PAT_SHIFT)
194 #define PAT_GOTO_SEMITILDE PAT_GOTO+(MODE_SEMITILDE<<PAT_SHIFT)
195 #define PAT_GOTO_LESS PAT_GOTO+(MODE_LESS<<PAT_SHIFT)
196 #define PAT_GOTO_GREATER PAT_GOTO+(MODE_GREATER<<PAT_SHIFT)
230 chars_t s =
TEXT(
"______________()+-*/=<>|?_______");
233 for( i=0; i<32; i++ )
debar[i]=i;
234 for( i=0; i<128; i++ )
enbar[i]=i;
236 for( i=0; *s; i++,s++ )
238 if( *s==
TEXT(
'_') )
continue;
240 enbar[(
unsigned char)*s] = i;
337 SET_FLAGS( last, initial_flags|final_flags );
349 SET_FLAGS( last, initial_flags|final_flags );
368 if( y==element )
SET_FLAGS( last, initial_flags );
409 int get_token(
atom_t *token,
int method )
426 if( bp==buffer )
return 0;
436 if( ch!=
TEXT(
'E') && ch!=
TEXT(
'e') )
return 0;
440 if( ch<
TEXT(
'0') || ch>
TEXT(
'9') )
return 0;
444 if( ch!=
TEXT(
'.') )
return 0;
448 if( ch<
TEXT(
'0') || ch>
TEXT(
'9') )
return 0;
552 static int mode_backslash[
MAX_MODE] =
580 static int mode_semicolon[
MAX_MODE] =
672 printf(
"<TOKENS> length=%d\n",len);
674 printf(
"<TOKENS> get(#%d)\t",ch);
676 printf(
"<TOKENS> get('%c')\t",ch);
681 case MODE_WORD: printf(
" WORD -> ");
break;
690 code = mode_else[mode];
692 code = mode_eof[mode];
697 if( ch==
TEXT(
'|') ) code = mode_bar[mode];
698 else if( ch==
TEXT(
'\\') ) code = mode_backslash[mode];
703 if( ch==
TEXT(
'\n') ) code = mode_eol[mode];
704 else if( ch==
TEXT(
'\r') ) code = mode_eol[mode];
705 else if( ch<=
TEXT(
' ') ) code = mode_space[mode];
706 else if( ch==
TEXT(
'[') ) code = mode_open[mode];
707 else if( ch==
TEXT(
']') ) code = mode_close[mode];
708 else if( ch==
TEXT(
'|') ) code = mode_bar[mode];
709 else if( ch==
TEXT(
'\\') ) code = mode_backslash[mode];
710 else if( ch==
TEXT(
'~') ) code = mode_tilde[mode];
715 if( ch==
TEXT(
'\n') ) code = mode_eol[mode];
716 else if( ch==
TEXT(
'\r') ) code = mode_eol[mode];
717 else if( ch<=
TEXT(
' ') ) code = mode_space[mode];
718 else if( ch==
TEXT(
'[') ) code = mode_open[mode];
719 else if( ch==
TEXT(
']') ) code = mode_close[mode];
720 else if( ch==
TEXT(
'|') ) code = mode_bar[mode];
721 else if( ch==
TEXT(
'\\') ) code = mode_backslash[mode];
722 else if( ch==
TEXT(
'~') ) code = mode_tilde[mode];
723 else if( ch==
TEXT(
';') ) code = mode_semicolon[mode];
729 ch==
TEXT(
')') ) code = mode_parens[mode];
730 else if( *buffer!=
TEXT(
'"') )
732 if( (ch==
TEXT(
'+') || ch==
TEXT(
'-')) && is_number(bp) ) { }
733 else if( ch==
TEXT(
'+') ||
736 ch==
TEXT(
'/')) code = mode_parens[mode];
737 else if( ch==
TEXT(
'=') ) code = mode_equal[mode];
738 else if( ch==
TEXT(
'<') ) code = mode_less[mode];
739 else if( ch==
TEXT(
'>') ) code = mode_greater[mode];
761 printf(
"\n<TOKENS> put('%c'/%d)\n",
TEXT(
'~'),
TEXT(
'~'));
762 #endif //DEBUG_TOKENS
778 printf(
"\n<TOKENS> put('%c'/%d)\n",ch,ch);
779 #endif //DEBUG_TOKENS
799 if( *(source+1)==
'\n' )
815 if( code & PAT_GOTO )
819 stack[mode] = _stack;
831 printf(
"MUTATED TOKEN ");
dumpln(*token);
839 printf(
"NORMAL TOKEN **");
dump(*token);
840 printf(
"** (len=%d)\n\n\n",source-sp);
871 atom_t get_sublist(
int level,
int full_parse,
atom_t* pos )
875 if( pos ) *pos =
NULL;
880 int bracketlen = len;
882 int pos_from = source-
STRING(input);
883 if( pos_from ) pos_from--;
886 while( (last_token=get_token(&token,full_parse)) )
890 #ifdef DEBUG_TOKENIZATION
893 case TOKEN_END: printf(
"TOKEN_END\n");
break;
895 case TOKEN_WORD: printf(
"TOKEN_WORD @");
dump(token); printf(
"@\n");
break;
897 case TOKEN_OPEN: printf(
"TOKEN_OPEN [\n");
break;
898 case TOKEN_CLOSE: printf(
"TOKEN_CLOSE ]\n");
break;
932 if( sublist_pos )
DEUSE(sublist_pos);
959 append( new_qoken, &result, &last );
960 append( new_token, &result, &last );
969 POS( last ) = sublist_pos;
980 append( token, &result, &last );
995 errpos = origlen-bracketlen-1;
1003 errpos = origlen-len-1;
1008 int pos_to = source-
STRING(input);
1009 if( pos_to ) pos_to--;
1019 atom_t result = get_sublist( 0, method,
NULL );
1068 if( *source!=
TEXT(
'#') || *(source+1)!=
TEXT(
'!') )
return USE(word);
1071 while( len && *source!=
TEXT(
'\n') )
1114 int in_backslash = 0;
1116 for( ; len; len--,source++ )
1118 need_enbar = in_bars || in_backslash;
1123 else if( *source==
TEXT(
'\\') )
1129 else if( *source==
TEXT(
'|') )
1136 *bp++ =
ENBAR(*source);
1149 return new_word( buffer, bp-buffer );
1171 atom_t _paren(
int level,
atom_t openparen,
int* last_flags )
1173 #ifdef DEBUG_PARENTHESES
1174 printf(
"<PAREN> ENTER LEVEL %d INPUT=", level);
1176 #endif //DEBUG_PARENTHESES
1186 int flags =
FLAGS(input);
1188 #ifdef DEBUG_PARENTHESES
1189 printf(
"<PAREN> READ ELEMENT ");
1191 #endif //DEBUG_PARENTHESES
1203 elem = _paren( level+1, elem, &f );
1214 *last_flags =
FLAGS(input);
1219 #ifdef DEBUG_PARENTESES
1220 printf(
"<PAREN> APPEND ");
1222 #endif //DEBUG_PARENTHESES
1232 append( elem, &result, &last );
1233 FLAGS(last) |= flags;
1257 #ifdef DEBUG_PARENTHESES
1258 printf(
"<PAREN> EXIT LEVEL %d RESULT=", level);
1260 #endif //DEBUG_PARENTHESES
1313 printf(
"<TO-END> DEFINING=");
1326 LARGS(
function ) = 0;
1327 RARGS(
function ) = 0;
1346 LARGS(
function )++;
1348 assert(
LARGS(
function)<255 );
1387 RARGS(
function )++;
1389 assert(
RARGS(
function)<255 );
1415 offset +=
sizeof(
atom_t );
1469 printf(
"<TO-END> DEFINED FUNCTION ");
dumpln(
NAME(
function));
1471 printf(
"<TO-END> BODY ");
dumpln(
BODY(
function));
1472 printf(
"<TO-END> TREE ");
dumpln(
TREE(
function));
1502 printf(
"<TO-END> ENTER1=");
1510 int to_end_depth = 0;
1518 if( to_end_depth==0 )
1520 before_to = before_a;
1530 if( to_end_depth==0 )
1538 if( to_end_depth==0 )
1542 if( first_to==before_a )
1551 first_to =
behead(first_to);
1554 before_a = before_to;
1562 printf(
"<TO-END> EXTRACT:");
1564 printf(
"<TO-END> CURRENT INPUT:");
1566 printf(
"<TO-END> DEFINE IN PARENT:");
1607 printf(
"<TO-END> LEFTOVERS=");
1631 #define MAX_ELEMS 128
1632 atom_t parse( atom_t input, atom_t parent, int top_level )
1653 printf(
"<PARSE> %2d.[used by %2d; free=%d:%d] v%c0 pr=%d =",
1654 i, usedby[i], largs[i], rargs[i], vars[i]?
'#':
'=', pris[i]);
1673 int has_no_infinite = 1;
1701 printf(
"found variable as function: ");
1721 if( !top_level &&
VAR && has_no_infinite )
1726 has_no_infinite = 0;
1758 printf(
"<PARSE> ENTER=");
1766 if(
IS_EMPTY(input) )
return input;
1767 if(
IS_ERROR(input) )
return input;
1769 if(
IS_ERROR(input) )
return input;
1772 printf(
"<PARSE> PARENTHESISEZ=");
1777 if( !parent ) parent =
root;
1800 if( j<usedby[j] ) { largs[usedby[j]]++; finished=0; } \
1801 if( j>usedby[j] ) { rargs[usedby[j]]++; finished=0; } \
1810 printf(
"<PARSE>------------------\n");
1811 printf(
"<PARSE> START A NEW LINE \n");
1812 printf(
"<PARSE>------------------\n");
1818 input = get_line( input );
1825 printf(
"<PARSE> ORIGINAL PARSE_LIST:\n");
1839 for( i=0; i<
count; i++ )
1844 for( j=i+1; args[i] && j<
count; j++ )
1851 if( (usedby[j]>j || usedby[j]<i) &&
1852 (pris[usedby[j]]<=pris[i]) )
1858 for( j=i-1; args[i] && j>=0; j-- )
1867 if( usedby[i]==j )
break;
1873 if( (usedby[j]<j || usedby[j]>i) &&
1874 (pris[usedby[j]]<pris[i]) )
1883 printf(
"<PARSE> FINAL PARSE_LIST:\n");
1892 printf(
"<PARSE> START STEP 4:\n");
1897 int top_level_pos = -1;
1898 for( j=0; j<
count; j++ )
1904 if( !top_level && top_level_pos>=0 )
1910 if( rargs[top_level_pos]==0 &&
1911 vars[top_level_pos] &&
1926 if( top_level_pos<0 ) top_level_pos = j;
1957 printf(
"<PARSE> START STEP 5:\n");
2003 printf(
"<PARSE> START STEP 6:\n");
2006 for( i=0; i<
count; i++ )
2030 POS( data[i] ) = pos;
2039 for( i=0; i<
count; i++ )
2043 atom_t a = data[usedby[i]];
2045 atom_t function = vars[usedby[i]];
2078 goto use_numeric_name;
2090 if( !
find_var( real_name, parent ) )
2105 *
STRING(real_name) = L
'^';
2106 if( !
find_var( real_name, parent ) )
2143 if(
IS_ERROR(tokens2) )
return tokens2;
2179 printf(
"<PARSE> START STEP 7:\n");
2184 for( i=0; i<
count; i++ )
2196 append( data[i], &result, &last );
2202 POS( last ) =
USE( poses[i] );
2213 DEUSE( orig_input );
2246 printf(
"<PARSE> EXIT=");
2298 if(
IS_ERROR(tokens1) )
return tokens1;
2303 if(
IS_ERROR(tokens2) )
return tokens2;
2330 local =
CAR(locals);
2331 if( !
DESCR2(local) )
continue;
2366 if(
IS_ERROR(tokens1) )
return tokens1;
2371 if(
IS_ERROR(tokens2) )
return tokens2;