Reading XML through a web service

Good morning guys, I know there are already several scattered XML reading posts. But I can not adapt the codes to the situation I need.

My goal is to read the following XML


  
    LANIFICIO SAO FRANCISCO LTDA
    61.187.845/0001-22
    490382049
    2019-08-14
    Retingimento
    78 789 797/9797-99
    Div. Nfe/Rom.
    
      7897987
      1050
      3 | LAVAR E RAMAR
      018179
      99.99
      0
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
    
    
      7897987
      1050
      3 | LAVAR E RAMAR
      018179
      99.99
      0
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
    
    
      7897987
      1050
      3 | LAVAR E RAMAR
      018179
      99.99
      0
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
    
  
  
    LANIFICIO SAO FRANCISCO LTDA
    61.187.845/0001-22
    490382049
    2019-08-14
    Retingimento
    78 789 797/9797-99
    Div. Nfe/Rom.
    
      7897987
      1050
      3 | LAVAR E RAMAR
      018179
      99.99
      0
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
    
    
      7897987
      1050
      3 | LAVAR E RAMAR
      018179
      99.99
      0
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
    
    
      7897987
      1050
      3 | LAVAR E RAMAR
      018179
      99.99
      0
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
    
  
  
    LANIFICIO SAO FRANCISCO LTDA
    61.187.845/0001-22
    490382049
    2019-08-14
    Retingimento
    78 789 797/9797-99
    Div. Nfe/Rom.
    
      7897987
      1050
      3 | LAVAR E RAMAR
      018179
      99.99
      0
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
    
    
      7897987
      1050
      3 | LAVAR E RAMAR
      018179
      99.99
      0
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
    
    
      7897987
      1050
      3 | LAVAR E RAMAR
      018179
      99.99
      0
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
      
        1231231123
        12.400
        0.000
        
      
    
  

The goal is to read and save the data in the database for validation (example: maximum weight, repeated batches, etc.).

I tried a few dozen different codes, both with XmlTextReader xmlReader = new XmlTextReader(caminhoArquivo); how much XmlDocument doc = new XmlDocument();

But I currently have the following:

(WebMethod(Description = "Lendo um Xml de Romaneio"))
    public xml_lote LerXml(/*(XmlElementAttribute(IsNullable = true)) string Xml,*/)
    {
        List lotes = new List();
        List romaneios = new List();
        List pecas = new List();
        XmlDocument oXML = new XmlDocument();
        XmlNodeList oNoLista = default(XmlNodeList);
        //monta o caminho do arquivo na raiz do projeto
        caminhoArquivo = Directory.GetParent(Directory.GetParent(caminhoArquivo).FullName).FullName;
        caminhoArquivo += @"filmes.xml";
        XmlTextReader xmlReader = new XmlTextReader(caminhoArquivo);
        oXML.Load(caminhoArquivo);
        Lote lote = new Lote();
        Romaneioo romaneio = new Romaneioo();
        Peca peca = new Peca();
        while (xmlReader.Read())
        {
            switch (xmlReader.NodeType)
            {
                case XmlNodeType.Element:
                    lote.id_lote += Convert.ToInt32(xmlReader.GetAttribute("ID"));
                    lote.nome += xmlReader.Value;
                    lote.nr_nota_fiscal += xmlReader.Value;
                    lote.dc_tipo += xmlReader.Value;
                    romaneio.id_romaneio = Convert.ToInt32(xmlReader.GetAttribute("ID"));
                    romaneio.nr_cod_produto = xmlReader.Value;
                    peca.id_peca = Convert.ToInt32(xmlReader.GetAttribute("ID"));
                    peca.nr_peca = xmlReader.Value;
                    lotes.Add(lote);
                    romaneios.Add(romaneio);
                    pecas.Add(peca);
                    break;
                case XmlNodeType.Text:
                    lote.id_lote += Convert.ToInt32(xmlReader.GetAttribute("ID"));
                    lote.nome += xmlReader.Value;
                    lote.nr_nota_fiscal += xmlReader.Value;
                    lote.dc_tipo += xmlReader.Value;
                    romaneio.id_romaneio = Convert.ToInt32(xmlReader.GetAttribute("ID"));
                    romaneio.id_romaneio = Convert.ToInt32(xmlReader.GetAttribute("ID"));
                    peca.id_peca = Convert.ToInt32(xmlReader.GetAttribute("ID"));
                    lotes.Add(lote);
                    romaneios.Add(romaneio);
                    pecas.Add(peca);
                    break;
                case XmlNodeType.EndElement:
                    lote.id_lote += Convert.ToInt32(xmlReader.GetAttribute("ID"));
                    lote.nome += xmlReader.Value;
                    lote.nr_nota_fiscal += xmlReader.Value;
                    lote.dc_tipo += xmlReader.Value;
                    romaneio.id_romaneio = Convert.ToInt32(xmlReader.GetAttribute("ID"));
                    peca.id_peca = Convert.ToInt32(xmlReader.GetAttribute("ID"));
                    lotes.Add(lote);
                    romaneios.Add(romaneio);
                    pecas.Add(peca);
                    break;
            }

        }            
        romaneio.pecas = pecas;

        xml_lote dadosXML = new xml_lote(lotes);
        return dadosXML;
    }

