Add an empty cstdlib.elna source file
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
obtain one at https://mozilla.org/MPL/2.0/. *)
|
||||
module;
|
||||
|
||||
import Common, cstdlib;
|
||||
import cstdio, cstring, common;
|
||||
|
||||
const
|
||||
CHUNK_SIZE := 85536;
|
||||
@@ -11,10 +11,10 @@ const
|
||||
type
|
||||
(*
|
||||
* Classification table assigns each possible character to a group (class). All
|
||||
* characters of the same group a handled equivalently.
|
||||
*
|
||||
* Classification:
|
||||
*)
|
||||
* characters of the same group a handled equivalently.
|
||||
*
|
||||
* Classification:
|
||||
*)
|
||||
TransitionClass = (
|
||||
invalid,
|
||||
digit,
|
||||
@@ -63,7 +63,7 @@ type
|
||||
booleanKind: Bool;
|
||||
identifierKind: Identifier;
|
||||
integerKind: Int;
|
||||
stringKind: ShortString
|
||||
stringKind: String
|
||||
end;
|
||||
start_location: TextLocation;
|
||||
end_location: TextLocation
|
||||
@@ -293,7 +293,7 @@ begin
|
||||
i := 129u;
|
||||
while i <= 256u do
|
||||
classification[i] := TransitionClass.other;
|
||||
i := i + 1
|
||||
i := i + 1u
|
||||
end
|
||||
end;
|
||||
|
||||
@@ -392,7 +392,7 @@ proc transition_action_skip(lexer: ^Lexer, token: ^LexerToken);
|
||||
begin
|
||||
increment(@lexer^.start);
|
||||
|
||||
if ORD(lexer^.start.iterator^) = 10 then
|
||||
if lexer^.start.iterator^ = '\n' then
|
||||
lexer^.start.location.line := lexer^.start.location.line + 1u;
|
||||
lexer^.start.location.column := 1u
|
||||
end;
|
||||
@@ -402,24 +402,24 @@ end;
|
||||
(* Delimited string action. *)
|
||||
proc transition_action_delimited(lexer: ^Lexer, token: ^LexerToken);
|
||||
var
|
||||
text_length: Int;
|
||||
text_length: Word;
|
||||
begin
|
||||
if lexer^.start.iterator^ = '(' then
|
||||
token^.kind := LexerKind.comment
|
||||
end;
|
||||
if lexer^.start.iterator^ = '"' then
|
||||
text_length := lexer^.current.iterator - lexer^.start.iterator + 1;
|
||||
text_length := cast(lexer^.current.iterator - lexer^.start.iterator + 1: Word);
|
||||
|
||||
MemZero(@token^.stringKind, #size(ShortString));
|
||||
MemCopy(lexer^.start.iterator, text_length, @token^.stringKind);
|
||||
token^.stringKind := String(malloc(text_length), text_length);
|
||||
memcpy(@token^.stringKind.ptr, lexer^.start.iterator, text_length);
|
||||
|
||||
token^.kind := LexerKind.character
|
||||
end;
|
||||
if lexer^.start.iterator^ = "'" then
|
||||
text_length := lexer^.current.iterator - lexer^.start.iterator + 1;
|
||||
text_length := cast(lexer^.current.iterator - lexer^.start.iterator + 1: Word);
|
||||
|
||||
MemZero(@token^.stringKind, #size(ShortString));
|
||||
MemCopy(lexer^.start.iterator, text_length, @token^.stringKind);
|
||||
token^.stringKind := String(malloc(text_length), text_length);
|
||||
memcpy(@token^.stringKind.ptr, lexer^.start.iterator, text_length);
|
||||
|
||||
token^.kind := LexerKind.string
|
||||
end;
|
||||
@@ -432,7 +432,7 @@ begin
|
||||
token^.kind := LexerKind.identifier;
|
||||
|
||||
token^.identifierKind[1] := cast(lexer^.current.iterator - lexer^.start.iterator: Char);
|
||||
MemCopy(lexer^.start.iterator, ORD(token^.identifierKind[1]), @token^.identifierKind[2]);
|
||||
memcpy(@token^.identifierKind[2], lexer^.start.iterator, ORD(token^.identifierKind[1]));
|
||||
|
||||
if compare_keyword("program", lexer^.start, lexer^.current.iterator) then
|
||||
token^.kind := LexerKind._program
|
||||
@@ -590,43 +590,47 @@ begin
|
||||
token^.kind := LexerKind.integer;
|
||||
|
||||
integer_length := lexer^.current.iterator - lexer^.start.iterator;
|
||||
MemZero(@token^.identifierKind, #size(Identifier));
|
||||
MemCopy(lexer^.start.iterator, integer_length, @token^.identifierKind[1]);
|
||||
memset(@token^.identifierKind, 0, #size(Identifier));
|
||||
memcpy(@token^.identifierKind[1], lexer^.start.iterator, integer_length);
|
||||
|
||||
buffer := InitStringCharStar(@token^.identifierKind[1]);
|
||||
token^.integerKind := StringToInteger(buffer, 10, found);
|
||||
buffer := KillString(buffer)
|
||||
end;
|
||||
|
||||
proc set_default_transition(current_state: TransitionState, default_action: TransitionAction, next_state: TransitionState);
|
||||
proc set_default_transition(current_state: TransitionState, default_action: TransitionAction, next_state: TransitionState) -> Int;
|
||||
var
|
||||
default_transition: Transition;
|
||||
state_index: Int;
|
||||
begin
|
||||
default_transition.action := default_action;
|
||||
default_transition.next_state := next_state;
|
||||
state_index := cast(current_state: Int) + 1;
|
||||
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.invalid) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.digit) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.alpha) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.space) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.colon) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.equals) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.left_paren) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.right_paren) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.asterisk) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.underscore) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.single) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.hex) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.zero) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.x) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.eof) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.dot) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.minus) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.single_quote) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.double_quote) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.greater) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.less) + 1] := default_transition;
|
||||
transitions[ORD(current_state) + 1][ORD(TransitionClass.other) + 1] := default_transition
|
||||
transitions[state_index][cast(TransitionClass.invalid: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.space: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.colon: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.equals: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.left_paren: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.right_paren: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.asterisk: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.underscore: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.single: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.dot: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.minus: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.single_quote: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.double_quote: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.greater: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.less: Int) + 1] := default_transition;
|
||||
transitions[state_index][cast(TransitionClass.other: Int) + 1] := default_transition;
|
||||
|
||||
return state_index
|
||||
end;
|
||||
|
||||
(*
|
||||
@@ -646,241 +650,245 @@ end;
|
||||
* handles each action.
|
||||
*)
|
||||
proc initialize_transitions();
|
||||
var
|
||||
state_index: Int;
|
||||
begin
|
||||
(* Start state. *)
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.invalid) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.invalid) + 1].next_state := TransitionState.finish;
|
||||
state_index := cast(TransitionState.start: Int) + 1;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.digit) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.digit) + 1].next_state := TransitionState.decimal;
|
||||
transitions[state_index][cast(TransitionClass.invalid: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.invalid: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.alpha) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.alpha) + 1].next_state := TransitionState.identifier;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1].next_state := TransitionState.decimal;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.space) + 1].action := transition_action_skip;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.space) + 1].next_state := TransitionState.start;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1].next_state := TransitionState.identifier;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.colon) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.colon) + 1].next_state := TransitionState.colon;
|
||||
transitions[state_index][cast(TransitionClass.space: Int) + 1].action := transition_action_skip;
|
||||
transitions[state_index][cast(TransitionClass.space: Int) + 1].next_state := TransitionState.start;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.equals) + 1].action := transition_action_single;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.equals) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.colon: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.colon: Int) + 1].next_state := TransitionState.colon;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.left_paren) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.left_paren) + 1].next_state := TransitionState.left_paren;
|
||||
transitions[state_index][cast(TransitionClass.equals: Int) + 1].action := transition_action_single;
|
||||
transitions[state_index][cast(TransitionClass.equals: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.right_paren) + 1].action := transition_action_single;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.right_paren) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.left_paren: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.left_paren: Int) + 1].next_state := TransitionState.left_paren;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.asterisk) + 1].action := transition_action_single;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.asterisk) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.right_paren: Int) + 1].action := transition_action_single;
|
||||
transitions[state_index][cast(TransitionClass.right_paren: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.underscore) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.underscore) + 1].next_state := TransitionState.identifier;
|
||||
transitions[state_index][cast(TransitionClass.asterisk: Int) + 1].action := transition_action_single;
|
||||
transitions[state_index][cast(TransitionClass.asterisk: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.single) + 1].action := transition_action_single;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.single) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.underscore: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.underscore: Int) + 1].next_state := TransitionState.identifier;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.hex) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.hex) + 1].next_state := TransitionState.identifier;
|
||||
transitions[state_index][cast(TransitionClass.single: Int) + 1].action := transition_action_single;
|
||||
transitions[state_index][cast(TransitionClass.single: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.zero) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.zero) + 1].next_state := TransitionState.leading_zero;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1].next_state := TransitionState.identifier;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.x) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.x) + 1].next_state := TransitionState.identifier;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1].next_state := TransitionState.leading_zero;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.eof) + 1].action := transition_action_eof;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.eof) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1].next_state := TransitionState.identifier;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.dot) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.dot) + 1].next_state := TransitionState.dot;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1].action := transition_action_eof;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.minus) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.minus) + 1].next_state := TransitionState.minus;
|
||||
transitions[state_index][cast(TransitionClass.dot: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.dot: Int) + 1].next_state := TransitionState.dot;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.single_quote) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.single_quote) + 1].next_state := TransitionState.character;
|
||||
transitions[state_index][cast(TransitionClass.minus: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.minus: Int) + 1].next_state := TransitionState.minus;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.double_quote) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.double_quote) + 1].next_state := TransitionState.string;
|
||||
transitions[state_index][cast(TransitionClass.single_quote: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.single_quote: Int) + 1].next_state := TransitionState.character;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.greater) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.greater) + 1].next_state := TransitionState.greater;
|
||||
transitions[state_index][cast(TransitionClass.double_quote: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.double_quote: Int) + 1].next_state := TransitionState.string;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.less) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.less) + 1].next_state := TransitionState.less;
|
||||
transitions[state_index][cast(TransitionClass.greater: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.greater: Int) + 1].next_state := TransitionState.greater;
|
||||
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.other) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.start) + 1][ORD(TransitionClass.other) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.less: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.less: Int) + 1].next_state := TransitionState.less;
|
||||
|
||||
transitions[state_index][cast(TransitionClass.other: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.other: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* Colon state. *)
|
||||
set_default_transition(TransitionState.colon, transition_action_finalize, TransitionState.finish);
|
||||
state_index := set_default_transition(TransitionState.colon, transition_action_finalize, TransitionState.finish);
|
||||
|
||||
transitions[ORD(TransitionState.colon) + 1][ORD(TransitionClass.equals) + 1].action := transition_action_composite;
|
||||
transitions[ORD(TransitionState.colon) + 1][ORD(TransitionClass.equals) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.equals: Int) + 1].action := transition_action_composite;
|
||||
transitions[state_index][cast(TransitionClass.equals: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* Identifier state. *)
|
||||
set_default_transition(TransitionState.identifier, transition_action_key_id, TransitionState.finish);
|
||||
state_index := set_default_transition(TransitionState.identifier, transition_action_key_id, TransitionState.finish);
|
||||
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.digit) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.digit) + 1].next_state := TransitionState.identifier;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1].next_state := TransitionState.identifier;
|
||||
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.alpha) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.alpha) + 1].next_state := TransitionState.identifier;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1].next_state := TransitionState.identifier;
|
||||
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.underscore) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.underscore) + 1].next_state := TransitionState.identifier;
|
||||
transitions[state_index][cast(TransitionClass.underscore: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.underscore: Int) + 1].next_state := TransitionState.identifier;
|
||||
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.hex) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.hex) + 1].next_state := TransitionState.identifier;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1].next_state := TransitionState.identifier;
|
||||
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.zero) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.zero) + 1].next_state := TransitionState.identifier;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1].next_state := TransitionState.identifier;
|
||||
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.x) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.identifier) + 1][ORD(TransitionClass.x) + 1].next_state := TransitionState.identifier;
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1].next_state := TransitionState.identifier;
|
||||
|
||||
(* Decimal state. *)
|
||||
set_default_transition(TransitionState.decimal, transition_action_integer, TransitionState.finish);
|
||||
state_index := set_default_transition(TransitionState.decimal, transition_action_integer, TransitionState.finish);
|
||||
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.digit) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.digit) + 1].next_state := TransitionState.decimal;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1].next_state := TransitionState.decimal;
|
||||
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.alpha) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.alpha) + 1].next_state := TransitionState.decimal_suffix;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1].next_state := TransitionState.decimal_suffix;
|
||||
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.underscore) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.underscore) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.underscore: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.underscore: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.hex) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.hex) + 1].next_state := TransitionState.decimal_suffix;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1].next_state := TransitionState.decimal_suffix;
|
||||
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.zero) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.zero) + 1].next_state := TransitionState.decimal;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1].next_state := TransitionState.decimal;
|
||||
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.x) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.decimal) + 1][ORD(TransitionClass.x) + 1].next_state := TransitionState.decimal_suffix;
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1].next_state := TransitionState.decimal_suffix;
|
||||
|
||||
(* Greater state. *)
|
||||
set_default_transition(TransitionState.greater, transition_action_finalize, TransitionState.finish);
|
||||
state_index := set_default_transition(TransitionState.greater, transition_action_finalize, TransitionState.finish);
|
||||
|
||||
transitions[ORD(TransitionState.greater) + 1][ORD(TransitionClass.equals) + 1].action := transition_action_composite;
|
||||
transitions[ORD(TransitionState.greater) + 1][ORD(TransitionClass.equals) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.equals: Int) + 1].action := transition_action_composite;
|
||||
transitions[state_index][cast(TransitionClass.equals: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* Minus state. *)
|
||||
set_default_transition(TransitionState.minus, transition_action_finalize, TransitionState.finish);
|
||||
state_index := set_default_transition(TransitionState.minus, transition_action_finalize, TransitionState.finish);
|
||||
|
||||
transitions[ORD(TransitionState.minus) + 1][ORD(TransitionClass.greater) + 1].action := transition_action_composite;
|
||||
transitions[ORD(TransitionState.minus) + 1][ORD(TransitionClass.greater) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.greater: Int) + 1].action := transition_action_composite;
|
||||
transitions[state_index][cast(TransitionClass.greater: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* Left paren state. *)
|
||||
set_default_transition(TransitionState.left_paren, transition_action_finalize, TransitionState.finish);
|
||||
state_index := set_default_transition(TransitionState.left_paren, transition_action_finalize, TransitionState.finish);
|
||||
|
||||
transitions[ORD(TransitionState.left_paren) + 1][ORD(TransitionClass.asterisk) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.left_paren) + 1][ORD(TransitionClass.asterisk) + 1].next_state := TransitionState.comment;
|
||||
transitions[state_index][cast(TransitionClass.asterisk: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.asterisk: Int) + 1].next_state := TransitionState.comment;
|
||||
|
||||
(* Less state. *)
|
||||
set_default_transition(TransitionState.less, transition_action_finalize, TransitionState.finish);
|
||||
state_index := set_default_transition(TransitionState.less, transition_action_finalize, TransitionState.finish);
|
||||
|
||||
transitions[ORD(TransitionState.less) + 1][ORD(TransitionClass.equals) + 1].action := transition_action_composite;
|
||||
transitions[ORD(TransitionState.less) + 1][ORD(TransitionClass.equals) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.equals: Int) + 1].action := transition_action_composite;
|
||||
transitions[state_index][cast(TransitionClass.equals: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.less) + 1][ORD(TransitionClass.greater) + 1].action := transition_action_composite;
|
||||
transitions[ORD(TransitionState.less) + 1][ORD(TransitionClass.greater) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.greater: Int) + 1].action := transition_action_composite;
|
||||
transitions[state_index][cast(TransitionClass.greater: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* Hexadecimal after 0x. *)
|
||||
set_default_transition(TransitionState.dot, transition_action_finalize, TransitionState.finish);
|
||||
state_index := set_default_transition(TransitionState.dot, transition_action_finalize, TransitionState.finish);
|
||||
|
||||
transitions[ORD(TransitionState.dot) + 1][ORD(TransitionClass.dot) + 1].action := transition_action_composite;
|
||||
transitions[ORD(TransitionState.dot) + 1][ORD(TransitionClass.dot) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.dot: Int) + 1].action := transition_action_composite;
|
||||
transitions[state_index][cast(TransitionClass.dot: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* Comment. *)
|
||||
set_default_transition(TransitionState.comment, transition_action_accumulate, TransitionState.comment);
|
||||
state_index := set_default_transition(TransitionState.comment, transition_action_accumulate, TransitionState.comment);
|
||||
|
||||
transitions[ORD(TransitionState.comment) + 1][ORD(TransitionClass.asterisk) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.comment) + 1][ORD(TransitionClass.asterisk) + 1].next_state := TransitionState.closing_comment;
|
||||
transitions[state_index][cast(TransitionClass.asterisk: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.asterisk: Int) + 1].next_state := TransitionState.closing_comment;
|
||||
|
||||
transitions[ORD(TransitionState.comment) + 1][ORD(TransitionClass.eof) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.comment) + 1][ORD(TransitionClass.eof) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* Closing comment. *)
|
||||
set_default_transition(TransitionState.closing_comment, transition_action_accumulate, TransitionState.comment);
|
||||
state_index := set_default_transition(TransitionState.closing_comment, transition_action_accumulate, TransitionState.comment);
|
||||
|
||||
transitions[ORD(TransitionState.closing_comment) + 1][ORD(TransitionClass.invalid) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.closing_comment) + 1][ORD(TransitionClass.invalid) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.invalid: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.invalid: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.closing_comment) + 1][ORD(TransitionClass.right_paren) + 1].action := transition_action_delimited;
|
||||
transitions[ORD(TransitionState.closing_comment) + 1][ORD(TransitionClass.right_paren) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.right_paren: Int) + 1].action := transition_action_delimited;
|
||||
transitions[state_index][cast(TransitionClass.right_paren: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.closing_comment) + 1][ORD(TransitionClass.asterisk) + 1].action := transition_action_accumulate;
|
||||
transitions[ORD(TransitionState.closing_comment) + 1][ORD(TransitionClass.asterisk) + 1].next_state := TransitionState.closing_comment;
|
||||
transitions[state_index][cast(TransitionClass.asterisk: Int) + 1].action := transition_action_accumulate;
|
||||
transitions[state_index][cast(TransitionClass.asterisk: Int) + 1].next_state := TransitionState.closing_comment;
|
||||
|
||||
transitions[ORD(TransitionState.closing_comment) + 1][ORD(TransitionClass.eof) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.closing_comment) + 1][ORD(TransitionClass.eof) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* Character. *)
|
||||
set_default_transition(TransitionState.character, transition_action_accumulate, TransitionState.character);
|
||||
state_index := set_default_transition(TransitionState.character, transition_action_accumulate, TransitionState.character);
|
||||
|
||||
transitions[ORD(TransitionState.character) + 1][ORD(TransitionClass.invalid) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.character) + 1][ORD(TransitionClass.invalid) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.invalid: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.invalid: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.character) + 1][ORD(TransitionClass.eof) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.character) + 1][ORD(TransitionClass.eof) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.character) + 1][ORD(TransitionClass.single_quote) + 1].action := transition_action_delimited;
|
||||
transitions[ORD(TransitionState.character) + 1][ORD(TransitionClass.single_quote) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.single_quote: Int) + 1].action := transition_action_delimited;
|
||||
transitions[state_index][cast(TransitionClass.single_quote: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* String. *)
|
||||
set_default_transition(TransitionState.string, transition_action_accumulate, TransitionState.string);
|
||||
state_index := set_default_transition(TransitionState.string, transition_action_accumulate, TransitionState.string);
|
||||
|
||||
transitions[ORD(TransitionState.string) + 1][ORD(TransitionClass.invalid) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.string) + 1][ORD(TransitionClass.invalid) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.invalid: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.invalid: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.string) + 1][ORD(TransitionClass.eof) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.string) + 1][ORD(TransitionClass.eof) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.eof: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.string) + 1][ORD(TransitionClass.double_quote) + 1].action := transition_action_delimited;
|
||||
transitions[ORD(TransitionState.string) + 1][ORD(TransitionClass.double_quote) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.double_quote: Int) + 1].action := transition_action_delimited;
|
||||
transitions[state_index][cast(TransitionClass.double_quote: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* Leading zero. *)
|
||||
set_default_transition(TransitionState.leading_zero, transition_action_integer, TransitionState.finish);
|
||||
state_index := set_default_transition(TransitionState.leading_zero, transition_action_integer, TransitionState.finish);
|
||||
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.digit) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.digit) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.alpha) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.alpha) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.underscore) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.underscore) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.underscore: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.underscore: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.hex) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.hex) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.zero) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.zero) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.x) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.leading_zero) + 1][ORD(TransitionClass.x) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
(* Digit with a character suffix. *)
|
||||
set_default_transition(TransitionState.decimal_suffix, transition_action_integer, TransitionState.finish);
|
||||
state_index := set_default_transition(TransitionState.decimal_suffix, transition_action_integer, TransitionState.finish);
|
||||
|
||||
transitions[ORD(TransitionState.decimal_suffix) + 1][ORD(TransitionClass.alpha) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.decimal_suffix) + 1][ORD(TransitionClass.alpha) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.alpha: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.decimal_suffix) + 1][ORD(TransitionClass.digit) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.decimal_suffix) + 1][ORD(TransitionClass.digit) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.digit: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.decimal_suffix) + 1][ORD(TransitionClass.hex) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.decimal_suffix) + 1][ORD(TransitionClass.hex) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.hex: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.decimal_suffix) + 1][ORD(TransitionClass.zero) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.decimal_suffix) + 1][ORD(TransitionClass.zero) + 1].next_state := TransitionState.finish;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.zero: Int) + 1].next_state := TransitionState.finish;
|
||||
|
||||
transitions[ORD(TransitionState.decimal_suffix) + 1][ORD(TransitionClass.x) + 1].action := nil;
|
||||
transitions[ORD(TransitionState.decimal_suffix) + 1][ORD(TransitionClass.x) + 1].next_state := TransitionState.finish
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1].action := nil;
|
||||
transitions[state_index][cast(TransitionClass.x: Int) + 1].next_state := TransitionState.finish
|
||||
end;
|
||||
|
||||
proc lexer_make*(lexer: ^Lexer, input: ^FILE);
|
||||
@@ -889,7 +897,7 @@ begin
|
||||
lexer^.length := 0;
|
||||
|
||||
lexer^.buffer := malloc(CHUNK_SIZE);
|
||||
MemZero(lexer^.buffer, CHUNK_SIZE);
|
||||
memset(lexer^.buffer, 0, CHUNK_SIZE);
|
||||
lexer^.size := CHUNK_SIZE
|
||||
end;
|
||||
|
||||
@@ -907,14 +915,11 @@ begin
|
||||
current_state := TransitionState.start;
|
||||
|
||||
while current_state <> TransitionState.finish do
|
||||
index1 := ORD(lexer^.current.iterator^);
|
||||
index1 := index1 + 1u;
|
||||
index1 := cast(lexer^.current.iterator^: Word) + 1u;
|
||||
current_class := classification[index1];
|
||||
|
||||
index1 := ORD(current_state);
|
||||
index1 := index1 + 1u;
|
||||
index2 := ORD(current_class);
|
||||
index2 := index + 1u;
|
||||
index1 := cast(current_state: Word) + 1u;
|
||||
index2 := cast(current_class: Word) + 1u;
|
||||
|
||||
current_transition := transitions[index1][index2];
|
||||
if current_transition.action <> nil then
|
||||
|
Reference in New Issue
Block a user