Код:
Пример использования:
UNIT TestAndDumpStack.ms.dict USES axiom_push.ms.dict DumpStack.ms.dict ; MACRO Test&DumpStack Literal IN aName axiom:PushSymbol Test aName |N Ctx:Parser:PushSymbol axiom:PushSymbol DumpStack ; // Test&DumpStack EXPORTS DumpStack.ms.dict
Пример использования:
UNIT DogAndBracket.ms.dict
USES
axiom:Tl3TokenType
axiom_push.ms.dict
core.ms.dict
io.ms.dict
macro.ms.dict
NoCapsLock.ms.dict
params.ms.dict
arrays.ms.dict
Testing.ms.dict
;
Procedure DogAndBracket
String in aBracketOpen
String in aBracketClose
INTERFACE var l_Parser
Ctx:Parser >>> l_Parser
ARRAY var l_A
l_A := []
l_Parser pop:Parser:NextToken
while true
begin
String var l_Token
l_Parser pop:Parser:TokenLongString >>> l_Token
TOKEN_TYPE var l_TokenType
l_Parser pop:Parser:TokenType >>> l_TokenType
if ( l_TokenType = Tl3TokenType::l3_ttSymbol ) then
begin
( l_Token = NameOf ( ) ?Fail 'Вложенные скобки пока не поддерживаются'
( l_Token = NameOf [ ) ?Fail 'Вложенные скобки пока не поддерживаются'
if ( l_Token = aBracketClose ) then
begin
aBracketOpen Ctx:Parser:PushSymbol
l_A .slice> 2 .for>
begin
TOKEN in aSymbol
TOKEN_TYPE in aTokenType
axiom:PushSymbol @
aSymbol aTokenType axiom:Push
end
l_Token Ctx:Parser:PushSymbol
break
end //l_Token = aBracketClose
end // l_TokenType = Tl3TokenType::l3_ttSymbol
if ( l_TokenType = Tl3TokenType::l3_ttInteger ) then
begin
l_Parser pop:Parser:TokenInt >>>[] l_A
end // l_TokenType = Tl3TokenType::l3_ttInteger
else
begin
l_Token >>>[] l_A
end // l_TokenType = Tl3TokenType::l3_ttInteger
l_TokenType >>>[] l_A
l_Parser pop:Parser:NextToken
end // while true
; // DogAndBracket
USES
TestAndDumpStack.ms.dict
;
MACRO @(
%SUMMARY '
Компилирует СПИСОК адресов слов.
Аналог ( @ X1 @ X2 .. @ XN )
'
;
NameOf (
NameOf )
DogAndBracket
; // @(
TestsFor @(
Test&DumpStack T1 @( 1 2 3 4 5 6 1 2 + '123' ) ;
; // TestsFor @(
MACRO @[
%SUMMARY '
Компилирует МАССИВ адресов слов.
Аналог [ @ X1 @ X2 .. @ XN ]
'
;
NameOf [
NameOf ]
DogAndBracket
; // @[
TestsFor @[
Test&DumpStack T1 @[ 1 2 3 4 5 6 1 2 + '123' ] ;
; // TestsFor @[
Комментариев нет:
Отправить комментарий