JdtBasic 1.0.3

dotnet add package JdtBasic --version 1.0.3                
NuGet\Install-Package JdtBasic -Version 1.0.3                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="JdtBasic" Version="1.0.3" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add JdtBasic --version 1.0.3                
#r "nuget: JdtBasic, 1.0.3"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install JdtBasic as a Cake Addin
#addin nuget:?package=JdtBasic&version=1.0.3

// Install JdtBasic as a Cake Tool
#tool nuget:?package=JdtBasic&version=1.0.3                

JdtBasic

  • <b>JdtBasic은 자동화 설비 시퀀스를 쉽게 제어하기 위해 설계된 BASIC 변형 문법의 인터프리터 입니다.</b>
  • C#과 손쉬운 연동으로 유지보수가 용이하게 함을 목표로 설계 됩니다.

목차

이 가이드는 JdtBasic 언어의 주요 기능을 설명합니다. 실제 사용 시 더 자세한 내용이나 추가적인 기능이 있을 수 있으므로, 필요에 따라 추가 문서를 참조하시기 바랍니다.

  1. 주석
  2. 함수
  3. 문자열
  4. 변수 선언
  5. 데이터 타입
  6. 연산자
  7. 제어 구조
  8. 내장 함수
  9. C# 연동

주석

  • 단일 주석은 //로 사용합니다.
  • 블록 주석은 /* */로 감싸서 사용합니다.
// 안녕하세요. (단일 주석)
/* 반갑습니다.
   이것은 블록 주석입니다. */

함수

  • 함수는 [[<함수이름>]]으로 시작하여 [[END]]로 함수의 끝을 명확히 구분해야 합니다.
  • 함수는 파라미터를 받을 수 있으며, 괄호 안에 정의합니다.
  • 다른 함수를 호출할 때는 CALL <함수이름>을 사용하거나 또는, <함수이름>(<파라메터>)를 사용합니다.
  • 함수의 이름은 언더바 2개(__)를 앞 뒤로 감싸는 걸 권장 합니다.
[[__main__]]
    print("Hello World")
    __test__()
[[end]]

[[__test__]]
    print("이것은 TEST 함수입니다.")
[[end]]

[[GREET(name)]]
    print("안녕하세요, {name}님!")
[[END]]

함수 호출 규칙

  • 함수 호출은 C 스타일로 사용 가능합니다.
// C Style
print("Hello World")


// 반환값을 받지 않는 함수 호출 방법 (두가지 case 전부 지원)
call __greet__ // BASIC style
__greet__() // C Style

// 반환값을 받는 함수 호출 방법 (한가지만 지원)
Dim result = functionName(arg1, arg2)

문자열

  • 문자열은 ""'로 둘러싸서 사용 가능합니다.
  • 문자열 내에서 변수를 출력하려면 {<변수 이름>}으로 중괄호를 감싸서 사용합니다.
[[__main__]]
    Dim name = "홍길동"
    print('Hello World') // 또는 "Hello World"
    print("안녕하세요, {name}님!")
[[end]]

변수 선언

  • 변수 선언은 DIM 혹은 VAR 키워드를 사용합니다.

[[__main__]]
    Dim localVar = "지역 변수"
    
    Dim A = "Hello World" // 문자열
    var B = 123 // 정수형
    var C = 0.23 // 실수형
    
    var D = "A 변수 값은 = {A}, B 변수 값은 = {B}, C 변수 값은 = {C}"
    
    print(D)
[[end]]

데이터 타입

숫자

  • 정수와 실수를 지원합니다.
  • 16진수는 0x 접두사를 사용합니다.
Dim intNum = 42
Dim floatNum = 3.14
Dim hexNum = 0xFF

불리언

  • TRUE(또는 ON)와 FALSE(또는 OFF)를 사용합니다.
Dim isTrue = TRUE // 혹은 ON
Dim isFalse = FALSE // 혹은 OFF

배열

  • 대괄호([])를 사용하여 배열을 정의합니다.
Dim myArray = [1, 2, 3, 4, 5]

딕셔너리

  • 중괄호({})를 사용하여 딕셔너리를 정의합니다.
Dim myDict = {"key1": "value1", "key2": 42}

연산자

  • 산술 연산자: +, -, *, /
  • 비교 연산자: <, >, <=, >=, == (같음), != (같지 않음)
  • 논리 연산자: &&, ||
  • 대입 연산자: =

