Modelica Playground报‘Internal error function lexer failed’错误的解决方法
问题:Modelica Playground双摆模型报错
Internal error function lexer failed 我在Modelica Playground中构建双摆模型时,系统提示Internal error function lexer failed错误,不确定是模型本身问题还是平台问题,求修复方法。
我的模型代码:
constant Real speed=0.2; constant Real gravity(unit="m/s2")=9.8 * speed; constant Real length(unit="m")=1; constant Real length2(unit="m")=1; constant Real mass(unit="kg")=1; constant Real mass2(unit="kg")=1; Real angle(unit="rad"); Real momentum(unit="kg m/s"); Real angle2(unit="rad"); Real momentum2(unit="kg m/s"); initial equation angle = 130 * (3.142 / 180); momentum = 0; angle2 = 0; // relative to vertical momentum2 = 0; equation der(angle) = (6/(mass * length^2)) * ((2 * momentum - 3 * cos(angle - angle2) * momentum2)/(16 - 9 * cos(angle - angle2)^2)); der(momentum) = -0.5 * mass * length^2 * (der(angle) * der(angle2) * sin(angle - angle2) + (3 * (gravity / length) * sin(angle))); der(angle2) = (6/(mass2 * length2^2)) * ((8 * momentum2 - 3 * cos(angle - angle2) * momentum)/(16 - 9 * cos(angle - angle2)^2)); der(momentum2) = -0.5 * mass2 * length2^2 * (-der(angle) * der(angle2) * sin(angle - angle2) + (3 * (gravity / length2) * sin(angle2))); //annotation(experiment(StartTime=0,StopTime=200)); // todo find out how this works
修复方案
1. 修正语法解析问题
Lexer错误大多源于语法不符合解析器预期,优先排查以下点:
- 单位字符串空格替换:Modelica要求单位中的空格用下划线替代,比如
momentum(unit="kg m/s")需改为momentum(unit="kg_m/s"),所有带空格的单位都要修正。 - 表达式优先级歧义消除:给
cos(angle - angle2)^2添加外层括号,写成(cos(angle - angle2))^2,避免解析器对运算顺序产生误解。 - 常量计算方式调整:避免在常量定义中直接引用其他常量计算(如
gravity=9.8 * speed),直接赋值计算结果,比如constant Real gravity(unit="m/s2")=1.96;,减少解析器的依赖处理压力。
2. 逐步排查定位问题
- 先注释掉所有方程,仅保留变量定义和初始方程,确认模型能正常解析。再逐步添加方程,定位引发错误的具体语句。
- 暂时移除所有
unit属性,先让模型编译通过,验证逻辑无误后再重新添加单位定义。
3. 平台兼容性处理
如果本地Modelica工具(如OpenModelica、Dymola)能正常运行修正后的代码,说明是Playground平台的解析器问题:
- 清理浏览器缓存后重新粘贴代码,避免旧缓存干扰。
- 用平台自带的示例模型测试,确认平台本身运行正常。
修正后的示例代码
constant Real speed=0.2; constant Real gravity(unit="m/s2")=1.96; constant Real length(unit="m")=1; constant Real length2(unit="m")=1; constant Real mass(unit="kg")=1; constant Real mass2(unit="kg")=1; Real angle(unit="rad"); Real momentum(unit="kg_m/s"); Real angle2(unit="rad"); Real momentum2(unit="kg_m/s"); initial equation angle = 130 * (3.142 / 180); momentum = 0; angle2 = 0; momentum2 = 0; equation der(angle) = (6/(mass * length^2)) * ((2 * momentum - 3 * cos(angle - angle2) * momentum2)/(16 - 9 * (cos(angle - angle2))^2)); der(momentum) = -0.5 * mass * length^2 * (der(angle) * der(angle2) * sin(angle - angle2) + (3 * (gravity / length) * sin(angle))); der(angle2) = (6/(mass2 * length2^2)) * ((8 * momentum2 - 3 * cos(angle - angle2) * momentum)/(16 - 9 * (cos(angle - angle2))^2)); der(momentum2) = -0.5 * mass2 * length2^2 * (-der(angle) * der(angle2) * sin(angle - angle2) + (3 * (gravity / length2) * sin(angle2))); annotation(experiment(StartTime=0, StopTime=200));
内容的提问来源于stack exchange,提问作者AJP
相关产品推荐
相关产品推荐

