281 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Erlang
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Erlang
		
	
	
	
	
	
Nonterminals
 | 
						|
  grammar
 | 
						|
  obsolete_pluralization
 | 
						|
  obsolete_pluralizations
 | 
						|
  obsolete_plural_message
 | 
						|
  obsolete_singular_message
 | 
						|
  only_comments
 | 
						|
  pluralization
 | 
						|
  pluralizations
 | 
						|
  plural_message
 | 
						|
  singular_message
 | 
						|
  message
 | 
						|
  messages
 | 
						|
  message_meta.
 | 
						|
Terminals
 | 
						|
  comment
 | 
						|
  msgctxt
 | 
						|
  msgid
 | 
						|
  msgid_plural
 | 
						|
  msgstr
 | 
						|
  obsolete_msgctxt
 | 
						|
  obsolete_msgid
 | 
						|
  obsolete_msgid_plural
 | 
						|
  obsolete_msgstr
 | 
						|
  plural_form
 | 
						|
  previous
 | 
						|
  str_lines.
 | 
						|
Rootsymbol grammar.
 | 
						|
Endsymbol '$end'.
 | 
						|
 | 
						|
grammar ->
 | 
						|
  only_comments : {only_comments, '$1'}.
 | 
						|
grammar ->
 | 
						|
  messages : {messages, '$1'}.
 | 
						|
grammar ->
 | 
						|
  '$empty' : empty.
 | 
						|
 | 
						|
only_comments ->
 | 
						|
  comment only_comments : [extract_simple_token('$1') | '$2'].
 | 
						|
only_comments ->
 | 
						|
  comment : [extract_simple_token('$1')].
 | 
						|
 | 
						|
messages ->
 | 
						|
  message messages : ['$1' | '$2'].
 | 
						|
messages ->
 | 
						|
  message : ['$1'].
 | 
						|
 | 
						|
message ->
 | 
						|
  obsolete_singular_message : '$1'.
 | 
						|
message ->
 | 
						|
  singular_message : '$1'.
 | 
						|
message ->
 | 
						|
  obsolete_plural_message : '$1'.
 | 
						|
message ->
 | 
						|
  plural_message : '$1'.
 | 
						|
 | 
						|
singular_message ->
 | 
						|
  message_meta msgid str_lines msgstr str_lines : to_singular_message(
 | 
						|
    [
 | 
						|
      {msgid, extract_simple_token('$3')},
 | 
						|
      {msgstr, extract_simple_token('$5')}
 | 
						|
      | group_meta('$1')
 | 
						|
    ], [
 | 
						|
      {msgid, extract_line('$2')},
 | 
						|
      {msgstr, extract_line('$4')}
 | 
						|
    ]
 | 
						|
  ).
 | 
						|
singular_message ->
 | 
						|
  message_meta msgctxt str_lines msgid str_lines msgstr str_lines : to_singular_message(
 | 
						|
    [
 | 
						|
      {msgctxt, extract_simple_token('$3')},
 | 
						|
      {msgid, extract_simple_token('$5')},
 | 
						|
      {msgstr, extract_simple_token('$7')}
 | 
						|
      | group_meta('$1')
 | 
						|
    ],
 | 
						|
    [
 | 
						|
      {msgctxt, extract_line('$2')},
 | 
						|
      {msgid, extract_line('$4')},
 | 
						|
      {msgstr, extract_line('$6')}
 | 
						|
    ]
 | 
						|
  ).
 | 
						|
 | 
						|
obsolete_singular_message ->
 | 
						|
  message_meta obsolete_msgid str_lines obsolete_msgstr str_lines : to_singular_message(
 | 
						|
    [
 | 
						|
      {obsolete, true},
 | 
						|
      {msgid, extract_simple_token('$3')},
 | 
						|
      {msgstr, extract_simple_token('$5')}
 | 
						|
      | group_meta('$1')
 | 
						|
    ], [
 | 
						|
      {msgid, extract_line('$2')},
 | 
						|
      {msgstr, extract_line('$4')}
 | 
						|
    ]
 | 
						|
  ).
 | 
						|
obsolete_singular_message ->
 | 
						|
  message_meta obsolete_msgctxt str_lines obsolete_msgid str_lines obsolete_msgstr str_lines : to_singular_message(
 | 
						|
    [
 | 
						|
      {obsolete, true},
 | 
						|
      {msgctxt, extract_simple_token('$3')},
 | 
						|
      {msgid, extract_simple_token('$5')},
 | 
						|
      {msgstr, extract_simple_token('$7')}
 | 
						|
      | group_meta('$1')
 | 
						|
    ],
 | 
						|
    [
 | 
						|
      {msgctxt, extract_line('$2')},
 | 
						|
      {msgid, extract_line('$4')},
 | 
						|
      {msgstr, extract_line('$6')}
 | 
						|
    ]
 | 
						|
  ).
 | 
						|
 | 
						|
