Я использую Cocor для создания Java-подобный сканер/анализатор:
У меня возникли некоторые проблемы в создании выражения EBNF соответствовать кодоблок:Синтаксический кодовый блок с выражением EBNF
Я предполагаю, кодовый блок окружен два известных лексемами: < & и &> пример:
public method(int a, int b) <&
various code
&>
Если я определяю нетерминальный символ
codeblock = "<&" {ANY} "&>"
Если код внутри двух символов содержит символ '<', сгенерированный компилятор не будет обрабатывать его, что даст синтаксическую ошибку.
Подсказка?
Edit:
COMPILER JavaLike
CHARACTERS
nonZeroDigit = "123456789".
digit = '0' + nonZeroDigit .
letter = 'A' .. 'Z' + 'a' .. 'z' + '_' + '$'.
TOKENS
ident = letter { letter | digit }.
PRODUCTIONS
JavaLike = {ClassDeclaration}.
ClassDeclaration ="class" ident ["extends" ident] "{" {VarDeclaration} {MethodDeclaration }"}" .
MethodDeclaration ="public" Type ident "("ParamList")" CodeBlock.
Codeblock = "<&" {ANY} "&>".
я опустил некоторые спектакли для простоты.
Это моя реальная реализация грамматики. Основная ошибка заключается в том, что она терпит неудачу, если код в блоке содержит один из символов '>' или '&'.
как бы вы определили ANY_WITHIN_BLOCK? – nick2k3
Как вы определяете ЛЮБОЕ? –
ANY - это «веселый» токен в CocoR: он соответствует каждому знаку. – nick2k3