Я пытаюсь проанализировать локализованные «строковые» файлы macOS / iOS.
Формат этого файла основан на парах ключ / значение с необязательными комментариями.Вот пример:
/* This is a comment */
// This is also a comment
"key1" = "value1";
"key2" = "value2";
и так далее. ПРИМЕЧАНИЕ внутри "" может быть абсолютно любой вид текста.
РЕДАКТИРОВАТЬ Исходная грамматика errorneus удалена
Я пыталсянаписать эту простую грамматику, но, к сожалению, она не работает.
Поскольку содержимое внутри кавычек может быть довольно сложным, не говоря уже о комментариях, я чувствую, что обычное регулярное выражение не имеет реальной силы там.
РЕДАКТИРОВАТЬ на основе комментариев @GRosenberg Я создал новую грамматику.Теперь у меня проблема в том, что я не могу включить «Символы» в качестве Char, иначе синтаксический анализ прекратится.
grammar LProj;
Esc : '\\';
Spaces : [ \t\r\n\f]+;
BlockComment : '/*' .*? ('*/' | EOF) ;
LineComment : '//' ~[\r\n]* ( '\r'? '\n' [ \t]* '//' ~[\r\n]* )* ;
MLN_COMMENT: BlockComment -> channel(HIDDEN) ;
SLN_COMMENT: LineComment -> channel(HIDDEN) ;
doc : expression*;
expression
: BlockComment
| LineComment
| Spaces
| entry
;
entry : '"' key=VALUE '"' Spaces? '=' Spaces? '"' value=VALUE '"' Spaces? ';' ;
VALUE : ( EscSeq | Val )+ ;
fragment Val : Char ( EscSeq | Char )* ;
fragment Symbol
: '*'
| '/'
| ';'
| '='
;
fragment Char
: Spaces
| '!' // skip "
| '#'..')' // skip *
| '+'..'.' // skip /
| '0'..':' // skip ;
| '<' // skip =
| '>'..'[' // skip \
| ']'..'~'
| '\u00B7'..'\ufffd'
; // ignores | ['\u10000-'\uEFFFF] ;
fragment UnicodeEsc
: 'u' (Hex (Hex (Hex Hex?)?)?)?
;
fragment Hex : [0-9a-fA-F] ;
fragment EscSeq
: Esc
( [btnfr"\\] // standard escaped character set
| UnicodeEsc // standard Unicode escape sequence
| . // Invalid escape character
| EOF // Incomplete at EOF
)
;