Определите переменную грамматику C# с помощью pyparsing
Как найти все переменные в исходном коде C#?
Вот моя нерабочая грамматика, которая не работает, потому что ZeroOrMore (VarDef4)
Protected = Literal("protected")
Private = Literal("private")
Public = Literal("public")
Modification = Public^Private^Protected
Static = Literal("static")
Auto = Literal("Auto")
MemoryType =(Static^Auto)
Bool = Literal("bool"); Byte = Literal("byte"); Char = Literal("char"); Decimal = Literal("decimal"); Double = Literal("double"); Enum = Literal("enum")
Float = Literal("float"); Int = Literal("int"); Long = Literal ("long"); Sbyte = Literal("sbyte"); Short = Literal("short")
Struct = Literal("struct"); String = Literal("string"); Uint = Literal("uint"); Ulong = Literal("ulong"); Ushort = Literal("ushort")
VariableType = (Bool)^(Byte)^(Char)^(Decimal)^(Double)^(Enum)^(Float)^(Int)^(Long)^(Sbyte)^(Short)^(Struct)^(String)^(Uint)^(Ulong)^(Ushort)
Variable = Word(alphanums + '_' + '$'+ '.' )
VarDef2 = '=' + OneOrMore(Word(alphanums + '_' + '$' + '"' + '-'+ "'" ) )
VarDef3 = ZeroOrMore("," + Variable + Optional(VarDef2))
VarDef4 = VarDef2^VarDef3 VarDef = Optional(Modification) + Optional(MemoryType) + (VariableType) + Variable + ZeroOrMore(VarDef4) + ";"
Например, мой строковый ввод дан:
int k1 = 89, k2 = 6;
public static int alpha = 54 ;
В выходном файле:
{'Row': 1, 'Construct': "['int', 'k1', '89]", "['int', 'k2', '6']", 'Variable' : k1, k2, 'VariableType': int, 'Modification': not defined, 'MemoryType': not defined, 'Line': 'int k1 = 89, k2 = 6'}
{'Row': 2, 'Construct': "['public', 'static', 'int', 'alpha']", 'Variable': alpha, 'VariableType': int,'Modification': public, 'MemoryType': static, 'Line': 'public static int alpha = 54'}
Может быть, есть другой способ реализации этой грамматики или как сделать эту грамматику?
1 ответ
Вот пример кода C#, показывающий, как можно использовать синтаксический анализатор для извлечения переменных. Обратите внимание, что это всего лишь простой пример, и вам может потребоваться настроить код для обработки более сложных сценариев:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
public class Literals
{
public void Execute()
{
string code = @"int k1 = 89, k2 = 6;
public static int alpha = 54;
bool flag = true;
string message = ""Hello, world!"";
double pi = 3.14159;";
SyntaxTree tree = CSharpSyntaxTree.ParseText(code);
IEnumerable<VariableDeclarationSyntax> variableDeclarations = tree.GetRoot()
.DescendantNodes()
.OfType<VariableDeclarationSyntax>();
variableDeclarations.ToList().ForEach(variableDeclaration =>
{
variableDeclaration.Variables.ToList().ForEach(variableDeclarator =>
{
Console.WriteLine($"" +
$"{variableDeclaration.Type} " +
$"{variableDeclarator.Identifier.ValueText} = " +
$"{variableDeclarator.Initializer?.Value?.ToString() ?? "null"}");
});
});
}
}