Создайте контекстно-свободную грамматику для подъязыка прототипов Java.

Я новичок в контекстно-свободной грамматике, и пока я только изучил такие вещи, как левое/правое происхождение и G=(V, E, R, S). Но проблема, которую я пытаюсь решить, связана с прототипом Java, а я не очень хорошо разбираюсь в Java. Так что я действительно не знаю, с чего начать.

Предложите контекстно-свободную грамматику для подъязыка прототипов Java.

int myMethod();
double myMethod(int x, double y);
static double f(int x, double y, int z);
public static double g();

Это методы и переменные, как я могу относиться к таким вещам, как S => Sa | е? А что такое стартовый символ?

Благодарю вас!


person vegemitee    schedule 04.10.2012    source источник


Ответы (3)



Возьмите готовый анализатор грамматики Java (например, из http://www.antlr.org/grammar/list ) и выбросить все ненужное.

person Alexei Kaigorodov    schedule 04.10.2012
comment
спасибо за ресурс. но каково правило для этого конкретного вопроса? int myMethod() является начальным символом? - person vegemitee; 04.10.2012
comment
Где удовольствие от открытия, если вам все рассказывают? - person Tegiri Nenashi; 04.10.2012
comment
стартовый символ declaration_list, стартовое правило declaration_list:(declaration semicolon)* - person Alexei Kaigorodov; 04.10.2012
comment
определения строгого объявления можно взять из спецификации docs.oracle.com /javase/specs/jls/se7/html/index.html - person Alexei Kaigorodov; 04.10.2012
comment
большое спасибо! Спецификация именно то, что я ищу! - person vegemitee; 05.10.2012

Это то, что я придумал. Не могли бы вы уделить минутку, чтобы посмотреть, имеет ли это какой-то смысл?

S -> AB 
A -> PCT | CT | T 
B -> M(V);
V -> TX | TX,V | e

T -> int | double
C -> static | e
P -> public | e
M -> myMethod | f | g
X -> x | y | z
person vegemitee    schedule 05.10.2012
comment
Переменные грамматики, состоящие из одной буквы, подходят для учебных программ по разбору CS, но для практических грамматик вам лучше иметь более осмысленные имена в стиле программиста. Таким образом, изучение отдельного правила сделало бы его правильность очевидной (без детективной работы, что означают запутанные символы). Также имя метода (M?) следует сделать более общим -- идентификатор. Идентификаторы распознаются на этапе лексического анализа. - person Tegiri Nenashi; 05.10.2012