- Запреты начинаются в начале строки, предшествующие белые пространства игнорируются. < /Li >
Назначение определяется как SingleExpression: = SingleExpression , например a: = 1 или a: = b: = 1 . Белые пространства необязательны, а новеньши разрешены с обеих сторон оператора назначения.вызывает 2 для назначения .Код: Выделить всё
a:= 1 < /code> действителен. (a: = 1): = 2 - Оператор вызова функции начинается с идентификатора или в скобках выражения (или доступ к участнику, вне сферы действия для этого поста), сопровождается пробелом (-ами), а затем содержит список аргументов, разделенных запятыми. Связался с струной, по крайней мере, с одним белым пространством между ними. Например, a: = 1 2 объединяет цифры до 12 и назначает . Конец строки допускается только в том случае, если конкатенация находится внутри скобок или скобков.
будет считаться двумя операторами: Присвоение 1 к и функции вызова Hello function.
Код: Выделить всё
a := 1 helloсчитается одним, а назначается 12 . Явная конкатенация также возможна с оператором. , и в этом случае с обеих сторон должно быть белое пространство/новая линия. Если с обеих сторон нет белых пространств, то это доступ к объекту. (на отдельной строке) или утверждение. Например, a :: b: = 1 означает «создать горячую клавишу для ключа a , который затем назначает 1 переменной b ». a :: msgbox запускает вызов функции для msgbox .Код: Выделить всё
a := (1 2) - Remap - это идентификатор ключа, за которым следует :: , за которым следует другой ключ. Например, A :: B создает функциональность, где нажатие отправляет B вместо этого. Remap имеет приоритет над Hotkey, поэтому, если второй идентификатор ключа соответствует ключевому имени, он считается Remap, в противном случае горячей клавиш. a :: msgbox - это горячая клавиша только потому, что ключ с именем msgbox не существует.
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
Мобильная версия