@@ -1471,16 +1471,17 @@ private AffixProcessAllomorph LoadFormAffixProcessAllomorph(IMoForm allo, IPhEnv
14711471 case MoMorphTypeTags . kMorphSuffixingInterfix :
14721472 case MoMorphTypeTags . kMorphEnclitic :
14731473 hcAllo . Lhs . Add ( stemPattern ) ;
1474- hcAllo . Lhs . AddRange ( LoadReduplicationPatterns ( contexts . Item1 ) ) ;
1474+ var lhsPatterns = LoadReduplicationPatterns ( contexts . Item1 ) ;
1475+ hcAllo . Lhs . AddRange ( lhsPatterns ) ;
14751476 var suffixNull = new Pattern < Word , ShapeNode > ( "suffixNull" , SuffixNull ( ) ) ;
14761477 suffixNull . Freeze ( ) ;
14771478 hcAllo . Lhs . Add ( suffixNull ) ;
14781479
14791480 hcAllo . Rhs . Add ( new CopyFromInput ( "stem" ) ) ;
1480- hcAllo . Rhs . AddRange ( LoadReduplicationOutputActions ( contexts . Item1 ) ) ;
1481+ hcAllo . Rhs . AddRange ( LoadReduplicationOutputActions ( contexts . Item1 , lhsPatterns , allo ) ) ;
14811482 hcAllo . Rhs . Add ( new CopyFromInput ( "suffixNull" ) ) ;
14821483 hcAllo . Rhs . Add ( new InsertSegments ( Segments ( "+" ) ) ) ;
1483- hcAllo . Rhs . AddRange ( LoadReduplicationOutputActions ( form ) ) ;
1484+ hcAllo . Rhs . AddRange ( LoadReduplicationOutputActions ( form , lhsPatterns , allo ) ) ;
14841485 break ;
14851486
14861487 case MoMorphTypeTags . kMorphPrefix :
@@ -1489,13 +1490,14 @@ private AffixProcessAllomorph LoadFormAffixProcessAllomorph(IMoForm allo, IPhEnv
14891490 var prefixNull = new Pattern < Word , ShapeNode > ( "prefixNull" , PrefixNull ( ) ) ;
14901491 prefixNull . Freeze ( ) ;
14911492 hcAllo . Lhs . Add ( prefixNull ) ;
1492- hcAllo . Lhs . AddRange ( LoadReduplicationPatterns ( contexts . Item2 ) ) ;
1493+ lhsPatterns = LoadReduplicationPatterns ( contexts . Item2 ) ;
1494+ hcAllo . Lhs . AddRange ( lhsPatterns ) ;
14931495 hcAllo . Lhs . Add ( stemPattern ) ;
14941496
1495- hcAllo . Rhs . AddRange ( LoadReduplicationOutputActions ( form ) ) ;
1497+ hcAllo . Rhs . AddRange ( LoadReduplicationOutputActions ( form , lhsPatterns , allo ) ) ;
14961498 hcAllo . Rhs . Add ( new InsertSegments ( Segments ( "+" ) ) ) ;
14971499 hcAllo . Rhs . Add ( new CopyFromInput ( "prefixNull" ) ) ;
1498- hcAllo . Rhs . AddRange ( LoadReduplicationOutputActions ( contexts . Item2 ) ) ;
1500+ hcAllo . Rhs . AddRange ( LoadReduplicationOutputActions ( contexts . Item2 , lhsPatterns , allo ) ) ;
14991501 hcAllo . Rhs . Add ( new CopyFromInput ( "stem" ) ) ;
15001502 break ;
15011503 }
@@ -1611,13 +1613,38 @@ private IEnumerable<Pattern<Word, ShapeNode>> LoadReduplicationPatterns(string p
16111613 }
16121614 }
16131615
1614- private IEnumerable < MorphologicalOutputAction > LoadReduplicationOutputActions ( string patternStr )
1616+ private IEnumerable < MorphologicalOutputAction > LoadReduplicationOutputActions ( string patternStr , IEnumerable < Pattern < Word , ShapeNode > > patterns , IMoForm form )
16151617 {
16161618 foreach ( string token in TokenizeContext ( patternStr ) )
16171619 {
16181620 if ( token . StartsWith ( "[" ) )
16191621 {
1620- yield return new CopyFromInput ( XmlConvert . EncodeName ( token . Substring ( 1 , token . Length - 2 ) . Trim ( ) ) ) ;
1622+ bool isValid = true ;
1623+ if ( token . Contains ( "^" ) )
1624+ {
1625+ // The ^ gets replaced by _x005E_ so we need to do it here to match in patterns
1626+ string indexedToken = token . Substring ( 1 , token . Length - 2 ) . Trim ( ) . Replace ( "^" , "_x005E_" ) ;
1627+ isValid = patterns . Any ( p => p . Name == indexedToken ) ;
1628+ if ( ! isValid )
1629+ {
1630+ // add error message to logger
1631+ string envs = "" ;
1632+ var environments = form . AllomorphEnvironments ;
1633+ if ( environments != null )
1634+ {
1635+ StringBuilder sb = new StringBuilder ( ) ;
1636+ foreach ( IPhEnvironment env in environments )
1637+ {
1638+ sb . Append ( env . ShortName ) ;
1639+ sb . Append ( " " ) ;
1640+ }
1641+ envs = sb . ToString ( ) ;
1642+ }
1643+ m_logger . UnmatchedReduplicationIndexedClass ( form , "Ill-formed index:" + token , envs ) ;
1644+ }
1645+ }
1646+ if ( isValid )
1647+ yield return new CopyFromInput ( XmlConvert . EncodeName ( token . Substring ( 1 , token . Length - 2 ) . Trim ( ) ) ) ;
16211648 }
16221649 else
16231650 {
0 commit comments