12

🧩 Syntax:
using System.Collections;
using System.Collections.Generic;
using System.IO;

using UnityEngine;

// TODO:
// how do you specify output gates?
// comments

enum TokenType
{
    // default gates
    AND, // &
    OR, // |
    NOT, // !
    // special characters
    COLON, // :

    PORT,
}

struct Token
{
    public TokenType type;
    public string lexeme;
}

// example definition
/*
 * XOR a b:
 *      OR AND NOT a b AND a NOT b
 */

class Scanner
{
    private Dictionary<string, TokenType> keywords = new Dictionary<>
    {
        [ "AND" ] = { TokenType.AND },
        [ "NOT" ] = { TokenType.NOT },
        [ "OR" ] = { TokenType.OR },
    };

    List<Token> scanFile(string file)
    {
        return scanTokens(File.ReadAllText(file));
    }

    List<Token> scanTokens(string text)
    {
        int start = 0;
        int current = 0;
        int line = 1;

        List<Token> tokens = new List<Token>();

        while (current < text.Length)
        {
            text[current++] switch
            {
            ':' => tokens.Add(new Token { type = TokenType.COLON, lexeme = ":" }),
            (>= 'A' and <= 'Z') or (>= 'a' and <= 'z') => {
                while (current < text.Length && isAlphaNum(text[current]))
                    ++current;
                var sub = text.Substring(start, current);
                if (keywords.ContainsKey(sub))
                    tokens.Add(new Token { type = keywords[sub], lexeme = sub });
                else
                    tokens.Add(new Token { type = TokenType.PORT, lexeme = sub });
            },
            ' ' or '\r' or '\t' => { },
            '\n' => ++line,
            };
        }
    }

    private static bool isAlphaNum(char c)
    {
        return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
    }
}

public class CircuitScanner : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}