#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. Вам просто нужно преобразовать синтаксис.