Как снабдить lark грамматикой antlr g4 C #?

#c# #python #antlr #lark-parser

#c# #python #antlr #lark-синтаксический анализатор

Вопрос:

Я хотел бы использовать lark для создания синтаксического анализатора для C # 6.

Я нашел грамматику antlr C # 6, но она не работает «из коробки» с lark.

Есть ли кто-нибудь, кто мог бы сказать мне, как переформатировать грамматику g4 на то, чем я могу снабдить lark?

Кажется, что формат между тем, что ожидают lark и g4, немного отличается.

 from lark import Lark

filename = 'grammar.bnf'

with open(filename,'r') as file:
    output = file.read()

parser = Lark(output, start='compilation_unit')
  

grammar.bnf содержит грамматику C # 6, о которой я упоминал выше, с начальной точкой compilation_unit .

Выдержка из исходного файла bnf:

 parser grammar CSharpParser;

options { tokenVocab=CSharpLexer; }

// entry point
compilation_unit
    : BYTE_ORDER_MARK? extern_alias_directives? using_directives?
      global_attribute_section* namespace_member_declarations? EOF
    ;

//B.2 Syntactic grammar

//B.2.1 Basic concepts

namespace_or_type_name 
    : (identifier type_argument_list? | qualified_alias_member) ('.' identifier type_argument_list?)*
    ;

[Rest of the file]
  

Обратите внимание, что я удалил все до точки входа compilation_unit :

 parser grammar CSharpParser;

options { tokenVocab=CSharpLexer; }
  

Комментарии:

1. Как вы думаете, почему вы можете обрабатывать грамматики ANTLR с помощью Lark? Lark обрабатывает BNF, а не синтаксис, похожий на BNF от ANTLR. Кроме того, я вижу, что Lark обрабатывает грамматики LR, в то время как ANTLR выполняет грамматики LL. Короче говоря: вы не можете сделать это с помощью Lark.

2. @BartKiers это была моя точка зрения, я думал, что есть способ преобразовать antlr bnf в вариант lark ebnf, они выглядят похожими. Спасибо за ваш ответ, думаю, тогда мне нужно придерживаться antlr =/

3. AFAIK, нет способа легко / автоматически преобразовать грамматику LL ANTLR в общий вариант (Lark) (E) BNF LR. Да, я бы придерживался ANTLR.

4. На самом деле вы можете использовать Lark для анализа всего, что может анализировать ANTLR. Вам просто нужно преобразовать синтаксис.