Как игнорировать токены, пока в Superpower C# не будет найден определенный шаблон токенов? - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь проанализировать объекты, которые перемежаются с функциями, и я хочу пропустить функции.

Структура:

/datum/chemical_reaction/reagent_explosion
    name = "Generic explosive"
    id = "reagent_explosion"
    var/strengthdiv = 10
    var/modifier = 0

/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume)
    var/power = modifier + round(created_volume/strengthdiv, 1)
    if(power > 0)
        var/turf/T = get_turf(holder.my_atom)
        var/inside_msg
        if(ismob(holder.my_atom))
        // More code ...

/datum/chemical_reaction/reagent_explosion/nitroglycerin
    name = "Nitroglycerin"
    id = /datum/reagent/nitroglycerin
    results = list(/datum/reagent/nitroglycerin = 2)
    required_reagents = list(/datum/reagent/glycerol = 1, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/toxin/acid = 1)
    strengthdiv = 2

/datum/chemical_reaction/reagent_explosion/nitroglycerin/on_reaction(datum/reagents/holder, created_volume)
    if(holder.has_reagent(/datum/reagent/stabilizing_agent))
        return
    holder.remove_reagent(/datum/reagent/nitroglycerin, created_volume*2)
    ..()

Функция может быть распознана паразитами после пути. Так как синтаксический анализ труден, я просто хочу пропустить токены после открытых скобок, пока не будет найден токен EOL, за которым сразу же следует ReferencePath. Я пытался разобрать функции, но это было слишком сложно без реальной награды, поэтому я сейчас нахожусь:

public static readonly TokenListParser<DMToken, string[]> ParameterDefinition =
    from _ in Token.EqualTo(DMToken.OpenParen)
    from values in Identifier.ManyDelimitedBy(Token.EqualTo(DMToken.Comma))
    from __ in Token.EqualTo(DMToken.CloseParen)
    select values;

public static readonly TokenListParser<DMToken, object> Function =
    from path in ReferencePath
    from _ in ParameterDefinition
    from __ in Token.EqualTo(DMToken.Eol)
    from ___ in LoneStatement.Many()
    from ____ in Token.EqualTo(DMToken.ReturnKeyword)
    select null as object;

public static readonly TokenListParser<DMToken, ExpandoObject> Object =
    from path in ReferencePath
    from _ in Token.EqualTo(DMToken.Eol)
    from values in LoneAssignment.Many().Select(a => {
            // KeyValuePair to dynamic mapping code
        })
    select values;

public static readonly TokenListParser<DMToken, ExpandoObject[]> ObjectList =
    (from obj in Object//.Try().Or(Function.Select(x => (dynamic)x))
     from _ in Token.EqualTo(DMToken.Eol).Many()
     select obj).Many();

Исходный код, хотя и не самая новая версия: https://github.com/RedlineTriad/DMParser

Код, который я пытаюсь разобрать: https://github.com/tgstation/tgstation/tree/master/code/modules/reagents/chemistry/recipes

...