plural_message ->
 | 
						|
  message_meta msgid str_lines msgid_plural str_lines pluralizations :
 | 
						|
  {Pluralizations, PluralLineInformation} = split_msgstr('$6'),
 | 
						|
  to_plural_message(
 | 
						|
    [
 | 
						|
      {msgid, extract_simple_token('$3')},
 | 
						|
      {msgid_plural, extract_simple_token('$5')},
 | 
						|
      {msgstr, maps:from_list(Pluralizations)}
 | 
						|
      | group_meta('$1')
 | 
						|
    ],
 | 
						|
    [
 | 
						|
      {msgid, extract_line('$2')},
 | 
						|
      {msgid_plural, extract_line('$4')} | PluralLineInformation
 | 
						|
    ]
 | 
						|
  ).
 | 
						|
plural_message ->
 | 
						|
  message_meta msgctxt str_lines msgid str_lines msgid_plural str_lines pluralizations :
 | 
						|
  {Pluralizations, PluralLineInformation} = split_msgstr('$8'),
 | 
						|
  to_plural_message(
 | 
						|
    [
 | 
						|
      {msgctxt, extract_simple_token('$3')},
 | 
						|
      {msgid, extract_simple_token('$5')},
 | 
						|
      {msgid_plural, extract_simple_token('$7')},
 | 
						|
      {msgstr, maps:from_list(Pluralizations)}
 | 
						|
      | group_meta('$1')
 | 
						|
    ],
 | 
						|
    [
 | 
						|
      {msgctx, extract_line('$2')},
 | 
						|
      {msgid, extract_line('$4')},
 | 
						|
      {msgid_plural, extract_line('$6')}
 | 
						|
      | PluralLineInformation
 | 
						|
    ]
 | 
						|
  ).
 | 
						|
 | 
						|
obsolete_plural_message ->
 | 
						|
  message_meta obsolete_msgid str_lines obsolete_msgid_plural str_lines obsolete_pluralizations :
 | 
						|
  {Pluralizations, PluralLineInformation} = split_msgstr('$6'),
 | 
						|
  to_plural_message(
 | 
						|
    [
 | 
						|
      {obsolete, true},
 | 
						|
      {msgid, extract_simple_token('$3')},
 | 
						|
      {msgid_plural, extract_simple_token('$5')},
 | 
						|
      {msgstr, maps:from_list(Pluralizations)}
 | 
						|
      | group_meta('$1')
 | 
						|
    ],
 | 
						|
    [
 | 
						|
      {msgid, extract_line('$2')},
 | 
						|
      {msgid_plural, extract_line('$4')}
 | 
						|
      | PluralLineInformation
 | 
						|
    ]
 | 
						|
  ).
 | 
						|
obsolete_plural_message ->
 | 
						|
  message_meta obsolete_msgctxt str_lines obsolete_msgid str_lines obsolete_msgid_plural str_lines obsolete_pluralizations :
 | 
						|
  {Pluralizations, PluralLineInformation} = split_msgstr('$8'),
 | 
						|
  to_plural_message(
 | 
						|
    [
 | 
						|
      {obsolete, true},
 | 
						|
      {msgctxt, extract_simple_token('$3')},
 | 
						|
      {msgid, extract_simple_token('$5')},
 | 
						|
      {msgid_plural, extract_simple_token('$7')},
 | 
						|
      {msgstr, maps:from_list(Pluralizations)}
 | 
						|
      | group_meta('$1')
 | 
						|
    ],
 | 
						|
    [
 | 
						|
      {msgctx, extract_line('$2')},
 | 
						|
      {msgid, extract_line('$4')},
 | 
						|
      {msgid_plural, extract_line('$6')}
 | 
						|
      | PluralLineInformation
 | 
						|
    ]
 | 
						|
  ).
 | 
						|
 | 
						|
pluralizations ->
 | 
						|
  pluralization : ['$1'].
 | 
						|
pluralizations ->
 | 
						|
  pluralization pluralizations : ['$1'|'$2'].
 | 
						|
 | 
						|
obsolete_pluralizations ->
 | 
						|
  obsolete_pluralization : ['$1'].
 | 
						|
obsolete_pluralizations ->
 | 
						|
  obsolete_pluralization obsolete_pluralizations : ['$1' | '$2'].
 | 
						|
 | 
						|
pluralization ->
 | 
						|
  msgstr plural_form str_lines : {extract_simple_token('$2'), extract_simple_token('$3'), extract_line('$2')}.
 | 
						|
 | 
						|