제어 구조

조건문 (IF)

Dim A = 10
if A == 10 Then
    print("A는 10입니다.")
ElseIf A == 20 Then
    print("A는 20입니다.")
Else
    print("A는 10도 20도 아닙니다.")
end if

반복문 (FOR)

// 일반적인 FOR문 사용
for N = 0 TO 10
    print("N의 값 = {N}")
next

// STEP을 이용한 증감(가감) 처리
for N = 0 to 10 step 2
    print("N의 값 = {N}") // N은 2씩 증가
next

// 암시적 변수를 사용한 FOR문 (변수를 사용하지 않고 반복이 필요할 때)
for 0 to 10
    print('Hellow World')
next

// 무한 루프
for
    print("infinity loop")
next

// FOR EACH 문 (배열이나 딕셔너리 순회)
var arr = [1, 2, 3, 4, 5]
for each item In arr
    print("항목: {item}")
next

// 딕셔너리 순회
var dict = {"a": 1, "b": 2, "c": 3}
for each key, value In dict
    print("키: {key}, 값: {value}")
next

EXIT 문

FOR 루프를 조기에 종료할 때 사용합니다.

for i = 1 To 10
    if i == 5 then
        Exit for
    end if
next

내장 함수

JdtBasic은 다양한 내장 함수를 제공하여 문자열 처리, 수학 연산, 타입 변환 등의 작업을 수행할 수 있습니다. 주요 내장 함수들은 다음과 같습니다:

출력 및 시간 지연

  • PRINT: 콘솔에 출력합니다.
  • SLEEP(millisecond): 프로그램 실행을 millisecond 만큼 일시 중지합니다.
print("Hello, World!")
Sleep(1000)  // 1초 대기

배열 및 리스트 조작

  • RANGE(start, end, <step>): start부터 end까지의 배열 원소를 생성합니다.
  • LEN(collection): 문자열, 리스트, 또는 딕셔너리의 길이를 반환합니다.
Dim rangeArr = range(0, 10)
print(rangeArr) // 출력: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(len(rangeArr)) // 출력: 10

문자열 처리

  • TRIM(string): 문자열의 앞뒤 공백을 제거합니다.
  • SPLIT(string, delimiter): 문자열을 구분자를 기준으로 나누어 리스트로 반환합니다.
  • REPLACE(string, oldValue, newValue): 문자열에서 특정 부분을 다른 문자열로 대체합니다.
Dim str = "  Hello, World!  "
print(Trim(str)) // 출력: "Hello, World!"

Dim parts = Split("apple,banana,cherry", ",")
print(parts) // 출력: ["apple", "banana", "cherry"]

print(Replace("Hello, World!", "World", "Universe")) // 출력: "Hello, Universe!"

수학 함수

  • ABS(number): 숫자의 절대값을 반환합니다.
  • ROUND(number, decimals): 숫자를 지정된 소수점 자리수로 반올림합니다.
  • POW(base, exponent): 거듭제곱을 계산합니다.
print(abs(-5)) // 출력: 5
print(round(3.14159, 2)) // 출력: 3.14
print(pow(2, 3)) // 출력: 8

타입 변환 및 검사

  • STR(value): 값을 문자열로 변환합니다.
  • INT(value): 값을 정수로 변환합니다.
  • FLOAT(value): 값을 실수로 변환합니다.
  • TYPE(value): 값의 타입을 문자열로 반환합니다.
print(str(123)) // 출력: "123"
print(int("456")) // 출력: 456
print(float("3.14")) // 출력: 3.14
print(type(42)) // 출력: "int"

리스트 및 논리 연산

  • SUM(list): 리스트의 모든 요소의 합을 계산합니다.
  • MAX(list): 리스트에서 최댓값을 찾습니다.
  • MIN(list): 리스트에서 최솟값을 찾습니다.
  • SORT(list): 리스트를 정렬합니다.
  • REVERSE(list or string): 리스트나 문자열을 뒤집습니다.
  • INDEXOF(list or string, element): 리스트나 문자열에서 요소의 인덱스를 찾습니다.
  • ALL(list): 리스트의 모든 요소가 참인지 확인합니다.
  • ANY(list): 리스트의 요소 중 하나라도 참인지 확인합니다.