But I can not achieve my goal of storing what I need in lists or variables.
PS: I already have the function that sends the data to the database, the parameters come from this XML read function.
PS2: I have already created the necessary variables:

 public class Lote
    {
        (XmlAttribute("ativo"))
        public bool ativo = true;

        (XmlElement("ID_Lote"))
        public int id_lote { get; set; }

        (XmlElement("Nome"))
        public string nome { get; set; }

        (XmlElement("NR_Nota_Fiscal"))
        public string nr_nota_fiscal { get; set; }

        (XmlElement("DC_Tipo"))
        public string dc_tipo { get; set; }

        (XmlElement("Romaneios"))
        public List romaneios { get; set; }

        //(XmlElement("DT_Emissao"))  
        //public DateTime DT_Emissao { get; set; } nao aceita por ser um time date time
    }

    public class Romaneioo
    {
        (XmlAttribute("ativo"))
        public bool ativo = true;

        (XmlElement("ID_Romaneio"))
        public int id_romaneio { get; set; }

        (XmlElement("NR_Romaneio"))
        public string nr_romaneio { get; set; }

        (XmlElement("DC_Artigo"))
        public string dc_artigo { get; set; }

        (XmlElement("DC_Cor"))
        public string dc_cor { get; set; }

        (XmlElement("OP_Tipo"))
        public int op_tipo { get; set; }

        (XmlElement("NR_Cod_Produto"))
        public string nr_cod_produto { get; set; }

        (XmlElement("NR_Largura"))
        public decimal nr_largura { get; set; }

        (XmlElement("NR_Gramatura"))
        public int nr_gramatura { get; set; }

        (XmlElement("DC_Obs"))
        public string dc_obs { get; set; }

        (XmlElement("Pecas"))
        public List pecas { get; set; }
    }

    public class Peca
    {
        (XmlAttribute("ativo"))
        public bool ativo = true;

        (XmlElement("ID_Peca"))
        public int id_peca { get; set; }

        (XmlElement("NR_Peca"))
        public string nr_peca { get; set; }

        (XmlElement("NR_Peso"))

        public decimal nr_peso { get; set; }

        (XmlElement("NR_Comprimento"))
        public decimal nr_comprimento { get; set; }

        (XmlElement("TP_Maquina"))

        public string tp_maquina { get; set; }
    }

Domain-Driven Design – Is a one-to-one mapping between writing applications and reading applications required?

We have a range of micro services (around 40) to serve our customers.

To ease the scalability and verifiability of a few micro services, we decided to redesign them using CQRS and event sourcing.

We started with a one-to-one mapping between read and write applications. For example, WriteApplicationA and ReadApplicationA, WriteApplicationB and ReadApplicationB, and so on.

At this point, however, we are considering that some read applications listen to events from more than one write application.

