Сначала нужно спросить себя:
Каковы [под] части моего 'print ("что-то");' синтаксис?
Как только вы определите эти части, «просто» опишите их в форме правил синтаксиса грамматики вместе с применимыми правилами производства. А потом пусть Бизон сгенерирует парсер для вас; вот и все.
Чтобы отправиться в путь :
Полуколонна, вероятно, является элементом, который вы будете использовать для разделения состояний (такой один «вызов» для печати из другого).
Само слово «print», вероятно, является ключевым словом или, предпочтительно, именем встроенной функции вашего языка.
оператор печати , по-видимому, принимает буквальную строку в качестве [одного из] своих аргументов. буквенная строка начинается и заканчивается двойной кавычкой (и, возможно, учитывает экранированные кавычки внутри себя)
и т.п.
Выражения , выделенные жирным шрифтом и курсивом выше, представляют собой некоторые объекты («символы» в синтаксическом анализаторе), которые вам, вероятно, нужно будет определить в синтаксисе вашего языка. Для этого вы будете использовать правила грамматики Bison, такие как
stmt : print_stmt ';' | input_stmt ';'| some_other_stmt ';' ;
prnt_stmt : print '(' args ')'
{ printf( $3 ); }
;
args : arg ',' args;
...
Поскольку вопрос о полуколонке задан, возможно, некоторая путаница возникла из-за различных его применений; см., например, выше, как ';' принадлежат синтаксису вашего языка, посредством чего; (без кавычек) в конце каждого грамматического правила являются частью языка Bison.
Примечание: это, конечно, упрощенная реализация, нацеленная на демонстрацию основных. Кроме того, синтаксис Bison может быть безразличным (был там / сделал это, но давным-давно ;-) Я тогда "встретил" ANTLR , чтобы никогда не возвращаться в Bison, хотя я вижу, как его легкий и полностью автономная природа может сделать это уместным в некоторых случаях)