Dim numbers = [1, 2, 3, 4, 5]
print(sum(numbers)) // 출력: 15
print(max(numbers)) // 출력: 5
print(min(numbers)) // 출력: 1
print(sort([3, 1, 4, 1, 5, 9, 2])) // 출력: [1, 1, 2, 3, 4, 5, 9]
print(reverse("Hello")) // 출력: "olleH"
print(indexOf(numbers, 3)) // 출력: 2
print(all([TRUE, TRUE, FALSE])) // 출력: FALSE
print(any([FALSE, TRUE, FALSE])) // 출력: TRUE

기타

  • HEX(number): 숫자를 16진수 문자열로 변환합니다.
  • ASCII(character): 문자의 ASCII 코드를 반환합니다.
  • CHR(asciiCode): ASCII 코드에 해당하는 문자를 반환합니다.
print(hex(255)) // 출력: "0xff"
print(ascii("A")) // 출력: 65
print(chr(65)) // 출력: "A"

C# 연동

JdtBasic은 C#과 쉽게 연동할 수 있도록 설계되었습니다. 이를 통해 C#의 강력한 기능을 JdtBasic 스크립트 내에서 활용할 수 있으며, 반대로 C#에서 JdtBasic 스크립트의 함수를 호출할 수도 있습니다.

이러한 C# 연동 기능을 통해 JdtBasic은 기존 C# 프로젝트에 쉽게 통합될 수 있으며, 동적인 스크립팅 기능을 제공할 수 있습니다.

외부 함수 정의 및 등록

C#에서 JdtBasic 스크립트에서 사용할 수 있는 외부 함수를 정의할 수 있습니다. 이를 위해 IExternalFunction 인터페이스를 구현합니다.

public class ExternalFunctionTest : IFunction
{
    public string Name => "ExternalTest";

    public IVariable? Execute(IScriptThread thread, params object[] args)
    {
        Console.WriteLine("Test external function~~!!");
        
        var x = (int)args[0];
        var y = (int)args[1];

        return new Variable(x * y);
    }
}

이렇게 정의한 외부 함수는 Interpreter 클래스의 Import 메서드를 통해 등록할 수 있습니다:

interpreter.Import(new ExternalFunctionTest());

또한 이렇게 정의한 C#의 클래스는 JdtBasic의 함수 내부에서 실행이 가능합니다.

[[__main__]]
    Dim a = ExternalTest(2, 2) // 위에서 함수 이름을 ExternalTest로 지정했음
    print('{a}') // 출력은 2 * 2가 계산된 4가 출력됩니다.
[[end]]

스크립트 컴파일 및 실행

C#에서 JdtBasic 스크립트를 컴파일하고 실행하는 과정은 다음과 같습니다:

string script = @"
[[__main__]]
    Dim a = __add__(10, 20)
    print('{a}')
[[end]]

[[__add__(x, y)]]
    return x + y
[[end]]
";

interpreter.Compile(script);
interpreter.Call("MAIN");
  1. Compile 메서드를 사용하여 스크립트를 파싱하고 AST(Abstract Syntax Tree)를 생성합니다.
  2. Call 메서드를 사용하여 스크립트 내의 특정 함수(여기서는 "MAIN")를 실행합니다.

C#에서 JdtBasic 함수 호출

C#에서 JdtBasic 스크립트에 정의된 함수를 직접 호출할 수 있습니다:

object result = interpreter.Call("ADD", 10, 20);
Console.WriteLine(result); // 출력: 30

Call 메서드는 함수 이름과 파라미터를 받아 해당 함수를 실행하고 결과를 반환합니다.

주의사항

  1. 파라미터 개수: C#에서 JdtBasic 함수를 호출할 때, 파라미터 개수가 일치해야 합니다. 그렇지 않으면 오류가 발생합니다.

  2. 변수 스코프: JdtBasic 함수 실행 시 로컬 변수 스코프가 생성되고, 함수 종료 시 해제됩니다.

  3. 반환 값 처리: JdtBasic 함수에서 RETURN 문을 사용하면, 그 값이 C#으로 반환됩니다.

  4. 오류 처리: 스크립트 파싱 중 오류가 발생하면 콘솔에 오류 메시지가 출력됩니다.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.3 103 10/14/2024
1.0.2 94 10/8/2024
1.0.1 93 10/8/2024
1.0.0 97 10/8/2024