Is it okay to read applications that listen to events from multiple writing applications? (At this point, it looks very convincing, but I'll come across mistakes in the future). (Reporting is the use case where events from multiple writing applications are to be intercepted.)

Example of reading / writing an NFC card with I2C-BUS

Hello, I'm trying to write and read from an NFC card with a raspberry and a PN532 card.
The PN532 NPM library does not work due to a version problem with NPM I2C.

The library I use is I2C-BUS (https://www.npmjs.com/package/i2c-bus#busreadbytesyncaddr-cmd).

The test I do is the following …

app.get('/escribirtarjeta', (req, res) => {
  const address = 0x24;
  const test = new Buffer.from('test');
  console.log('test: ', test);

  let i2c1 = i2c.openSync(1);
  const result = i2c1.writeI2cBlockSync(address, 0x4, 0x4, test);
  console.log('result', result);
  i2c1.closeSync();

  console.log('Cierro y abro de nuevo');

  i2c1 = i2c.openSync(1);
  let r = new Buffer(0x4);
  const rawData = i2c1.readI2cBlockSync(address, 0x4, 0x4, r);
  console.log('rawData: ', rawData);
  console.log('r: ', r);
  i2c1.closeSync();
});

They know if I'm using the I2C methods badly, and if they have an example I'd be very helpful.

Greetings and thanks.

sharepoint enterprise – Site There was no connection when reading the PDF document in Embed. Tag another website with one day

I am using SharePoint 2013 and I am having the problem of displaying the PDF document in the embedded tag.

Error displayed:

  1. Connection to SharePoint site in embedding rejected.

  2. The display of & # 39; http: //SITE/HR/EmployeeDoc/Passport.pdf' in a frame was rejected because multiple 'X-Frame Options' headers were set with conflicting values ​​('SAMEORIGIN, Allow-From'). Falling back to deny. IN console log.

Note :

It has been working perfectly for 3 years continuously and I receive this error only from 3 days,

I have changed nothing in the process within the past 5 months, within the SharePoint Master Page OR permission.

Only PDF document is not displayed, images are displayed correctly. and if I access the PDF URL directly in the address bar, there is no problem whatsoever.

Can a buddy suggest me why he refuses, and please state the solution.

Please help me to solve this problem.

Thank you very much.

Looping – reading the first line

Below is a .txt file in which I read and which I must use for information. I want my function to read in the uppermost integer (how many numbers are in the following line) so I can use a for loop later. The problem is how this top number is defined. Attempting to type listSize = file.txt (0) will result in a seemingly random number, and my for loop will be executed undesirably many times. Here is the file:

Line 1: 4
Line 2: 5 8 9 2

How would I write a code in C ++ that only reads in this first line so that I can assign that number to a variable, e.g. For example, "listSize" to use for a for loop?

Bitcoin Core issues the error "Error while reading from database, shutdown" during initial setup

I recently installed Bitcoin Core via Portage on my Gentoo system. During the first setup, the first download was terminated at approximately 30% and the error "Error reading database from shutdown" was issued. When you restart the program, the progress will be slightly reset and the download will be restarted, but will always fail at the same time. I tried to run Bitcoin Core with the -reindex flag, and after that happened, the download continued the process – at 43.81% – but then issued the same error. As I mentioned earlier, this is the first blockchain download. I have never used the program for anything else.

Some points that may be important:

I have more than enough space.

I ran a dual boot with Windows, and when I ran Bitcoin Core for the first time, I had a time lag. It took me about a minute to realize that the program was closed and corrected. I have not done it since then with a time offset.

It almost always falls off at the same point – in this case anywhere between 134577 and 134579 remaining blocks. After the restart, the download starts at 134609, giving a difference of about 40 blocks. (As I mentioned earlier, however, it failed much earlier before being re-indexed.)

I have portage installed and therefore have no reason to believe that dependencies are missing.

Does this appear as a hardware problem? I have not run any disk tests other than a simple RAM test that has not encountered any problems. Thank you in advance.

Simple Tokenizer v2 – reading all matching characters at once

I've rewritten my tokenizer for most suggestions from the previous question here.

API

All characters are read as long as they match the pattern. I use three types of attributes to accomplish this.

  • Regex – reads through regular expressions; This requires a single group, which is the value of the token. it may match more, but only with the value of Groups(1) is used as a result
  • Const – Read a constant pattern where the entire length must match
  • QText – Read quoted text or use Regex. I've decided not to use regex for quoted strings because that's damn hard.

They return a tuple in which:

  • Success – indicates if a pattern has been found
  • Token – the actual value of the token
  • Length – the total duration of the game; I use this to move the index to the next token

These are the tree attributes:

public delegate (bool Success, string Token, int Length) MatchDelegate(string value, int offset);

public abstract class MatcherAttribute : Attribute
{
    public abstract (bool Success, string Token, int Length) Match(string value, int offset);
}

public class RegexAttribute : MatcherAttribute
{
    private readonly Regex _regex;

    public RegexAttribute((RegexPattern) string pattern)
    {
        _regex = new Regex(pattern);
    }

    public override (bool Success, string Token, int Length) Match(string value, int offset)
    {
        var match = _regex.Match(value, offset);
        // Make sure the match was at the offset.
        return (match.Success && match.Index == offset, match.Groups(1).Value, match.Length);
    }
}

public class ConstAttribute : MatcherAttribute
{
    private readonly string _pattern;

    public ConstAttribute(string pattern) => _pattern = pattern;

    public override (bool Success, string Token, int Length) Match(string value, int offset)
    {
        var matchCount = _pattern.TakeWhile((t, i) => value(offset + i).Equals(t)).Count();
        // All characters have to be matched.
        return (matchCount == _pattern.Length, _pattern, matchCount);
    }
}

// "foo "bar" baz"
// ^ starts here   ^ ends here
public class QTextAttribute : RegexAttribute
{
    public static readonly IImmutableSet Escapables = new() { '\', '"' }.ToImmutableHashSet();

    public QTextAttribute((RegexPattern) string pattern) : base(pattern) { }

    public override (bool Success, string Token, int Length) Match(string value, int offset)
    {
        return
            value(offset) == '"'
                ? MatchQuoted(value, offset)
                : base.Match(value, offset);
    }

    private (bool Success, string Token, int Length) MatchQuoted(string value, int offset)
    {
        var token = new StringBuilder();
        var escapeSequence = false;
        var quote = false;

        for (var i = offset; i < value.Length; i++)
        {
            var c = value(i);

            switch (c)
            {
                case '"' when !escapeSequence:

                    switch (i == offset)
                    {
                        // Entering quoted text.
                        case true:
                            quote = !quote;
                            continue; // Don't eat quotes.

                        // End of quoted text.
                        case false:
                            return (true, token.ToString(), i - offset + 1);
                    }

                    break; // Makes the compiler happy.

                case '\' when !escapeSequence:
                    escapeSequence = true;
                    break;

                default:

                    switch (escapeSequence)
                    {
                        case true:
                            switch (Escapables.Contains(c))
                            {
                                case true:
                                    // Remove escape char.
                                    token.Length--;
                                    break;
                            }

                            escapeSequence = false;
                            break;
                    }

                    break;
            }

            token.Append(c);
        }

        return (false, token.ToString(), 0);
    }
}

The tokenizer is now an instantiable class with an interface. It can be used raw or derived to create a specific tokenizer. When creating, state transitions are converted to a dictionary. That's what they are StateTransitionMapper is for. The tokenizer selects the first non-empty token. I think I should probably use the longest - as suggested on different websites - so I can change that later. What do you think? Would that be better

It starts with the default State that is by convention 0 because TToken is forced to be Enum and its default value is 0, I named that dummy simply specify Start,

public static class StateTransitionMapper
{
    public static IImmutableDictionary>> CreateTransitionMap(IImmutableList> states) where TToken : Enum
    {
        return states.Aggregate(ImmutableDictionary>>.Empty, (mappings, state) =>
        {
            var nextStates =
                from n in state.Next
                join s in states on n equals s.Token
                select s;

            return mappings.Add(state.Token, nextStates.ToImmutableList());
        });
    }
}

public interface ITokenizer where TToken : Enum
{
    IEnumerable> Tokenize(string value);
}

public class Tokenizer : ITokenizer where TToken : Enum
{
    private readonly IImmutableDictionary>> _transitions;

    public Tokenizer(IImmutableList> states)
    {
        _transitions = StateTransitionMapper.CreateTransitionMap(states);
    }

    public IEnumerable> Tokenize(string value)
    {
        var current = _transitions(default);

        for (var i = 0; i < value.Length;)
        {
            var matches =
                from state in current
                let token = state.Consume(value, i)
                // Consider only non-empty tokens.
                where token.Length > 0
                select (state, token);

            if (matches.FirstOrDefault() is var match && match.token is null)
            {
                throw new ArgumentException($"Invalid character '{value(i)}' at {i}.");
            }
            else
            {
                if (match.state.IsToken)
                {
                    yield return match.token;
                }

                i += match.token.Length;
                current = _transitions(match.state.Token);
            }
        }
    }
}

The tokenizer is supported by the State and Token Classes in which the State now reads all matching characters and caches the MatchDelegate it comes from the MatcherAttribute, IsToken This property is used to ignore tokens that do not actually exist real or usable tokens. I use this with the CommandLineTokenizer,

public class State where TToken : Enum
{
    private readonly MatchDelegate _match;

    public State(TToken token, params TToken() next)
    {
        Token = token;
        Next = next;
        _match =
            typeof(TToken)
                .GetField(token.ToString())
                .GetCustomAttribute() is MatcherAttribute matcher
                ? (MatchDelegate)(matcher.Match)
                : (MatchDelegate)((value, offset) => (false, string.Empty, 0));
    }

    public bool IsToken { get; set; } = true;

    public TToken Token { get; }

    public IEnumerable Next { get; }

    public Token Consume(string value, int offset)
    {
        return new Token(_match(value, offset))
        {
            Type = Token,
            Index = offset
        };
    }

    public override string ToString() => $"{Token} --> ({string.Join(", ", Next)})";
}

public class Token where TToken : Enum
{
    public Token((bool Success, string Token, int Length) match)
    {
        Length = match.Success ? match.Length : 0;
        Text = match.Success ? match.Token : string.Empty;
    }

    public int Index { get; set; }

    public int Length { get; set; }

    public string Text { get; set; }

    public TToken Type { get; set; }

    public override string ToString() => $"{Index}: {Text} ({Type})";
}

Examples and tests

I tested it with two tokenizers. They are very simple because only derived from the Tokenizer, They define their own state transitions and tokens.

One if for one UriString:

using static UriToken;

public class UriStringParserTest
{
    private static readonly ITokenizer Tokenizer = new UriStringTokenizer();

    (Theory)
    (InlineData(
        "scheme://user@host:123/pa/th?key-1=val-1&key-2=val-2#f",
        "scheme //user host 123/pa/th key-1 val-1 key-2 val-2 f"))
    (InlineData(
        "scheme://user@host:123/pa/th?key-1=val-1&key-2=val-2",
        "scheme //user host 123/pa/th key-1 val-1 key-2 val-2"))
    (InlineData(
        "scheme://user@host:123/pa/th?key-1=val-1",
        "scheme //user host 123/pa/th key-1 val-1"))
    (InlineData(
        "scheme://user@host:123/pa/th",
        "scheme //user host 123/pa/th"))
    (InlineData(
        "scheme:///pa/th",
        "scheme ///pa/th"
    ))
    public void Can_tokenize_URIs(string uri, string expected)
    {
        var tokens = Tokenizer.Tokenize(uri).ToList();
        var actual = string.Join("", tokens.Select(t => t.Text));
        Assert.Equal(expected.Replace(" ", string.Empty), actual);
    }

    (Fact)
    public void Throws_when_invalid_character()
    {
        // Using single letters for faster debugging.
        var uri = "s://:u@h:1/p?k=v&k=v#f";
        //             ^ - invalid character

        var ex = Assert.Throws(() => Tokenizer.Tokenize(uri).ToList());
        Assert.Equal("Invalid character ':' at 4.", ex.Message);
    }
}

public class UriStringTokenizer : Tokenizer
{
    /*

     scheme:(//(userinfo@)host(:port))path(?key=value&key=value)(#fragment)
            ( ----- authority ----- )     ( ----- query ------ )

     scheme: ------------------------ '/'path -------------------------  --------- UriString
                                     /                               /         /
             // --------- host ----- /        ?key ------ &key ------ /  #fragment
                        /         /                   /          /
                userinfo@      :port               =value      =value             

    */

    private static readonly State() States =
    {
        new State(default, Scheme),
        new State(Scheme, AuthorityPrefix, Path),
        new State(AuthorityPrefix, UserInfo, Host, Path),
        new State(UserInfo, Host),
        new State(Host, Port, Path),
        new State(Port, Path),
        new State(Path, Key, Fragment),
        new State(Key, UriToken.Value, Fragment),
        new State(UriToken.Value, Key, Fragment),
        new State(Fragment, Fragment),
    };

    public UriStringTokenizer() : base(States.ToImmutableList()) { }
}

public enum UriToken
{
    Start = 0,

    (Regex(@"((a-z0-9+.-)+):"))
    Scheme,

    (Const("//"))
    AuthorityPrefix,

    (Regex(@"((a-z0-9_)(a-z0-9.-_:)+)@"))
    UserInfo,

    (Regex(@"((a-z0-9.-_)+)"))
    Host,

    (Regex(@":((0-9)*)"))
    Port,

    (Regex(@"(/?(a-z_)(a-z0-9/:.-%_@)+)"))
    Path,

    (Regex(@"(?&;)((a-z0-9-)*)"))
    Key,

    (Regex(@"=((a-z0-9-)*)"))
    Value,

    (Regex(@"#((a-z)*)"))
    Fragment,
}

and the other for a CommandLine:

using static CommandLineToken;

public class CommandLineTokenizerTest
{
    private static readonly ITokenizer Tokenizer = new CommandLineTokenizer();

    (Theory)
    (InlineData(
        "command -argument value -argument",
        "command  argument value argument"))
    (InlineData(
        "command -argument value value",
        "command  argument value value"))
    (InlineData(
        "command -argument:value,value",
        "command  argument value value"))
    (InlineData(
        "command -argument=value",
        "command  argument value"))
    (InlineData(
        "command -argument:value,value",
        "command  argument value value"))
    (InlineData(
        @"command -argument=""foo--bar"",value -argument value",
        @"command  argument   foo--bar   value  argument value"))
    (InlineData(
        @"command -argument=""foo--""bar"",value -argument value",
        @"command  argument   foo-- ""bar   value  argument value"))
    public void Can_tokenize_command_lines(string uri, string expected)
    {
        var tokens = Tokenizer.Tokenize(uri).ToList();
        var actual = string.Join("", tokens.Select(t => t.Text));
        Assert.Equal(expected.Replace(" ", string.Empty), actual);
    }
}

public enum CommandLineToken
{
    Start = 0,

    (Regex(@"s*(?|(a-z0-9)(a-z0-9-_)*)"))
    Command,

    (Regex(@"s*(-./)((a-z0-9)(a-z-_)*)"))
    Argument,

    (Regex(@"(=:,s)"))
    ValueBegin,

    (QText(@"((a-z0-9.;-)*)"))
    Value,
}

public class CommandLineTokenizer : Tokenizer
{
    /*

     command (-argument)(=value)(,value)

     command --------------------------- CommandLine
                                       /
             -argument ------   ------ /    
                            /       /
                       =value   ,value

    */

    private static readonly State() States =
    {
        new State(default, Command),
        new State(Command, Argument),
        new State(Argument, Argument, ValueBegin),
        new State(ValueBegin, Value) { IsToken = false },
        new State(Value, Argument, ValueBegin),
    };

    public CommandLineTokenizer() : base(States.ToImmutableList()) { }
}

ask

  • Would you say that this is an improvement?
  • Maybe something is too unconventional? I think that is probably still no true State machine because of the loop in the tokenizer. I'm right?
  • Did I miss or misinterpret an important proposal?