Понимание того, что составляет двусмысленность в грамматике жаворонка

Я пытался упростить случай, представленный в другом вопросе, и получил следующую попытку разбора с использованием lark:

from lark.lark import Lark

text = """
start_thing {
  loc int {
    from 0,
    to 1093,
    strand plus,
    id gi 384632836
  }
}
"""

grammar = """\
thing: "start_thing" node
locus_info: "loc int" "{" int_info "," int_info "," STRAND_INFO "," int_info "}"
int_info: TAGS? INT
node: locus_info
    | int_info
    | TAGS? "{" nodes "}" -> subnodes
    | TAGS                -> onlytags
nodes: node?
    | node ("," node)*
STRAND_INFO: "strand" SIGN
SIGN: "plus" | "minus"
TAGS: TAGWORD (WS TAGWORD)*
TAGWORD: ("_"|LETTER)("_"|"-"|LETTER|DIGIT)*
%import common.WS
%import common.LETTER
%import common.DIGIT
%import common.INT
%ignore WS
"""

parser = Lark(grammar, start="thing", ambiguity="explicit")
parsed = parser.parse(text)
print(parsed.pretty())

Выход:

thing
  subnodes
    nodes
      subnodes
        loc int
        nodes
          node
            int_info
              from
              0
          node
            int_info
              to
              1093
          onlytags  strand plus
          node
            int_info
              id gi
              384632836

Как показано в этом примере, ambiguity="explicit" опция должна разрешить отображение альтернативных возможностей сопоставления, которым предшествует _ambig этикетка. Это не отображается в приведенном выше выводе. Кажется, я не понимаю, что такое двусмысленность.

Почему "Стрэнд плюс" не считается двусмысленным? Мне кажется, что это может быть либо STRAND_INFO или же onlytags,

Точно так же я ожидаю, что "loc int {...}" будет соответствовать locus_info или же subnodes,

0 ответов

Другие вопросы по тегам