Как мне решить эти проблемы с моей грамматикой ANTLR для кода автохотки?C#

Место общения программистов C#
Ответить
Anonymous
 Как мне решить эти проблемы с моей грамматикой ANTLR для кода автохотки?

Сообщение Anonymous »

I Transpile Autohotkey V2 код для C# с использованием Antlr4 и Roslyn. Пример с использованием только нескольких грамматических элементов, описанных этими правилами: < /p>
  • Запреты начинаются в начале строки, предшествующие белые пространства игнорируются. < /Li >
    Назначение определяется как SingleExpression: = SingleExpression , например a: = 1 или a: = b: = 1 . Белые пространства необязательны, а новеньши разрешены с обеих сторон оператора назначения.

    Код: Выделить всё

    a:=
    1
    < /code>
    действителен. (a: = 1): = 2 
    вызывает 2 для назначения .
  • Оператор вызова функции начинается с идентификатора или в скобках выражения (или доступ к участнику, вне сферы действия для этого поста), сопровождается пробелом (-ами), а затем содержит список аргументов, разделенных запятыми. Связался с струной, по крайней мере, с одним белым пространством между ними. Например, a: = 1 2 объединяет цифры до 12 и назначает . Конец строки допускается только в том случае, если конкатенация находится внутри скобок или скобков.

    Код: Выделить всё

    a := 1
    hello
    
    будет считаться двумя операторами: Присвоение 1 к и функции вызова Hello function.

    Код: Выделить всё

    a := (1
    2)
    
    считается одним, а назначается 12 . Явная конкатенация также возможна с оператором. , и в этом случае с обеих сторон должно быть белое пространство/новая линия. Если с обеих сторон нет белых пространств, то это доступ к объекту. (на отдельной строке) или утверждение. Например, a :: b: = 1 означает «создать горячую клавишу для ключа a , который затем назначает 1 переменной b ». a :: msgbox запускает вызов функции для msgbox .
  • Remap - это идентификатор ключа, за которым следует :: , за которым следует другой ключ. Например, A :: B создает функциональность, где нажатие отправляет B вместо этого. Remap имеет приоритет над Hotkey, поэтому, если второй идентификатор ключа соответствует ключевому имени, он считается Remap, в противном случае горячей клавиш. a :: msgbox - это горячая клавиша только потому, что ключ с именем msgbox не существует.
Я пытаюсь Напишите Grammar Performant. Оператор выражения A: = 1 Повторяемый 300 000 раз проанализируется и выполняется Autohotkey за
using System.Text;
using Antlr4.Runtime;
using Antlr4.Runtime.Atn;
using System.Diagnostics;

namespace AntlrCSharp
{
class Program
{
private static void Main(string[] args)
{
try
{
string input = "";
StringBuilder text = new StringBuilder();

string filePath = @"test.txt";

try
{
string fileContent = File.ReadAllText(filePath);
text.Append(fileContent);
}
catch (FileNotFoundException)
{
Console.WriteLine($"The file at {filePath} was not found.");
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
StartSimpleParser(text);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex);
}
}
public static void StartSimpleParser(StringBuilder text)
{
Console.WriteLine("Start");
AntlrInputStream inputStream = new AntlrInputStream(text.ToString());
SimpleLexer simpleLexer = new SimpleLexer(inputStream);
CommonTokenStream commonTokenStream = new CommonTokenStream(simpleLexer);
SimpleParser simpleParser = new SimpleParser(commonTokenStream);

/*
foreach (var token in SimpleLexer.GetAllTokens())
{
Console.WriteLine($"Token: {SimpleLexer.Vocabulary.GetSymbolicName(token.Type)}, Text: '{token.Text}'" + (token.Channel == MainLexer.Hidden ? " (hidden)" : ""));
}
*/

simpleParser.ErrorHandler = new BailErrorStrategy();
simpleParser.AddErrorListener(new DiagnosticErrorListener());
simpleParser.Interpreter.PredictionMode = PredictionMode.LL_EXACT_AMBIG_DETECTION;

SimpleParser.ProgramContext programContext = simpleParser.program();

Console.WriteLine("Parsed");

MainVisitor visitor = new MainVisitor();
visitor.Visit(programContext);
Console.WriteLine("End");
}
}
}
< /code>
У этой грамматики есть несколько проблем: < /p>
  • Я не могу включить как дополнительные белые, так и в конце -Линны в выражении выражения: SingleExpression S? ': =' s? SingleExpression [/code] вызывает ошибку отчетов, CattemptingFullContext с LL_EXACT_AMBIG_DETECTION. Текущий remapkey определение hotkeycharacter '::' hotkeycharacter означает, что я должен отдельно проанализировать его позже в посетителе. .
Как мне решить эти проблемы?

Подробнее здесь: https://stackoverflow.com/questions/793 ... otkey-code
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»