corenova / yang-js

YANG parser and composer
Apache License 2.0
56 stars 18 forks source link

Unable to import ietf-ip.yang #129

Closed brchiu closed 3 years ago

brchiu commented 3 years ago

When try to import ietf-ip.yang ietf-ip.yang.txt which is widely utilized thus should be ok.

Yang = require('yang-js')
Yang.import('../ietf-ip.yang')

However, an error occurred during import.

unable to parse '../ORAN-MP-V3/ietf-ip.yang' YANG module from '/home/brchiu/Projects/ORAN-MP-V3/ietf-ip.yang'
/home/brchiu/Projects/learn_yangjs/node_modules/yang-js/lib/node.js:223
          throw e;
          ^

Error [ExpressionError]: [module(ietf-ip)/augment(/if:interfaces/if:interface)/container(ipv4)/list(address)/choice(subnet)] cannot contain more than one non-case shorthand data node
    at Function.error (/home/brchiu/Projects/learn_yangjs/node_modules/yang-js/lib/element.js:74:17)
    at Function.error (/home/brchiu/Projects/learn_yangjs/node_modules/yang-js/lib/expression.js:149:21)
    at Function.resolve (/home/brchiu/Projects/learn_yangjs/node_modules/yang-js/lib/lang/extensions.js:366:22)
    at Function.compile (/home/brchiu/Projects/learn_yangjs/node_modules/yang-js/lib/expression.js:49:17)
    at Function.compile (/home/brchiu/Projects/learn_yangjs/node_modules/yang-js/lib/yang.js:168:22)
    at /home/brchiu/Projects/learn_yangjs/node_modules/yang-js/lib/expression.js:66:20
    at Array.forEach (<anonymous>)
    at Function.compile (/home/brchiu/Projects/learn_yangjs/node_modules/yang-js/lib/expression.js:65:20)
    at Function.compile (/home/brchiu/Projects/learn_yangjs/node_modules/yang-js/lib/yang.js:168:22)
    at /home/brchiu/Projects/learn_yangjs/node_modules/yang-js/lib/expression.js:66:20 {
  uri: 'module(ietf-ip)/augment(/if:interfaces/if:interface)/container(ipv4)/list(address)/choice(subnet)',
  src: <ref *1> [Function: evaluate] Yang {
    mandatory: [Function: evaluate] Yang {
      parent: [Circular *1],
      [Symbol(element:index)]: 0
    },
    description: [Function: evaluate] Yang {
      parent: [Circular *1],
      [Symbol(element:index)]: 1
    },
    leaf: [
      <ref *3> [Function: evaluate] Yang {
        type: <ref *2> [Function: evaluate] Yang {
          range: [Function: evaluate] Yang {
            parent: [Circular *2],
            [Symbol(element:index)]: 0
          },
          parent: [Circular *3],
          [Symbol(element:cache)]: null,
          [Symbol(element:index)]: 0
        },
        description: [Function: evaluate] Yang {
          parent: [Circular *3],
          [Symbol(element:index)]: 1
        },
        parent: [Circular *1],
        [Symbol(element:cache)]: null,
        [Symbol(element:index)]: 2
      },
      <ref *4> [Function: evaluate] Yang {
        'if-feature': [
          [Function: evaluate] Yang {
            parent: [Circular *4],
            [Symbol(element:index)]: 0
          }
        ],
        type: [Function: evaluate] Yang {
          parent: [Circular *4],
          [Symbol(element:index)]: 1
        },
        description: [Function: evaluate] Yang {
          parent: [Circular *4],
          [Symbol(element:index)]: 2
        },
        parent: [Circular *1],
        [Symbol(element:cache)]: null,
        [Symbol(element:index)]: 3
      }
    ],
    parent: <ref *5> [Function: evaluate] Yang {
      key: [Function: evaluate] Yang {
        parent: [Circular *5],
        [Symbol(element:index)]: 0,
        [Symbol(element:cache)]: []
      },
      description: [Function: evaluate] Yang {
        parent: [Circular *5],
        [Symbol(element:index)]: 1,
        [Symbol(element:cache)]: []
      },
      leaf: [
        <ref *6> [Function: evaluate] Yang {
          type: [Function: evaluate] Yang {
            parent: [Circular *6],
            convert: [Function: bound bound bound construct],
            pattern: [Array],
            [Symbol(element:index)]: 0,
            [Symbol(element:cache)]: null
          },
          description: [Function: evaluate] Yang {
            parent: [Circular *6],
            [Symbol(element:index)]: 1,
            [Symbol(element:cache)]: []
          },
          parent: [Circular *5],
          [Symbol(element:cache)]: [ [Yang], [Yang] ],
          [Symbol(element:index)]: 2
        },
        <ref *7> [Function: evaluate] Yang {
          type: [Function: evaluate] Yang {
            parent: [Circular *7],
            [Symbol(element:index)]: 0
          },
          config: [Function: evaluate] Yang {
            parent: [Circular *7],
            [Symbol(element:index)]: 1
          },
          description: [Function: evaluate] Yang {
            parent: [Circular *7],
            [Symbol(element:index)]: 2
          },
          parent: [Circular *5],
          [Symbol(element:cache)]: null,
          [Symbol(element:index)]: 4
        }
      ],
      choice: [ [Circular *1] ],
      parent: <ref *8> [Function: evaluate] Yang {
        presence: [Function: evaluate] Yang {
          parent: [Circular *8],
          [Symbol(element:index)]: 0,
          [Symbol(element:cache)]: []
        },
        description: [Function: evaluate] Yang {
          parent: [Circular *8],
          [Symbol(element:index)]: 1,
          [Symbol(element:cache)]: []
        },
        leaf: [
          [Function: evaluate] Yang {
            type: [Yang],
            default: [Yang],
            description: [Yang],
            parent: [Circular *8],
            [Symbol(element:cache)]: [Array],
            [Symbol(element:index)]: 2
          },
          [Function: evaluate] Yang {
            type: [Yang],
            default: [Yang],
            description: [Yang],
            parent: [Circular *8],
            [Symbol(element:cache)]: [Array],
            [Symbol(element:index)]: 3
          },
          [Function: evaluate] Yang {
            type: [Yang],
            units: [Yang],
            description: [Yang],
            reference: [Yang],
            parent: [Circular *8],
            [Symbol(element:cache)]: [Array],
            [Symbol(element:index)]: 4
          }
        ],
        list: [
          [Circular *5],
          [Function: evaluate] Yang {
            key: [Yang],
            description: [Yang],
            reference: [Yang],
            leaf: [Array],
            parent: [Circular *8],
            [Symbol(element:cache)]: null,
            [Symbol(element:index)]: 6
          }
        ],
        parent: <ref *9> [Function: evaluate] Yang {
          description: [Function: evaluate] Yang {
            parent: [Circular *9],
            [Symbol(element:index)]: 0,
            [Symbol(element:cache)]: []
          },
          container: [ [Circular *8], [Yang] ],
          parent: [Function: evaluate] Yang {
            'yang-version': [Yang],
            namespace: [Yang],
            prefix: [Yang],
            import: [Array],
            organization: [Yang],
            contact: [Yang],
            description: [Yang],
            revision: [Array],
            feature: [Array],
            typedef: [Array],
            augment: [Array],
            [Symbol(element:cache)]: [Array]
          },
          [Symbol(element:cache)]: [ [Yang], [Circular *8], [Yang] ],
          [Symbol(element:index)]: 15
        },
        [Symbol(element:cache)]: [
          [Function: evaluate] Yang {
            parent: [Circular *8],
            [Symbol(element:index)]: 0,
            [Symbol(element:cache)]: []
          },
          [Function: evaluate] Yang {
            parent: [Circular *8],
            [Symbol(element:index)]: 1,
            [Symbol(element:cache)]: []
          },
          [Function: evaluate] Yang {
            type: [Yang],
            default: [Yang],
            description: [Yang],
            parent: [Circular *8],
            [Symbol(element:cache)]: [Array],
            [Symbol(element:index)]: 2
          },
          [Function: evaluate] Yang {
            type: [Yang],
            default: [Yang],
            description: [Yang],
            parent: [Circular *8],
            [Symbol(element:cache)]: [Array],
            [Symbol(element:index)]: 3
          },
          [Function: evaluate] Yang {
            type: [Yang],
            units: [Yang],
            description: [Yang],
            reference: [Yang],
            parent: [Circular *8],
            [Symbol(element:cache)]: [Array],
            [Symbol(element:index)]: 4
          },
          [Circular *5],
          [Function: evaluate] Yang {
            key: [Yang],
            description: [Yang],
            reference: [Yang],
            leaf: [Array],
            parent: [Circular *8],
            [Symbol(element:cache)]: null,
            [Symbol(element:index)]: 6
          }
        ],
        [Symbol(element:index)]: 1
      },
      [Symbol(element:cache)]: [
        [Function: evaluate] Yang {
          parent: [Circular *5],
          [Symbol(element:index)]: 0,
          [Symbol(element:cache)]: []
        },
        [Function: evaluate] Yang {
          parent: [Circular *5],
          [Symbol(element:index)]: 1,
          [Symbol(element:cache)]: []
        },
        <ref *6> [Function: evaluate] Yang {
          type: [Function: evaluate] Yang {
            parent: [Circular *6],
            convert: [Function: bound bound bound construct],
            pattern: [Array],
            [Symbol(element:index)]: 0,
            [Symbol(element:cache)]: null
          },
          description: [Function: evaluate] Yang {
            parent: [Circular *6],
            [Symbol(element:index)]: 1,
            [Symbol(element:cache)]: []
          },
          parent: [Circular *5],
          [Symbol(element:cache)]: [ [Yang], [Yang] ],
          [Symbol(element:index)]: 2
        },
        [Circular *1],
        <ref *7> [Function: evaluate] Yang {
          type: [Function: evaluate] Yang {
            parent: [Circular *7],
            [Symbol(element:index)]: 0
          },
          config: [Function: evaluate] Yang {
            parent: [Circular *7],
            [Symbol(element:index)]: 1
          },
          description: [Function: evaluate] Yang {
            parent: [Circular *7],
            [Symbol(element:index)]: 2
          },
          parent: [Circular *5],
          [Symbol(element:cache)]: null,
          [Symbol(element:index)]: 4
        }
      ],
      [Symbol(element:index)]: 5
    },
    [Symbol(element:cache)]: [
      [Function: evaluate] Yang {
        parent: [Circular *1],
        [Symbol(element:index)]: 0
      },
      [Function: evaluate] Yang {
        parent: [Circular *1],
        [Symbol(element:index)]: 1
      },
      <ref *3> [Function: evaluate] Yang {
        type: <ref *2> [Function: evaluate] Yang {
          range: [Function: evaluate] Yang {
            parent: [Circular *2],
            [Symbol(element:index)]: 0
          },
          parent: [Circular *3],
          [Symbol(element:cache)]: null,
          [Symbol(element:index)]: 0
        },
        description: [Function: evaluate] Yang {
          parent: [Circular *3],
          [Symbol(element:index)]: 1
        },
        parent: [Circular *1],
        [Symbol(element:cache)]: null,
        [Symbol(element:index)]: 2
      },
      <ref *4> [Function: evaluate] Yang {
        'if-feature': [
          [Function: evaluate] Yang {
            parent: [Circular *4],
            [Symbol(element:index)]: 0
          }
        ],
        type: [Function: evaluate] Yang {
          parent: [Circular *4],
          [Symbol(element:index)]: 1
        },
        description: [Function: evaluate] Yang {
          parent: [Circular *4],
          [Symbol(element:index)]: 2
        },
        parent: [Circular *1],
        [Symbol(element:cache)]: null,
        [Symbol(element:index)]: 3
      }
    ],
    [Symbol(element:index)]: 3
  },
  ctx: undefined
}
sekur commented 3 years ago

@brchiu thanks for reporting this issue. I think I may have mis-interpreted the spec below:

Screen Shot 2020-12-16 at 8 02 02 PM

I assumed it meant it can only contain ONE data node statement within the entire choice block but I suppose we can interpret each data node statement without case wrapper as being individual case-wrapped statements. I'll update the evaluator accordingly.

sekur commented 3 years ago

fixed and published as 0.24.45