Eto.Parse и как его использовать

Как написать рекурсивный парсер?
 
One note that could help debug is to turn on errors for all parsers.. you can do this on your grammar after defining it by calling:
myGrammar.SetError(true);
This will give you more than just the named parsers as errors, and help show what exactly the parser is choking on.

how to write a rule to match any symbol (except specific)?
in EBNF, ISO style
? Terminals.Symbol ? - '?'
anything except ?
any symbol except ? that is
you can use any of the terminals from the Terminals class using ? Terminals. ?
you can also register other extensions via the EbnfGrammar.SpecialParsers dictionary..
for example, if you want to use the StringParser, you can do: myEbnfGrammar.SpecialParsers["StringParser"] = new StringParser();
then in the grammar: My String Parser := ? StringParser ?

You can do that using the DisplayParserWriter.. e.g. Console.WriteLine(new DisplayParserWriter().Write(myGrammarOrParser));
Eto.Parse.Writers.DisplayParserWriter

"=" и ":="

В README.md написано, что при использовани и второго отключается автоматическое удаление пробелных символов (то, что мне надо)

Порядок правил важен

Если правило может быть пустым, оно срабатывает и последующие не проверяются>

До некоего терминатор

I want to define strings which ends by specific sequence of characters
myEbnfGrammar.SpecialParsers["UntilEOF"] = (+Terminals.AnyChar).Until("MYSEQUENCE"); (;
no way to do that using ebnf I'm afraid.. at least with Eto.Parse.

Как записывать спецсимволы

Я не понимаю, как записать '\n' в EBNF:

    malformed_line := { malformed_line_unit } ; 
    malformed_line_unit := ? Terminals.AnyChar ? - '\n';
    
    > ast.Matches ["malformed_line", true].Matches[33]
    {
    }
    	Empty: false
    	HasMatches: false
    	Index: 33
    	Length: 1
    	Matches: Count = 0
    	Name: "malformed_line_unit"
    	Parser: {Eto.Parse.UnaryParser}
    	Scanner: {Eto.Parse.Scanners.StringScanner}
    	StringValue: "\n"
    	Success: true
    	Tag: (null)
    	Text: "\n"
    	Value: "\n"
    	Static members: 
    	Non-public members:
    > 
Можно создать терминал из одного символа программно:
https://github.com/picoe/Eto.Parse/blob/master/Eto.Parse/Terminals.cs#L48
var cr = Terminals.Set("\n"); // Set - статическая функция, строку приобразовывает в массив символов

Дальше надо из терминала создать правило (то есть дать терминалу имя в грамматике), и добавить правило в грамматику (возможно создание и добавление - это одно действие?)


				case "hex character":
					return new SingleCharTerminal((char)int.Parse(child.Text.Substring(2), NumberStyles.HexNumber));
Substring(2) - пропускает 0x ?
NumberStyles.HexNumber - это из System.Globalization (.Net framwork)
Indicates that the AllowLeadingWhite, AllowTrailingWhite, and AllowHexSpecifier styles are used. This is a composite number style.
AllowHexSpecifier flag indicates that the string to be parsed is always interpreted as a hexadecimal value. The only individual field flags that can be used with AllowHexSpecifier are AllowLeadingWhite and AllowTrailingWhite.

hex character - а где описано это правило EBNF ?

IDE нет

well depends on what you mean by "ide".. a simple editor/debugger wouldn't take much to put together initially..
but maybe it wouldn't meet expectations
the main difficulty of Eto.Parse is because it's a recursive descent parser instead of a state parser.. order of rules counts

GrammarCompiler

Есть проект
https://github.com/furesoft/GrammarCompiler
он позволяет из файла-грамматики создать .cs-файл, который всё равно будет зависить от библиотеки с классами, зато не потребует отдельного файла .ebnf (пф, как будто это проблема файл в ресурсы или в код запихнуть)