obsolete_pluralization ->
 | 
						|
  obsolete_msgstr plural_form str_lines : {extract_simple_token('$2'), extract_simple_token('$3'), extract_line('$2')}.
 | 
						|
 | 
						|
message_meta ->
 | 
						|
  '$empty': [].
 | 
						|
message_meta ->
 | 
						|
  comment message_meta : [
 | 
						|
    {comments, extract_simple_token('$1')}
 | 
						|
    | '$2'
 | 
						|
  ].
 | 
						|
message_meta ->
 | 
						|
  previous msgctxt str_lines previous msgid str_lines previous msgid_plural str_lines message_meta : [
 | 
						|
    {previous_messages, to_plural_message(
 | 
						|
      [
 | 
						|
        {msgctxt, extract_simple_token('$3')},
 | 
						|
        {msgid, extract_simple_token('$6')},
 | 
						|
        {msgid_plural, extract_simple_token('$9')}
 | 
						|
      ],
 | 
						|
      [
 | 
						|
        {msgctxt, extract_line('$2')},
 | 
						|
        {msgid, extract_line('$5')},
 | 
						|
        {msgid_plural, extract_line('$8')}
 | 
						|
      ]
 | 
						|
    )} | '$10'
 | 
						|
  ].
 | 
						|
message_meta ->
 | 
						|
  previous msgid str_lines previous msgid_plural str_lines message_meta : [
 | 
						|
    {previous_messages, to_plural_message(
 | 
						|
      [{msgid, extract_simple_token('$3')}, {msgid_plural, extract_simple_token('$6')}],
 | 
						|
      [{msgid, extract_line('$2')}, {msgid_plural, extract_line('$5')}]
 | 
						|
    )} | '$7'
 | 
						|
  ].
 | 
						|
message_meta ->
 | 
						|
  previous msgctxt str_lines previous msgid str_lines message_meta : [
 | 
						|
    {previous_messages, to_singular_message(
 | 
						|
      [{msgctxt, extract_simple_token('$3')}, {msgid, extract_simple_token('$6')}],
 | 
						|
      [{msgctxt, extract_line('$2')}, {msgid, extract_line('$5')}]
 | 
						|
    )} | '$7'
 | 
						|
  ].
 | 
						|
message_meta ->
 | 
						|
  previous msgid str_lines message_meta : [
 | 
						|
    {previous_messages, to_singular_message(
 | 
						|
      [{msgid, extract_simple_token('$3')}],
 | 
						|
      [{msgid, extract_line('$2')}]
 | 
						|
    )} | '$4'
 | 
						|
  ].
 | 
						|
 | 
						|
Erlang code.
 | 
						|
 | 
						|
extract_simple_token({_Token, _Line, Value}) ->
 | 
						|
  Value.
 | 
						|
 | 
						|
extract_line({_Token, Line}) ->
 | 
						|
  Line;
 | 
						|
extract_line({_Token, Line, _Value}) ->
 | 
						|
  Line.
 | 
						|
 | 
						|
to_singular_message(Fields, LineNumbers) ->
 | 
						|
  'Elixir.Kernel':struct(
 | 
						|
    'Elixir.Expo.Message.Singular',
 | 
						|
    Fields ++ [{'__meta__', #{source_line => maps:from_list(LineNumbers)}}]
 | 
						|
  ).
 | 
						|
 | 
						|
to_plural_message(Fields, LineNumbers) ->
 | 
						|
  'Elixir.Kernel':struct(
 | 
						|
    'Elixir.Expo.Message.Plural',
 | 
						|
    Fields ++ [{'__meta__', #{source_line => maps:from_list(LineNumbers)}}]
 | 
						|
  ).
 | 
						|
 | 
						|
split_msgstr(Pluralizations) ->
 | 
						|
  {
 | 
						|
    lists:map(fun({PluralForm, Message, _LineNumber}) -> {PluralForm, Message} end, Pluralizations),
 | 
						|
    lists:map(fun({PluralForm, _Message, LineNumber}) -> {{msgstr, PluralForm}, LineNumber} end, Pluralizations)
 | 
						|
  }.
 | 
						|
 | 
						|
group_meta(MetaFields) ->
 | 
						|
  maps:to_list(
 | 
						|
    % Use maps:groups_from_list when supporting OTP >= 25 exclusively
 | 
						|
    lists:foldr(
 | 
						|
      fun({Key, Value}, Acc) ->
 | 
						|
        maps:update_with(Key, fun(Cur) -> [Value | Cur] end, [Value], Acc)
 | 
						|
      end,
 | 
						|
      #{},
 | 
						|
      MetaFields
 | 
						|
    )
 | 
						|
  ).
 |