ЗОЛОТО Парсер комментирует грамматику
У меня проблемы с блоками комментариев в моей грамматике. Синтаксис в порядке, но шаг 3 DFA-сканер жалуется на то, как я это делаю.
Язык, который я пытаюсь разобрать, выглядит так:
{заявление}{заявление} и т. д.
В каждом утверждении может быть несколько разных типов комментариев:
{% This is a comment.
It can contain multiple lines
and continues until the statement end}
{statement REM This is a comment.
It can contain multiple lines
and continues until the statement end}
Это упрощенная грамматика, которая отображает проблему, с которой я сталкиваюсь:
"Start Symbol" = <Program>
{String Chars} = {Printable} + {HT} - ["\]
StringLiteral = '"' ( {String Chars} | '\' {Printable} )* '"'
Comment Start = '{%'
Comment End = '}'
Comment Block @= { Ending = Closed } ! Eat the } and produce an empty statement
!Comment @= { Type = Noise } !Implied by GOLD
Remark Start = 'REM'
Remark End = '}'
Remark Block @= { Ending = Open } ! Don't eat the }, the statements expects it
Remark @= { Type = Noise }
<Program> ::= <Statements>
<Statements> ::= '{' <Statement> '}' <Statements> | <>
<Statement> ::= StringLiteral
Шаг 3 жалуется на} в <Заявления> и} для конца лексической группы.
Кто-нибудь знает, как сделать то, что мне нужно?
[Редактировать]
Я получил часть REM, работающую со следующим:
{Remark Chars} = {Printable} + {WhiteSpace} - [}]
Remark = 'REM' {Remark Chars}* '}'
<Statements> ::= <Statements> '{' <Statement> '}'
| <Statements> '{' <Statement> <Remark Stmt>
| <>
<Remark Stmt> ::= Remark
Это на самом деле идеально, поскольку замечания не обязательно являются для меня шумом.
По-прежнему возникают проблемы с комментариями лексической группы. Я буду смотреть на решение таким же образом.
1 ответ
Я не думаю, что захват REM-комментария с лексической группой возможен.
Я думаю, что вам нужно определить новый терминал следующим образом:
Remark = 'REM' ({Printable} - '}')*
Это, однако, означает, что вы должны иметь возможность обрабатывать этот новый терминал в ваших производствах...
Например. От:
<CurlyStatement> ::= '{' <Statement> '}'
Для того, чтобы:
<CurlyStatement> ::= '{' <Statement> '}'
| '{' <Statement> Remark '}'
Я не проверял синтаксис в приведенных выше примерах, но я надеюсь, что вы поняли мой идеар