解析xml DTD文件(Parser for xml DTD file)
我是一个很新的实现解析器,我正在尝试解析一个xml DTD文件,为它生成一个上下文无关语法。 我尝试过pyparsing和yacc,但我仍然能得到任何结果。 所以如果有人可以提供一些技巧或示例代码来编写这样的解析器,我将不胜感激。 以下是DTD文件示例:
<!DOCTYPE PcSpecs [ <!ELEMENT PCS (PC*)> <!ELEMENT PC (MODEL, PRICE, PROCESSOR, RAM, DISK+)> <!ELEMENT MODEL (\#PCDATA)> <!ELEMENT PRICE (\#PCDATA)> <!ELEMENT PROCESSOR (MANF, MODEL, SPEED)> <!ELEMENT MANF (\#PCDATA)> <!ELEMENT MODEL (\#PCDATA)> <!ELEMENT SPEED (\#PCDATA)> <!ELEMENT RAM (\#PCDATA)> <!ELEMENT DISK (HARDDISK | CD | DVD)> <!ELEMENT HARDDISK (MANF, MODEL, SIZE)> <!ELEMENT SIZE (\#PCDATA)> <!ELEMENT CD (SPEED)> <!ELEMENT DVD (SPEED)> ]>
提前致谢。
I am quite new in implementing a parser and I am trying to pars a xml DTD file to generate a context free grammar for it. I tried pyparsing and yacc but still I could get any result. So I would appreciate if some one could provide me some tips or sample code to write such a parser. following is a sample DTD file:
<!DOCTYPE PcSpecs [ <!ELEMENT PCS (PC*)> <!ELEMENT PC (MODEL, PRICE, PROCESSOR, RAM, DISK+)> <!ELEMENT MODEL (\#PCDATA)> <!ELEMENT PRICE (\#PCDATA)> <!ELEMENT PROCESSOR (MANF, MODEL, SPEED)> <!ELEMENT MANF (\#PCDATA)> <!ELEMENT MODEL (\#PCDATA)> <!ELEMENT SPEED (\#PCDATA)> <!ELEMENT RAM (\#PCDATA)> <!ELEMENT DISK (HARDDISK | CD | DVD)> <!ELEMENT HARDDISK (MANF, MODEL, SIZE)> <!ELEMENT SIZE (\#PCDATA)> <!ELEMENT CD (SPEED)> <!ELEMENT DVD (SPEED)> ]>
Thanks in advance.
原文:https://stackoverflow.com/questions/22758752
最满意答案
var methodsArray=[[{mark:Number,content:String}]];
这除了methodsArray[0][0]
没有任何内容。
methodsArray[i][x]
(或者甚至methodsArray[i]
)是undefined
(除了当i===0
和x===0
[除了数组方法,例如,再次例如i===0
和x==="push"
但这是离题)]。如您的测试输出中所示,您的循环访问的内容不是
methodsArray[0][0]
并尝试设置属性。如果你想要,你可以在旅途中创建元素:
var methodsArray = []; for(var i = 0; i < req.body.numOfMethods; i++) { methodsArray.push([]); for(var x = 0; x< numOfParts[i]; x++) { methodsArray.push({ mark: parts[i][x].mark, content: parts[i][x].content }); } }
在创建
methodsArray
时,只需要完成一次。作为另一个说明,我意识到你可能正在编写Typescript(或者Flow?)。 类型注释不使用
=
但是:
所以它需要是var methodsArray:{mark:Number,content:String}[][];
或var methodsArray:Array<Array<{ mark:number, content:string }>>;
。 在Javascript中,var methodsArray=[[{ mark:number, content:string }]];
是一个包含一个元素的Array,一个Array又有一个元素是一个对象,其中属性mark
是Number
构造函数,content
是String
构造函数。
var methodsArray=[[{mark:Number,content:String}]];
this does not have anything exceptmethodsArray[0][0]
.
methodsArray[i][x]
(or evenmethodsArray[i]
) isundefined
(except wheni===0
andx===0
[except again for Array methods, e.g.i===0
andx==="push"
but that's off the point]).As shown in your test output, your loop is accessing something other than
methodsArray[0][0]
and trying to set a property.If you want you can create the elements on the go:
var methodsArray = []; for(var i = 0; i < req.body.numOfMethods; i++) { methodsArray.push([]); for(var x = 0; x< numOfParts[i]; x++) { methodsArray.push({ mark: parts[i][x].mark, content: parts[i][x].content }); } }
This is only to be done once though, when creating
methodsArray
.As another note, i realized you are likely writing Typescript (or maybe Flow?). Type annotations do not use
=
but:
, so it would need to bevar methodsArray:{mark:Number,content:String}[][];
orvar methodsArray:Array<Array<{ mark:number, content:string }>>;
. In Javascript,var methodsArray=[[{ mark:number, content:string }]];
is an Array with one element, an Array with again one element which is an object, where the propertymark
is theNumber
constructor andcontent
is theString
constructor.
相关问答
更多-
我不确定你为什么要使用provide和useClass在这里提供这项服务。 这通常是在您必须自己创建服务的自定义/轻量级实现时完成的(例如,当您将Angular的Router和ActivatedRoute注入为您的控制器的依赖项时)。 但是,对于当前方案,您只需要为已创建的服务引用注入的依赖项。 所以你可以简单地使用providers数组将它提供给你的测试模块,如下所示: beforeEach(async(() => { TestBed.configureTestingModule({ decl ...
-
如果我理解正确,你想要突出显示所有找到的单词,而不只是一个。 在这种情况下, select_range不是要调用的函数,因为它会将选择更改为当前单词,并且GtkTextView选择是单个且连续的。 而是创建一个高亮标记并将其应用于所有搜索。 例如: # create the "highlight" tag (run this only once) textvu.buffer.create_tag("highlight", {background => "yellow"}) # ... later, in ...
-
使用变量mark-active : mark-active is a variable defined in `C source code'. Its value is nil Local in buffer whole-line-or-region.el; global value is nil Automatically becomes buffer-local when set in any fashion. Documentation: Non-nil means the mark and ...
-
我猜你显示的属性是displayChoices分配的一部分,即它是这样的: displayChoices = { ... payment_code: { label: "Payment Code", value: 'payment_code', choices: adminSalesStore.paymentCodes.map((payment_code) => { console.log(payment_code); ...
-
var methodsArray=[[{mark:Number,content:String}]]; 这除了methodsArray[0][0]没有任何内容。 methodsArray[i][x] (或者甚至methodsArray[i] )是undefined (除了当i===0和x===0 [除了数组方法,例如,再次例如i===0和x==="push"但这是离题)]。 如您的测试输出中所示,您的循环访问的内容不是methodsArray[0][0]并尝试设置属性。 如果你想要,你可以在旅途中创建元素: ...
-
AngularJS:TypeError:无法设置undefined的属性(AngularJS: TypeError: Cannot set property of undefined)[2023-02-06]
角度模型未定义,直到您在控制器中定义它或在输入中键入内容 试试这个 $ctrl.updateItem = function (item) { $ctrl.newItem = {action: item.action}; //... angular models undefined until you define it in controller or type something in input try this one $ctrl.updateItem ... -
当你编写一个扩展React.Component的react组件时,你不需要在React.Component之后使用extra () 用这个 export default class SearchList extends Component{ constructor(props){ super(props); } render(){ const { placeholder } = this.props; return( ...
-
NS不在全球范围内,您只能在您的生活范围内定义它。 尝试这个: window.NS = window.NS || {}; if (NS.MODULE === undefined) { NS.MODULE = {}; } NS is not in the global scope, you only define it in the scope of your iife. Try this: window.NS = window.NS || {}; if (NS.MODULE === undef ...
-
文档提供了答案; 不幸的是,这不是一个明确的答案: 一般的reset合同是: 如果方法markSupported返回true ,则: 如果自创建流以来尚未调用方法标记,或者自上次调用标记以来从流中读取的字节数大于最后一次调用时标记的参数,则可能抛出IOException 。 如果未抛出此类IOException ,则将流重置为一种状态,以便从最近的标记调用(或自文件启动以来,如果尚未调用标记)读取的所有字节将重新提供给后续read方法的调用者,后跟任何字节,否则这些字节将是重置调用时的下一个输入数据。 如果 ...
-
“无法阅读财产”与无法获得财产之间的区别?(Difference between “cannot read property” and unable to get propert?)[2020-02-29]
它们意味着同样的事情,它只是不同的措辞。 这意味着你做了类似的事情: console.log(a.X); ...其中a的值undefined : var a = undefined; try { console.log(a.X); } catch (e) { console.error(e.message); } 第一个是Google的JS引擎V8使用的措辞,它用于Chrome,Chromium和NodeJS等: https://github.com/v8/v8/blob/6eba6b4 ...