ЗОЛОТО Парсер комментирует грамматику

У меня проблемы с блоками комментариев в моей грамматике. Синтаксис в порядке, но шаг 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 '}'

Я не проверял синтаксис в приведенных выше примерах, но я надеюсь, что вы поняли мой идеар

Другие вопросы по тегам